//弄了个仿MFC消息映射,这是全局函数都好弄,照着MFC就弄出来了,
//在vs2017上可以通过
#include <windows.h>
#include "resource.h"
#include "QDialog.h"
#include "QWinDlg.h"
//全局实例句柄
HINSTANCE g_hInstance;
//函数的前导声明
LRESULT OnInitDialog(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnPaintMain(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnClose(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnDestroy(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnCommand(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT OnCancel(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//定义的函数指针的结构体
struct decodeUINT
{
UINT uCode; //消息号码
LRESULT(*Fxn)(HWND, UINT, WPARAM, LPARAM); //函数指针还是指针函数,有点晕这会
};
//消息映射宏,抄MFC的
#define MAIN_BEGIN_MSG() const struct decodeUINT MainWndMessage[] = {
#define MAIN_END_MSG };
//消息映射数组
MAIN_BEGIN_MSG()
WM_INITDIALOG,OnInitDialog,
WM_PAINT,OnPaintMain,
WM_CLOSE,OnClose,
WM_DESTROY,OnDestroy,
WM_COMMAND,OnCommand,
IDWINOK,OnIDOK,
IDC_ADD_BTN,OnCancel,
MAIN_END_MSG
//计算消息数组的个数
#define MAIN_MSG_COUNT sizeof(MainWndMessage) / sizeof(decodeUINT)
//过程函数的声明
INT_PTR CALLBACK WinProc(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//主函数
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
g_hInstance = hInstance;
HWND hWnd = ::CreateDialog(hInstance, (LPCTSTR)IDD_DIALOG1, NULL, WinProc);
if (hWnd == NULL)
return 0;
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//过程函数的实现
INT_PTR CALLBACK WinProc(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//循环查找消息数组中的消息,有就返回执行找到的消息对应的函数
for (int i = 0;i< MAIN_MSG_COUNT;i++)
{
if (uMsg == MainWndMessage[i].uCode)
return (*MainWndMessage[i].Fxn)(winHwnd, uMsg, wParam, lParam);
}
//没有找到就返回默认的消息处理函数
return DefWindowProc(winHwnd, uMsg, wParam, lParam);
}
//下面就是各个函数的实现
LRESULT OnInitDialog(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnPaintMain(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnClose(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DestroyWindow(winHwnd);
return 1;
}
LRESULT OnDestroy(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
LRESULT OnCommand(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
for (int i = 0; i < MAIN_MSG_COUNT; i++)
{
//这和上面的循环查找一样,只是条件改为wParam,
if (LOWORD(wParam) == MainWndMessage[i].uCode)
{
return (*MainWndMessage[i].Fxn)(winHwnd, uMsg, wParam, lParam);
}
}
return 1;
}
LRESULT OnIDOK(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
QWinDlg dlg;
dlg.ShowDialog(winHwnd);
return 0;
}
LRESULT OnCancel(HWND winHwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
//这是全局函数都还好说,我想弄成MFC一样的在类中封装成这样的消息映射,就卡壳了,在网上查了许多,
都全是用静态函数来实现的,我在想静态其实也就是全局函数嘛,和这没有多大区别,为啥MFC就能弄出封装到类中的
消息映射机制呢.这下卡就半个多月,没有师父就是这样,没人指点.