#include <Windows.h>#include <Windowsx.h>#include "resource.h"#ifdef _UNICODE#if defined _M_IX86#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")#elif defined _M_X64#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")#else#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")#endif#endif// 保存以前的按钮回调函数,为了将消息传递回去WNDPROC OldButtonProc = nullptr;// 新的按钮窗口回调函数,用于处理按钮的消息INT_PTR CALLBACK ButtonProc(HWND hButton, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { // 按钮控件的点击事件实际上就是 WM_LBUTTONDOWN+UP case WM_LBUTTONUP: { MessageBox(hButton, L"WM_LBUTTONUP", L"控件", MB_OK); SetWindowLong(hButton, GWL_WNDPROC, (LONG)OldButtonProc); // 模拟消息的打包发送给父窗口,但是容易崩溃 // SendMessage(GetParent(hButton), WM_COMMAND, MAKEWPARAM(IDC_BUTTON1, BM_CLICK), (LPARAM)hButton); break; } } // 将所有的按钮操作,都交还给原始的按钮回调函数来完成 return OldButtonProc(hButton, uMsg, wParam, lParam);}// 对话框的回调函数,消息处理了返回 TRUE,没有处理返回 FALSEINT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { // 当用户点击了关闭按钮时产生的消息,对话框要求必须使用 EndDialog 退出 case WM_CLOSE: { EndDialog(hDlg, 0); break; } // 对于标准控件,例如按钮,应该使用 WM_COMMAND 进行响应 case WM_COMMAND: { if (LOWORD(wParam) == IDC_BUTTON1) { MessageBox(hDlg, L"WM_COMMAND", L"父窗口", MB_OK); // 如果按钮被点击了,我们将按钮的回调函数修改成自己的函数,返回修改前的内容 OldButtonProc = (WNDPROC)SetWindowLong((HWND)lParam, GWL_WNDPROC, (LONG)ButtonProc); } break; } default: { return FALSE; } } return TRUE;}int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ // 1. 是实例句柄,用于标识资源所在的位置 // 2. 资源的ID,大多数时候会使用 MAKEINTRESOURCE 进行转换 // 3. 对话框的父窗口,NULL 表示桌面 // 4. 回调函数,用于响应对话框产生的所有消息 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); return 0;}
