window宏笔记

文章详细展示了如何使用宏进行对话框消息处理的优化,通过HANDLE_DLGMSG和SetDlgMsgResult宏简化WM_INITDIALOG消息的处理,以及最终转换为HANDLE_WM_INITDIALOG函数调用的方式,提高代码的可读性和效率。
摘要由CSDN通过智能技术生成

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);

}

1.第一次转换

#define chHANDLE_DLGMSG(hWnd, message, fn)
case (message): return (SetDlgMsgResult(hWnd, uMsg,
HANDLE_##message((hWnd), (wParam), (lParam), (fn))))

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case (WM_INITDIALOG) :return (SetDlgMsgResult(hWnd, uMsg, \
HANDLE_WM_INITDAILOG((hWnd), (wParam), (lParam), ( Dlg_OnInitDialog))));
}

1.第二次转换
#define SetDlgMsgResult(hwnd, msg, result) ((
(msg) == WM_CTLCOLORMSGBOX ||
(msg) == WM_CTLCOLOREDIT ||
(msg) == WM_CTLCOLORLISTBOX ||
(msg) == WM_CTLCOLORBTN ||
(msg) == WM_CTLCOLORDLG ||
(msg) == WM_CTLCOLORSCROLLBAR ||
(msg) == WM_CTLCOLORSTATIC ||
(msg) == WM_COMPAREITEM ||
(msg) == WM_VKEYTOITEM ||
(msg) == WM_CHARTOITEM ||
(msg) == WM_QUERYDRAGICON ||
(msg) == WM_INITDIALOG
) ? (BOOL)(result) : (SetWindowLongPtr((hwnd), DWLP_MSGRESULT, (LPARAM)(LRESULT)(result)), TRUE))

//msg==其中1个消息 执行 (BOOL)(result) 其中result是个函数指针
msg!=其中1个消息 执行 SetWindowLongPtr((hwnd), DWLP_MSGRESULT, (LPARAM)(LRESULT)(result)), TRUE) 直接设置函数的返回值为TRUE

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
// case (WM_INITDIALOG) :return (SetDlgMsgResult(hWnd, uMsg, \
// HANDLE_WM_INITDAILOG((hWnd), (wParam), (lParam), ( Dlg_OnInitDialog))));

    case (WM_INITDIALOG) :return (
	( \
    (uMsg) == WM_CTLCOLORMSGBOX      || \
    (uMsg) == WM_CTLCOLOREDIT        || \
    (uMsg) == WM_CTLCOLORLISTBOX     || \
    (uMsg) == WM_CTLCOLORBTN         || \
    (uMsg) == WM_CTLCOLORDLG         || \
    (uMsg) == WM_CTLCOLORSCROLLBAR   || \
    (uMsg) == WM_CTLCOLORSTATIC      || \
    (uMsg) == WM_COMPAREITEM         || \
    (uMsg) == WM_VKEYTOITEM          || \
    (uMsg) == WM_CHARTOITEM          || \
    (uMsg) == WM_QUERYDRAGICON       || \
    (uMsg) == WM_INITDIALOG             \
) ? \     
(BOOL)(HANDLE_WM_INITDIALOG(((hWnd), (wParam), (lParam), ( Dlg_OnInitDialog))) \     //返回TRUE
: (SetWindowLongPtr((hwnd), DWLP_MSGRESULT, (LPARAM)(HANDLE_WM_INITDIALOG((hWnd), (wParam), (lParam), ( Dlg_OnInitDialog)))(result)), TRUE))

);//逗号表达式有括号取最右边的值

}

第3次转换

#define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn)
(LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam)

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case (WM_INITDIALOG) :return (
(
(BOOL)(HANDLE_WM_INITDIALOG(((hWnd), (wParam), (lParam), ( Dlg_OnInitDialog))) \

);

}

第4次转换

#define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn)
(LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam)

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case (WM_INITDIALOG) :return (
(
(LRESULT)(DWORD)(UINT)(BOOL)(Dlg_OnInitDialog)((hwnd), (HWND)(wParam), lParam) //变成一个函数了
)

}

Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
外面处理Dlg_OnInitDialog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值