在c ++ win32中按WM_command catchbutton

我试图用WM_Command来获取c ++ win32中的button事件

 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 – 有没有人可以帮助我?

button出现在我创build的window ,我通过做window来创buildwindow

 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 

然后创build窗口

  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); 

子窗口(即具有WS_CHILD窗口样式的窗口)由唯一的数值标识,通常称为控件ID或窗口标识。 例如,它在收到WM_COMMAND消息时传递给父节点。 但是,您从未将控件ID分配给您的按钮控件,并且父窗口无法识别它们。 在子窗口的情况下, CreateWindow调用中的hMenu参数被重载以携带唯一标识符:

HMENU
对于子窗口, hMenu指定子窗口标识符,一个对话框控件用于通知其父项事件的整数值。 应用程序确定子窗口标识符; 对于具有相同父窗口的所有子窗口,它必须是唯一的。

换句话说,你的应用程序选择一个数值来分配给控件。 由于对话管理器已经使用较低的ID(例如IDOK ),所以通常会开始分配从100开始的控制ID(请参阅对话编辑器为什么开始将控制ID分配为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. 

检查WM_COMMAND处理程序中的控件ID:

  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); }