#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,没有处理返回 FALSE
INT_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;
}
