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

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

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

    iktomy Гость

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

    admin Well-Known Member

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

    iktomy Гость

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

    iktomy Гость

    Репутация:
    0
    Здравствуйте господа!
    Решил вот поучиться на 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 Гость

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

    Guest Гость

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

    Guest_SeriousMan Гость

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

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

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

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

    Код:
    #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 Гость

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

    SeriousMan Гость

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

    iktomy Гость

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

    Pete Гость

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

    Slayer Гость

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

    Guest Гость

    Репутация:
    0
    :D
     
  14. iktomy

    iktomy Гость

    Репутация:
    0
    Вообще то можно было тему свою создать.
    Но поскольку я сегодня добрый (послезавтра День Варенья) то привожу цитату (сайт Исходники.ру:
    Каждый символ сонсольного приложения имеет свои аттрибуты, и 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. Гость

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

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

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