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