1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Win API

Тема в разделе "WASM.BEGINNERS", создана пользователем Mark, 30 дек 2011.

  1. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Вот что-то собрал. Хотел получить простое окно (Win API in C++).
    Точно есть ошибки. Помогите пожалуйста исправить.

    Код (Text):
    1. #include "windows.h"
    2.  
    3. LRESULT __stdcall WndProc(HWND hWnd, UINT message,
    4.                           WPARAM wParam, LPARAM lParam);
    5.  
    6. int APIENTRY WinMain(HINSTANCE hInstance,
    7.             HINSTANCE hPrevInstance,
    8.             LPSTR lpCmdLine,
    9.             int nCmdShow)
    10.  
    11.  
    12. {
    13.  
    14.     WNDCLASS wc;  
    15.  
    16.     wc.style = WS_VISIBLE;    
    17.     wc.lpfnWndProc = WndProc;  
    18.     wc.cbClsExtra = 0;
    19.     wc.cbWndExtra = 0;
    20.     wc.hInstance  = hInstance;
    21.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  
    22.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);  
    23.     wc.hbrBackground = (HBRUSH)(6);          
    24.     wc.lpszMenuName = NULL;            
    25.     wc.lpszClassName = "claass";        
    26.    
    27.    
    28.    
    29.  
    30.  
    31.  
    32.     RegisterClass(&wc);
    33.  
    34.  
    35.  
    36.  
    37.     HWND hWnd = CreateWindow(L"class",L"Zagotovka",
    38.                          WS_OVERLAPPEDWINDOW,
    39.                          150,100,500,400,
    40.                          NULL,NULL,hInstance,NULL);
    41.  
    42.     ShowWindow(hWnd, nCmdShow);
    43.    
    44.     UpdateWindow(hWnd);
    45.  
    46.  
    47.     return 0;
    48. }
     
  2. M0rg0t

    M0rg0t Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    560
    Mark
    А какие есть ошибки? Что говорит компилятор, на какие строки ругается?
     
  3. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    wc.lpfnWndProc = WndProc; процедура обработки где твоя
     
  4. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    Ты только прототип указал. Пиши процедуру обработки обратного вызова. Вместо CALLBACK или APIENTRY пиши __stdacall это станд соглашение о вызовах
     
  5. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    WNDCLASS wc; а в обычной стурктуру что поля для подсчета её размера что нету? Ээээээээ....... Чет не помню, влом на микрософт идти, должна быть полюбасу
     
  6. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Ругается на это
     
  7. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    231
    как ругается?
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Mark, на тебя ругается? Или на код?
     
  9. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    231
    помимо того, что нету реализации WndProc, еще нету цикла обработки событий.
     
  10. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    а зачем лонг тип, это же строка. А где ДиспатчМессад, а где GetMessage TraslateMessage?
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  12. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    ------------------------------------------------------------*/

    #include <windows.h>

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

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT ("HelloWin") ;
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass ;

    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;

    if (!RegisterClass (&wndclass))
    {
    MessageBox (NULL, TEXT ("This program requires Windows NT!"),
    szAppName, MB_ICONERROR) ;
    return 0 ;
    }

    hwnd = CreateWindow (szAppName, // window class name
    TEXT ("The Hello Program"), // window caption
    WS_OVERLAPPEDWINDOW, // window style
    CW_USEDEFAULT, // initial x position
    CW_USEDEFAULT, // initial y position
    CW_USEDEFAULT, // initial x size
    CW_USEDEFAULT, // initial y size
    NULL, // parent window handle
    NULL, // window menu handle
    hInstance, // program instance handle
    NULL) ; // creation parameters

    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    HDC hdc ;
    PAINTSTRUCT ps ;
    RECT rect ;

    switch (message)
    {
    case WM_CREATE:
    PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
    return 0 ;

    case WM_PAINT:
    hdc = BeginPaint (hwnd, &ps) ;

    GetClientRect (hwnd, &rect) ;

    DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;

    EndPaint (hwnd, &ps) ;
    return 0 ;

    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
     
  13. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Ну ето ты загнул :D
     
  14. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
  15. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    Можно так
     
  16. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    #include <windows.h>

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

    int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    char *szAppName = "HelloWin" ;
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass ;

    wndclass.style = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra = 0 ;
    wndclass.cbWndExtra = 0 ;
    wndclass.hInstance = hInstance ;
    wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName = NULL ;
    wndclass.lpszClassName = szAppName ;

    if (!RegisterClass (&wndclass))
    {
    MessageBox (0,0,"Fuck off",0) ;
    return 0 ;
    }

    hwnd = CreateWindow (szAppName, // window class name
    "The Hello Program", // window caption
    WS_OVERLAPPEDWINDOW, // window style
    0, // initial x position
    0, // initial y position
    0, // initial x size
    0, // initial y size
    NULL, // parent window handle
    NULL, // window menu handle
    hInstance, // program instance handle
    NULL) ; // creation parameters

    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {


    switch (message)
    {
    case WM_CREATE:
    MessageBeep(0);
    return 0 ;


    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
     
  17. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    yashechka,
    Это WCHAR..
     
  18. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.484
    Адрес:
    Россия
    ММММмммммм......Я думал лонг.
     
  19. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Вот, наконец собрал программу. Сделал для себя комментарии. Но подскажите, что это за действие где комментарии /* ????? */


    Код (Text):
    1. #include <windows.h>
    2.  
    3. HINSTANCE hInst;      
    4. HWND hwnd;                     /* Переменные */
    5.  
    6. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    7. {
    8.     switch (msg)        /* Обработчик событий*/
    9.     {
    10.     case WM_DESTROY:            /* Если сообщ. О выходе */
    11.           PostQuitMessage(0);         /* ВЫХОДИМ */
    12.           break;                    
    13.  
    14.     default:
    15.           return DefWindowProc(hwnd,msg,wParam,lParam);   /*  ?????  */  
    16.     }
    17.    
    18. return 0;
    19. }
    20.  
    21. BOOL InitClass(void)                
    22. {
    23.      WNDCLASS wc;                      /* Структура */
    24.      memset(&wc,0,sizeof(WNDCLASS)); /* Выделяем байты по размеру WNDCLASS */
    25.      wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;     /*СТИЛЬ */
    26.      wc.lpfnWndProc = (WNDPROC)WndProc;           /* Процедура*/
    27.      wc.hInstance = hInst;                    /*   ?????   */
    28.      wc.hbrBackground = (HBRUSH)(30);     /* ФОН */
    29.      wc.lpszClassName = "WndClass";                  /* ИМЯ КЛАССА */
    30.      wc.hCursor = LoadCursor(NULL,IDC_ARROW);         /* Курсор */
    31.      wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);        /* Иконка */
    32.  
    33.      if (!RegisterClass(&wc)) return 0;            /* Если ошибка сохраняем 0 */
    34.      return 1;
    35. }
    36.  
    37. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
    38. {
    39.     MSG msg;    /* Переменная для хранения событий */
    40.     hInst = hInstance;       /* ???? */
    41.    
    42.     if (!InitClass())                                           /* Если ошибка - выходим. */
    43.     {
    44.           MessageBox(NULL, "Error", "Niiauaiea", 0);  /* Сообщение об ошибке */
    45.           return 0;            /* ВЫХОД */
    46.     }
    47.    
    48.     hwnd = CreateWindow("WndClass","ПРОГА WinAPI.",   /* Окно */
    49.     WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|      /* Параметры */
    50.     WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,
    51.     CW_USEDEFAULT,0,CW_USEDEFAULT,0,
    52.     NULL,          /* ???? */
    53.     NULL,            /* ???? */
    54.     hInst,         /* ???? */
    55.     NULL);            /* ???? */
    56.     ShowWindow(hwnd, SW_SHOW);                     /* Показываем окно */
    57.  
    58.    while (GetMessage(&msg,NULL,0,0))     /*???? */
    59.    {
    60.        TranslateMessage(&msg);        /* ???? */
    61.        DispatchMessage(&msg);               /* ???? */
    62.    }
    63.  
    64.    return msg.wParam;            /* ???? */
    65. }
     
  20. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Да кстати, нашел:
    Как вывести сообщение если пользователь нажал правую кнопку мыши? Пробовал так: