2016-05-17 3 views
3

Я пытаюсь получить кнопку пресс событие в C++ win32 с использованием WM_CommandWM_COMMAND кнопка поймать нажмите на C++ win32

HWND hBtn; 
HWND hBtnParent = HWND("UploadVideo"); 
HWND SelectVideoBTN, UploadBTN; 
HWND hWnd; 

HINSTANCE hUpload; 
WNDCLASSEX wcexUpload; 
int nCmdShowUpload = 1; 
using namespace std; 

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    loader::alert("rrr"); 
    switch (message) 
    { 
    case WM_COMMAND: 
     if (LOWORD(wParam) == WORD(SelectVideoBTN)) { 
      loader::alert("hello"); 
     } 
     break; 
    default: 
     return DefWindowProc(hwnd, message, wParam, lParam); 
    } 
    return 0; 
} 

SelectVideoBTN = CreateWindow(
      L"BUTTON", // Predefined class; Unicode assumed 
      L"Select Video's",  // Button text 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 
      10,   // x position 
      460,   // y position 
      100,  // Button width 
      25,  // Button height 
      hWnd,  // Parent window 
      NULL,  // No menu. 
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
      NULL);  // Pointer not needed. 

     UploadBTN = CreateWindow(
      L"BUTTON", // Predefined class; Unicode assumed 
      L"Upload",  // Button text 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 
      390,   // x position 
      460,   // y position 
      100,  // Button width 
      25,  // Button height 
      hWnd,  // Parent window 
      NULL,  // No menu. 
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
      NULL);  // Pointer not needed. 

Я смотрел на этот пример - http://forums.devshed.com/programming-42/create-button-clicked-148407.html - но я совсем не могу получить он работает, он даже не будет звонить CALLBACK WindowProcedure - есть ли кто-нибудь, кто мог бы мне помочь?

Кнопки присутствуют на window я создал, я создать window делая -

WNDCLASSEX vidUploader; 

    vidUploader.cbSize = sizeof(WNDCLASSEX); 

    vidUploader.style = CS_HREDRAW | CS_VREDRAW; 
    vidUploader.lpfnWndProc = WndProc; 
    vidUploader.cbClsExtra = 0; 
    vidUploader.cbWndExtra = 0; 
    vidUploader.hInstance = hUpload; 
    vidUploader.hIcon = LoadIcon(hUpload, MAKEINTRESOURCE(IDI_P2GOVIDEOUPLOADER20)); 
    vidUploader.hCursor = LoadCursor(NULL, IDC_ARROW); 
    vidUploader.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    vidUploader.lpszMenuName = MAKEINTRESOURCE(IDC_P2GOVIDEOUPLOADER20); 
    vidUploader.lpszClassName = (LPCWSTR)(L"UploadVideo"); 
    vidUploader.hIconSm = LoadIcon(wcexUpload.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 

    RegisterClassEx(&vidUploader); 

    hInst = hUpload; // Store instance handle in our global variable 

, а затем создать окно

hWnd = CreateWindow((LPCWSTR)(L"UploadVideo"), (LPCWSTR)(L"Upload Video's"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hUpload, NULL); 
if (!hWnd) 
     { 
      MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL); 

      return 1; 
     } 


    // The parameters to ShowWindow explained: 
    // hWnd: the value returned from CreateWindow 
    // nCmdShow: the fourth parameter from WinMain 
    ShowWindow(hWnd, 
     nCmdShowUpload); 

    UpdateWindow(hWnd); 

ответ

4

дочерние окна (т.е. окна с WS_CHILD стиль окна) идентифицируются уникальным числовым значением, которое часто называют идентификатором управления или идентификатором окна. Например, он передается родительскому лицу, когда он принимает сообщение WM_COMMAND. Однако вы никогда не назначали идентификатор элемента управления кнопкам, и родительское окно не может их идентифицировать. В случае дочернего окна, то HMenu параметр в вызове CreateWindow перегружен нести уникальный идентификатор:

HMenu
Для дочернего окна, HMenu определяет идентификатор дочернего окна , целочисленное значение, используемое элементом управления диалоговым окном для уведомления родителя о событиях. Приложение определяет идентификатор дочернего окна; он должен быть уникальным для всех дочерних окон с одним и тем же родительским окном.

Другими словами, ваше приложение выбирает числовое значение для назначения элементам управления. Так как более низкие идентификаторы используются диспетчером диалога уже (например, IDOK), обычно принято начинать назначать идентификаторы управления, начиная с 100 (см. Why do dialog editors start assigning control IDs with 100?).

В вашем обработчике WM_COMMAND вы можете сравнить LOWORD(wParam) с идентификатором, назначенным кнопкам управления.

Необходимо ввести следующие изменения в свой код.

// Declare control IDs. This is usually done in a file called Resource.h 
#define IDC_SELECT_VIDEO (100) 

Изменить ваше окно Код создания:

SelectVideoBTN = CreateWindow(
      L"BUTTON", // Predefined class; Unicode assumed 
      L"Select Video's",  // Button text 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 
      10,   // x position 
      460,  // y position 
      100,  // Button width 
      25,   // Button height 
      hWnd,  // Parent window 
      (HMENU)IDC_SELECT_VIDEO, // Assign appropriate control ID 
      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
      NULL);  // Pointer not needed. 

Проверить для управления ID в вашем WM_COMMAND обработчика:

switch (message) 
    { 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDC_SELECT_VIDEO) { 
      loader::alert("hello"); 
     } 
     break; 
    default: 
     return DefWindowProc(hwnd, message, wParam, lParam); 
    } 


Если ваша оконная процедура не вызывается вообще, это может означать, что вы не отправляете сообщения в вызывающий поток. Для потока GUI всегда нужен контур сообщения. Стандартный цикл обработки сообщений достаточно:

MSG msg = {0}; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
+0

Я сделал то, что ты сказал, но когда я поставил DLL-файл в программу (я создаю плагин) окно генерируется при загрузке, но когда я нажимаю на кнопках они не работают, я отредактировал мой вопрос – Gerwin

+0

@Gerwin: Пожалуйста, не меняйте вопрос таким образом, чтобы недействительность опубликованного ответа. Я вернул изменения в исходную версию.Если у вас есть новый вопрос, нажмите кнопку [Задать вопрос] (http://stackoverflow.com/questions/ask). Если вы хотите добавить дополнительную информацию, вы также можете [изменить] (http://stackoverflow.com/posts/37271194/edit) свой вопрос, если он не изменит основную проблему. – IInspectable

+0

Хорошо, спасибо за информацию У меня только 1 проблема, я не могу использовать цикл сообщений, потому что это заставило бы программу застревать в цикле и не загружать остальную часть программы, так как я создаю плагин – Gerwin

Смежные вопросы