WinApi Win32编程 – 按钮单击不发送WM_COMMAND消息

我一直在制作一个标签控制程序,并且最近才在StackOverflow上发布了求助信息。 目前该计划运行如下:

  1. winMain开始,创建main_hwnd生成WM_CREATEwndProc
  2. tab_hwnd创建为SysTabControl32
  3. tab0_hwndtab1_hwnd ,…, tab4_hwnd已创建
    • tab0_hwnd ,创建静态文本和按钮
  4. 返回winMain并在main_hwndtab_hwndtab0_hwnd上调用ShowWindow()
  5. 输入循环直到程序关闭。

程序运行时,一切都可见; 但是,按钮无法正常工作。 同时,当我使用GetLastError()FormatMessage()搜索错误时,我发现在创建Windows tab#_hwnd (其中#= 0,1,2,3和4)后,出现以下错误:

错误6:句柄无效

我不确定为什么会出现此错误以及该按钮无效的原因。 另一位用户在上一篇文章中建议了以下内容:

WM_COMMAND被发送到直接父窗口,而不是祖父母,因此您也必须将选项卡控件子类化,或者让您的按钮将主窗口作为父窗口。” – Anton Kovalenko

编辑1:我不确定如何按照Anton Kovalenko的建议对我的选项卡控件进行子类化。 任何指向教程/解释注释的链接都非常有用。

这是当前的代码:

 #define WIN32_LEAN_AND_MEAN #pragma comment(lib, "comctl32.lib") #define ID_FILE_EXIT 101 #define ID_HELP_ABOUT 102 #define ID_B_BLANK 1001 #define ID_B_HOME 1002 #define ID_B_SAVE 1003 #include  #include  #include  #include  #include  HWND main_hwnd, tab_hwnd, tab0_hwnd, tab1_hwnd, tab2_hwnd, tab3_hwnd, tab4_hwnd; HINSTANCE tab_hinst; TCHAR HomePath[MAX_PATH*2], SavePath[MAX_PATH*2]; WNDCLASSEX wc; bool success=FALSE; MSG msg; HWND button; static HWND text; TCITEM tie; int focus = 0, NotifyCase = 0; void ErrorExit(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the error message and exit the process lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); ExitProcess(dw); } // Call with ErrorExit(TEXT("ANYTHINGHERE")); LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_CREATE: { tab_hwnd = CreateWindowEx( 0, "SysTabControl32", "", WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, 681, 338, hwnd, NULL, tab_hinst, NULL); tab0_hwnd = CreateWindowEx( 0, "SysTabControl32", "", WS_CHILD, 1, 22, 679, 315, tab_hwnd, NULL, tab_hinst, NULL); //ErrorExit(TEXT("HERE")); //code) { case TCN_SELCHANGING: switch(TabCtrl_GetCurFocus(tab_hwnd)) { case 0: ShowWindow(tab0_hwnd,SW_HIDE); break; case 1: ShowWindow(tab1_hwnd,SW_HIDE); break; case 2: ShowWindow(tab2_hwnd,SW_HIDE); break; case 3: ShowWindow(tab3_hwnd,SW_HIDE); break; case 4: ShowWindow(tab4_hwnd,SW_HIDE); break; default: return DefWindowProc(hwnd, Msg, wParam, lParam); break; } break; case TCN_SELCHANGE: switch(TabCtrl_GetCurFocus(tab_hwnd)) { case 0: ShowWindow(tab0_hwnd,SW_SHOW); break; case 1: ShowWindow(tab1_hwnd,SW_SHOW); break; case 2: ShowWindow(tab2_hwnd,SW_SHOW); break; case 3: ShowWindow(tab3_hwnd,SW_SHOW); break; case 4: ShowWindow(tab4_hwnd,SW_SHOW); break; default: return DefWindowProc(hwnd, Msg, wParam, lParam); break; } break; default: return DefWindowProc(hwnd, Msg, wParam, lParam); } break; case WM_COMMAND: //MessageBox(tab0_hwnd,"HERE","OKAY",NULL); switch(LOWORD(wParam)) { case ID_FILE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case ID_HELP_ABOUT: return MessageBox(0, "This program is an alteration of ...", "About", MB_OK); case ID_B_HOME: if(BN_CLICKED == HIWORD(wParam)){ MessageBox(tab0_hwnd,"HERE","OKAY",NULL); } break; case ID_B_SAVE: if(BN_CLICKED == HIWORD(wParam)){ } break; case ID_B_BLANK: break; default: return DefWindowProc(hwnd, Msg, wParam, lParam); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, Msg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { InitCommonControls(); tab_hinst = hInstance; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = "Home"; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); main_hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "Home", "The Home page", WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 700, 400, NULL, NULL, hInstance, NULL); if(main_hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(main_hwnd, nCmdShow); ShowWindow(tab_hwnd,SW_SHOW); ShowWindow(tab0_hwnd,SW_SHOW); UpdateWindow(main_hwnd); do{ PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE); TranslateMessage(&msg); DispatchMessage(&msg); } while(msg.message!=WM_CLOSE && msg.message!=WM_QUIT); return msg.wParam; }