Win API

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

  1. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Ну и в чем проблема?
     
  2. Mark

    Mark Марк

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

    Как приписать ей действие, чтобы на это действие НЕ откликалось текстовое поле. А то действие приписал, а на нее edit control откликается ((
     
  3. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Код в студию, кули..
     
  4. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Код (Text):
    1. #include <windows.h>
    2.  
    3.  
    4. HINSTANCE hInst;
    5. HWND hwnd;
    6.  
    7. DWORD dwBytesWritten;
    8. int EditCtrlID = 12;
    9.  
    10. HWND button;
    11.  
    12.  
    13. #define ID_BUTTON1 1000
    14.  
    15.  
    16. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam)    
    17. {
    18.      switch (msg)
    19.      {
    20.         case WM_DESTROY:          // От ОС поступило сообщение о выходе
    21.             PostQuitMessage(0);
    22.             break;
    23.          
    24.  
    25.         case INVALID_HANDLE_VALUE:
    26.             MessageBeep(0);
    27.             break;
    28.  
    29.         case WM_COMMAND:
    30.      
    31.    switch(LOWORD(wParam))
    32.       {
    33.        case ID_BUTTON1:
    34.            
    35.  
    36.            MessageBeep(1);
    37.  
    38.                     char st[1000] = {"\0"};
    39.  
    40.                     GetDlgItemTextA(
    41.                                     hwnd,    
    42.                                     EditCtrlID,          // идентификатор элемента управления
    43.                                     st,                    // адрес буфера для текста
    44.                                     ARRAYSIZE(st)    // максимальная длина строки
    45.                                     );
    46.  
    47.                     char f[] = {"Name.txt\0"};
    48.  
    49.                     HANDLE hFile = CreateFileA(
    50.                                                 f,
    51.                                                 GENERIC_READ | GENERIC_WRITE,
    52.                                                 FILE_SHARE_READ | FILE_SHARE_WRITE,
    53.                                                 NULL,
    54.                                                 CREATE_NEW,
    55.                                                 FILE_ATTRIBUTE_NORMAL,
    56.                                                 NULL
    57.                                                 );
    58.  
    59.                     WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL);
    60.  
    61.            
    62.       }
    63.  
    64.    
    65.    switch (msg)
    66.    {
    67.         default:
    68.             return DefWindowProc(hwnd,msg,wParam,lParam);  
    69.     }
    70.  
    71.  
    72.  return 0;
    73. }
    74.  
    75.  
    76.  
    77.  
    78. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)            
    79. {
    80.    WNDCLASS wc;  
    81.  
    82.      memset(&wc,0,sizeof(WNDCLASS));    
    83.      wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    84.      wc.lpfnWndProc = (WNDPROC)WndProc;        
    85.      wc.hInstance = hInst;                
    86.      wc.hbrBackground = (HBRUSH)(0);
    87.      wc.lpszClassName = L"WndClass";      
    88.      wc.hCursor = LoadCursor(NULL, IDC_ARROW);  
    89.      wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION);
    90.      
    91.      
    92.     if (!RegisterClass(&wc)) return 0;  
    93.    
    94.     MSG msg;              
    95.     hInst = hInstance;
    96.  
    97.  
    98.     hwnd = CreateWindow(L"WndClass",L"Click",        
    99.     WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|      
    100.     WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,  
    101.     CW_USEDEFAULT, CW_USEDEFAULT,502,502,0,
    102.     0,        
    103.     0,          
    104.     hInst,        
    105.     NULL);  
    106.  
    107.    
    108.     ShowWindow(hwnd, SW_SHOW);  
    109.  
    110.     UpdateWindow(hwnd);
    111.  
    112.    
    113.    
    114.     hwnd = CreateWindow( L"edit", L"\n\n\nВаши заметки: ",
    115.                        WS_VISIBLE | WS_CHILD | WS_HSCROLL |WS_VSCROLL|ES_NOHIDESEL|ES_MULTILINE|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE|ES_LEFT,
    116.                        0,
    117.                        0,
    118.                        300,
    119.                        500,
    120.                        hwnd,
    121.                        (HMENU) EditCtrlID,
    122.                        hInstance,
    123.                        NULL);
    124.                        
    125.    
    126.  
    127.    
    128.  
    129.     HWND hwndCommandLink = CreateWindow(
    130.                                         L"BUTTON",  // Class; Unicode assumed.
    131.                                         L"Кнопка",        // Text will be defined later.
    132.                                         WS_TABSTOP | WS_VISIBLE | WS_CHILD,  // Styles.
    133.                                         10,         // x position.
    134.                                         10,         // y position.
    135.                                         100,        // Button width.
    136.                                         28,        // Button height.
    137.                                         hwnd,       // Parent window.
    138.                                         (HMENU)ID_BUTTON1,      
    139.                                         (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
    140.                                         NULL);      // Pointer not needed.
    141.  
    142.    
    143.  
    144.  
    145.     while (GetMessage(&msg,NULL,0,0))
    146.     {
    147.     TranslateMessage(&msg);
    148.     DispatchMessage(&msg);
    149.     }
    150.  
    151.     return msg.wParam;
    152. }
     
  5. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Что это такое?
     
  6. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Стандартный обработчик событий


    Ошибка при удалении файла. Забыл убрать.
     
  7. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Код (Text):
    1.             (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE)
    WTF?
     
  8. Mark

    Mark Марк

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

    На MDSN пример создания кнопки.
     
  9. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Так что? Как приписать действие кнопке, чтоб на нее не реагировало текстовое поле?
     
  10. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Mark, вот здесь всё довольно доходчиво расписано.
    В простейшем случае, можно внутри WM_COMMAND организовать switch case по LParam (т.е. хендлу окна, которое этот WM_COMMAND нам запостило).
     
  11. Mark

    Mark Марк

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

    Вот код. Студия ругается.


    Код (Text):
    1. #include <windows.h>
    2.  
    3. HINSTANCE hInst;
    4. HWND hWnd;
    5.  
    6. DWORD dwBytesWritten;
    7.  
    8. const int EditCtrlID = 12;
    9.  
    10. HWND button;
    11.  
    12. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    13.  
    14. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    15. {               <---------- Функция не может быть перегружена.
    16.  
    17. MSG msg;
    18.  
    19.  
    20. WNDCLASS wc;
    21. wc.style = 0;
    22. wc.lpfnWndProc = (WNDPROC)WndProc;
    23. wc.cbClsExtra = 0;
    24. wc.cbWndExtra = 0;
    25. wc.hInstance = hInstance;
    26. wc.hbrBackground = (HBRUSH)(0);
    27. wc.lpszClassName = L"WndClass";      
    28. wc.hCursor = LoadCursor(NULL, IDC_ARROW);  
    29. wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION);
    30.  
    31. if(!RegisterClass(&wc)) return 0;
    32.  
    33. if(!hWnd)return 0;
    34.  
    35. hWnd = CreateWindow(L"WndClass",L"Click",        
    36.     WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|      
    37.     WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,  
    38.     CW_USEDEFAULT, CW_USEDEFAULT,502,502,0,
    39.     0,        
    40.     0,          
    41.     hInstance,        
    42.     NULL);  
    43.  
    44.  
    45.  
    46. hWnd = CreateWindow(L"edit", L"\n\n\nÂàøè çàìåòêè: ",
    47.                        WS_VISIBLE | WS_CHILD | WS_HSCROLL |WS_VSCROLL|ES_NOHIDESEL|ES_MULTILINE|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE|ES_LEFT,
    48.                        0,
    49.                        0,
    50.                        300,
    51.                        500,
    52.                        hWnd,
    53.                        NULL,
    54.                        hInstance,
    55.                        NULL);
    56.                        
    57. HWND hWnd_button = CreateWindow(
    58.                 L"button",
    59.                 L"Press me",
    60.                 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    61.                 10,
    62.                 10,
    63.                 80,
    64.                 30,
    65.                 hWnd,
    66.                 (HMENU)10000,
    67.                 hInstance,
    68.                 NULL);
    69.  
    70.  
    71.  
    72. ShowWindow(hWnd, nCmdShow);
    73.  
    74. UpdateWindow(hWnd);
    75.  
    76.  
    77. while(GetMessage(&msg, NULL,0 ,0))
    78. {
    79. TranslateMessage(&msg);
    80. DispatchMessage(&msg);
    81. }
    82. return 0;
    83. };
    84.  
    85.  
    86.  
    87. LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
    88. WPARAM wParam, LPARAM lParam)
    89. {
    90. switch(message)
    91. {
    92. case WM_CREATE:
    93. break;
    94.  
    95. case WM_DESTROY:
    96. PostQuitMessage(0);
    97. break;
    98.  
    99. case WM_PAINT:
    100. break;
    101.  
    102. case WM_COMMAND:
    103.         if(LOWORD(wParam)==10000)
    104.         {
    105.             MessageBeep(1);
    106.  
    107.                     char st[1000] = {"\0"};
    108.  
    109.                     GetDlgItemTextA(
    110.                                     hWnd,    
    111.                                     EditCtrlID,        
    112.                                     st,                  
    113.                                     ARRAYSIZE(st)  
    114.                                     );
    115.  
    116.                     char f[] = {"Name.txt\0"};
    117.  
    118.                     HANDLE hFile = CreateFileA(
    119.                                                 f,
    120.                                                 GENERIC_READ | GENERIC_WRITE,
    121.                                                 FILE_SHARE_READ | FILE_SHARE_WRITE,
    122.                                                 NULL,
    123.                                                 CREATE_NEW,
    124.                                                 FILE_ATTRIBUTE_NORMAL,
    125.                                                 NULL
    126.                                                 );
    127.  
    128.                     WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL);
    129.         }
    130. default:
    131. return DefWindowProc(hWnd, message, wParam, lParam);
    132. }
    133. return 0;
    134. }
    .....
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    { <---------- Функция не может быть перегружена.

    ......
     
  12. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Тьфу, бред. Не то. вот:

    (Проблема та же. Функция не может быть перегружена. Ругается VS

    Код (Text):
    1. #include <windows.h>
    2.  
    3. DWORD dwBytesWritten;
    4.  
    5. const int EditCtrlID = 12;
    6.  
    7. MSG msg;
    8.  
    9. HWND button;
    10.  
    11. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    12.  
    13.            
    14.  
    15. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    16. {
    17.     switch(message)
    18.     {
    19.     case WM_CREATE:
    20.         break;
    21.  
    22.     case WM_DESTROY:
    23.  
    24.         PostQuitMessage(0);
    25.         break;
    26.  
    27.     case WM_PAINT:
    28.         break;
    29.  
    30.     case WM_COMMAND:
    31.  
    32.         if(LOWORD(wParam)==10000)
    33.         {
    34.             MessageBeep(1);
    35.  
    36.             char st[1000] = {""};
    37.  
    38.             GetDlgItemTextA(
    39.                             hWnd,    
    40.                             EditCtrlID,        
    41.                             st,                  
    42.                             ARRAYSIZE(st)  
    43.                             );
    44.  
    45.             char f[] = {"Name.txt\0"};
    46.  
    47.             HANDLE hFile = CreateFileA(
    48.                                         f,
    49.                                         GENERIC_READ | GENERIC_WRITE,
    50.                                         FILE_SHARE_READ | FILE_SHARE_WRITE,
    51.                                         NULL,
    52.                                         CREATE_NEW,
    53.                                         FILE_ATTRIBUTE_NORMAL,
    54.                                         NULL
    55.                                         );
    56.  
    57.             WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL);
    58.         }
    59.  
    60.         default:
    61.             return DefWindowProc(hWnd, message, wParam, lParam);
    62.     }
    63.  
    64.  
    65. return 0;
    66. }
    67.  
    68.  
    69.  
    70. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, INT nCmdShow)
    71. {                                                       < ----------------------Вот тут. Функция не может быть перегружена
    72.     wchar_t cname[] = L"Class";
    73.     wchar_t title[] = L"Заметки. Ver 1.0 Beta";
    74.  
    75.    
    76.  
    77.  
    78.     WNDCLASS wc;
    79.  
    80.     wc.style = 0;
    81.     wc.lpfnWndProc = (WNDPROC)WndProc;
    82.     wc.cbClsExtra = 0;
    83.     wc.cbWndExtra = 0;
    84.     wc.hInstance = hInstance;
    85.     wc.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
    86.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    87.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    88.     wc.lpszMenuName = 0;
    89.     wc.lpszClassName = cname;
    90.  
    91.     if(!RegisterClass(&wc)) return 0;
    92.  
    93.     HWND hWnd = CreateWindow(
    94.                             cname,
    95.                             title,
    96.                              WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,  
    97.                             0,
    98.                             0,
    99.                             500,
    100.                             300,
    101.                             NULL,
    102.                             NULL,
    103.                             hInstance,
    104.                             NULL
    105.                             );
    106.  
    107.     if(!hWnd)return 0;
    108.  
    109.     HWND hWnd_button = CreateWindow(
    110.                                     L"button",
    111.                                     L"Press me",
    112.                                     WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    113.                                     0,
    114.                                     0,
    115.                                     80,
    116.                                     30,
    117.                                     hWnd,
    118.                                     (HMENU)10000,
    119.                                     hInstance,
    120.                                     NULL
    121.                                     );
    122.  
    123.     ShowWindow(hWnd, nCmdShow);
    124.  
    125.     UpdateWindow(hWnd);
    126.  
    127.     hWnd = CreateWindow(L"edit", L"\n\n\nВаши заметки: ",
    128.                            WS_VISIBLE | WS_CHILD | WS_HSCROLL |WS_VSCROLL|ES_NOHIDESEL|ES_MULTILINE|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE|ES_LEFT,
    129.                            0,
    130.                            0,
    131.                            300,
    132.                            500,
    133.                            hWnd,
    134.                            NULL,
    135.                            hInstance,
    136.                            NULL);
    137.                        
    138.     ShowWindow(hWnd, nCmdShow);
    139.  
    140.     UpdateWindow(hWnd);
    141.  
    142.  
    143.  
    144.  
    145.     while(GetMessage(&msg, NULL,0 ,0))
    146.     {
    147.         TranslateMessage(&msg);
    148.         DispatchMessage(&msg);
    149.     }
    150.  
    151. return 0;
    152. }
     
  13. AsmGuru62

    AsmGuru62 Member

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

    А также, пустой WM_PAINT делать нельзя.
    Код (Text):
    1. case WM_PAINT: return DefWindowProc (...);
     
  14. Mark

    Mark Марк

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

    Спасибо)
     
  15. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Еще. Вот процедура взятия текста из edit control и сохранение в строке. Потом создается файл, и пишется в него строка. Результат: Файл создается. Текст берется и пишется. Когда открываю - в файле бред ((


    Код (Text):
    1. char st[10];
    2.  
    3.             GetDlgItemTextA(
    4.                             hwnd,    
    5.                             EditCtrlID,        
    6.                             st,                  
    7.                             ARRAYSIZE(st)  
    8.                             );
    9.  
    10.             char f[] = {"Name.txt"};
    11.  
    12.             HANDLE hFile = CreateFileA(
    13.                                         f,
    14.                                         GENERIC_READ | GENERIC_WRITE,
    15.                                         FILE_SHARE_READ | FILE_SHARE_WRITE,
    16.                                         NULL,
    17.                                         CREATE_NEW,
    18.                                         FILE_ATTRIBUTE_NORMAL,
    19.                                         NULL
    20.                                         );
    21.  
    22.             WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL);
     
  16. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Пробовал char, wchar_t ничего не изменяется. Брал текст из кнопки - берет. Из текстового поля нет - одни крокозябры ((
     
  17. Mark

    Mark Марк

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

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Марк, ты ведь используешь Студию?
    Поставь точку останова на это место:
    Код (Text):
    1. WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL);
    и посмотри что в строке 'st'.
    Возможно, что GetDlgItemTextA() не работает.
    Две причины для этого:

    1. hwnd не тот что имеет текстовое поле.
    2. ID текстового поля не такой какой ты создал.
     
  19. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Вот процедура создания файла, взятия текста и сохранения в файле:

    Код (Text):
    1. char message[100] = {" Туц "};
    2.  
    3.            
    4.  
    5.             GetDlgItemTextA(
    6.                             hWnd,    
    7.                             EditCtrlID,        
    8.                             message,                  
    9.                             ARRAYSIZE(message)  
    10.                             );
    11.  
    12.             char f[] = {"Name.txt"};
    13.  
    14.             HANDLE hFile = CreateFileA(
    15.                                         f,
    16.                                         GENERIC_READ | GENERIC_WRITE,
    17.                                         FILE_SHARE_READ | FILE_SHARE_WRITE,
    18.                                         NULL,
    19.                                         CREATE_NEW,
    20.                                         FILE_ATTRIBUTE_NORMAL,
    21.                                         NULL
    22.                                         );
    23.  
    24.             WriteFile(hFile, message, ARRAYSIZE(message), &dwBytesWritten, NULL);
    Вот текстовое поле:

     
  20. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Марк, ты не умеешь пользоваться отладчиком?