Хочу учиться!!!

Тема в разделе "MS Visual C++", создана пользователем iktomy, 15 сен 2004.

Статус темы:
Закрыта.
  1. iktomy

    iktomy Гость

    Очень долго я пользовался MFC при написании прог. Ничего не скажу, нормальная штука, как бы там ее не хаяли отдельные товарищи. Но вот захотелось мне роста над собой. И приходится просить совета: какие книги наиболее полно и подробно описывают WinAPI. Я скачал Петзольда, докачиваю Румянцева. У Петзольда (по крайней мере в той книге, что я скачал) все уже порядком устарело. Он под Вынь'95 пишет. А мне нужно под 2к\ХР или 98\Ме. Конечно научиться можно, но стоит ли заниматься такой дурью, как читать одно а кодить совсем другое. Может у Румянцева рулез, посмотрим. Но всетаки посаветуйте и кинте линки. Заранее сенкс.
     
  2. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    iktomy
    у меня есть по Win API доки и книги.
    а так не знаю. вроде из моих знакомых все на .NET перешли и как-то активно не юзают API.
     
  3. iktomy

    iktomy Гость

    Дык это, скинь плиз на мыло доков: iktomy(dog symbol)tut.by
     
  4. iktomy

    iktomy Гость

    Здравствуйте господа!
    Решил вот поучиться на WinAPI писать, накачал умных статей и книг и облом в первой же программе. Вроде все как надо, но окно не создается. Выскакивает сообщение об ошибке (хоть это работает :) ). Ниже привожу исходник и прошу помощи и дельных советов.
    З.Ы. Товарищей, которые поспешат сказать лишь то, какой я тупой и т.п. прошу не откликаться.

    #include <windows.h>

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT wMsg,
    WPARAM wParam, LPARAM lParam);

    HINSTANCE hinst;
    HWND hwndMain;

    LRESULT CALLBACK WindowProc(HWND hWnd,
    UINT wMsg,
    WPARAM wParam,
    LPARAM lParam)
    {
    switch( wMsg )
    {
    case WM_KEYDOWN:
    {
    switch( wParam )
    {
    case VK_ESCAPE:
    PostQuitMessage(0);
    break;
    }
    }
    break;

    case WM_CLOSE:
    {
    PostQuitMessage(0);
    }

    case WM_DESTROY:
    {
    PostQuitMessage(0);
    }
    break;

    default:
    {
    return DefWindowProc( hWnd, wMsg, wParam, lParam );
    }
    break;
    }

    return 0;
    }

    int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nShowCmd)
    {
    MSG msg;
    long bRet;
    WNDCLASSEX wc;
    UNREFERENCED_PARAMETER(lpCmdLine);

    if (!hPrevInstance)
    {
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "MainClass";
    wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wc)) return FALSE;
    }

    hinst = hInstance;
    hwndMain = CreateWindow("Main Class", "Test",
    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
    0, 0, hinst, 0);
    if(!hwndMain)
    {
    MessageBox(0, "Error создания окна!", "Мазафака...", MB_OK);
    return 0;
    }

    ShowWindow(hwndMain, nShowCmd);
    UpdateWindow(hwndMain);

    while ((bRet = GetMessage(&msg, (HWND) NULL,0,0)) != 0 && bRet != -1)
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    UnregisterClass( "MainClass", wc.hInstance );
    return (int) msg.wParam;
    }
     
  5. bugger

    bugger Гость

    если бы ты давно пользовался MFC, то давно бы уже убедился в том, что в большом количестве случаев классы MFC - это просто обертка над API.
     
  6. Guest

    Guest Гость

    Извините, но MFC я пользуюсь действительно давно. А насчет обвертки скажу только то, что слишком уж она шикарная (имеется ввиду размер выходного файла)
     
  7. Guest_SeriousMan

    Guest_SeriousMan Гость

    Мдя... Твой код вызвал у меня рвотный рефлекс. :)

    Твоя трабла в том, что "MainClass" и "Main Class" - это разные имена.

    И вообще, извини, конечно, за грубость, но с ТАКИМ кривым кодом тебе никакая более-менее оплачиваемая работа не светит.

    Вот это ещё более-менее, хотя тоже есть масса недостатков, но то, что я увидел сейчас, вообще не следовало показывать.

    Код (Text):
    #include <windows.h>

    HWND hwnd=NULL;
    HINSTANCE   hInstance;
    BOOL done=FALSE;

    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    MSG msg;
    WNDCLASS wc;

    hInstance=GetModuleHandle(NULL);
    wc.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc=(WNDPROC) WndProc;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;
    wc.hInstance=hInstance;
    wc.hIcon=LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor=LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName=NULL;
    wc.lpszClassName="Class";

    RegisterClass(&wc);

    hwnd=CreateWindowEx
    (WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,
    "Class",
    "Программа",
    WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL,
    hInstance,
    NULL);

    ShowWindow(hwnd,SW_SHOW);

    while(!done)
    {
    GetMessage(&msg, hwnd, 0, 0);
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }

    LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    switch (uMsg)
    {
    case WM_CLOSE:
    if(MessageBox(hWnd, "Завершить работу программы?", "Выйти?", MB_YESNO)==IDNO)
     break;
    case WM_DESTROY:
    PostQuitMessage(0);
    done=TRUE;
    break;
    default:
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    }
     
  8. iktomy

    iktomy Гость

    Да ладно, я не из обидчивых. Проблему насчет "Main Class"/"MainClass" я уже давно решил, но все равно сенкью. Я нассчет показывать-непоказывать - на то он и форум, что бы помогать начинающим, да и вообще всем.
    И все таки хотелось бы услышать от "отцов" - какую литературу почитать? А то все никак и никто.
     
  9. SeriousMan

    SeriousMan Гость

    Я изучал WinApi на сайте WASM.RU. Мой совет: сначала выполни упражнения на ассемблере, а уж потом перенеси на C++. Тогда впоследствии намного легче будет.
     
  10. iktomy

    iktomy Гость

    Ну тут я соглашусь наверное. Буквально вчера взял полистать книжицу Юрова. Да WinAPI в асме даже немного более понятнее. Т.ч. совет дельный - приму как руководство к действию.
     
  11. Pete

    Pete Гость

    Извините, ничего личного, но фигней вы страдаете - на асме winapi кодить, вы бы еще в машинных кодах писали. Лучше бы потратили больше времени на более интересные вещи. Курсе на первом-втором, я тоже всякой подобной ерундой маялся, о чем жалею. Лучше бы книжки про RUP почитали, куда как более полезнее. IMHO.
     
  12. Slayer

    Slayer Гость

    Люди помогите как на Visual C++ под консоль очищать экран (cls) и выводить текст цветом :huh:
     
  13. Guest

    Guest Гость

    :D
     
  14. iktomy

    iktomy Гость

    Вообще то можно было тему свою создать.
    Но поскольку я сегодня добрый (послезавтра День Варенья) то привожу цитату (сайт Исходники.ру:
    Каждый символ сонсольного приложения имеет свои аттрибуты, и Win32 консольные функции могут работать с аттрибутами двумя способами. SetConsoleTextAttribute() работает с символами, записанными в буфере, в то время как FillConsoleOutputAttribute() напрямую изменяет атрибуты символов.

    Следующие функции можно использовать для нормального, жирного и обратного текста (предполагается, что класс имеет обработчик консоли через вызов GetStdHandle()):

    void CMyConsoleClass::SetTextNormal()
    {
    // белым на чёрном - по умолчанию
    SetConsoleTextAttribute ( m_hConsole,
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
    }

    void CMyConsoleClass::SetTextBold()
    {
    // ярко-белым на чёрном
    SetConsoleTextAttribute ( m_hConsole,
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE |
    FOREGROUND_INTENSITY );
    }

    void CMyConsoleClass::SetTextReverse()
    {
    // чёрным на белом
    SetConsoleTextAttribute ( m_hConsole,
    BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE );
    }

    Обратите внимание, что нет никаких установок для мерцания и подчёркивания, так что Вам прийдётся проявить немного изобратательности, если Вы хотите полностью съэмулировать текстовые режимы ANSI или VT100 данным методом.
     
  15. Гость

    Тебе нужно под 2к\ХР или 98\Ме?
    Что же тебе такое нужно, если ты не зная АПИ хочешь писать под ХР?
    Побщем сначала Петзольд и Рихтер...потом сам поймешь что хорошо, а что плохо...

    Глупо честно говоря писать на МФЦ не имея представления об АПИ...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей