【MFC】如何手動發送WM_SIZE系統消息

信息發送格式如下所示

    CRect rect;
    GetClientRect(&rect);
    PostMessage(WM_SIZE, (WPARAM)SIZE_RESTORED, MAKELPARAM(rect.Width(), rect.Height()));

//默認接收回調函數
void CMFCView::OnSize(UINT nType, int cx, int cy)

第一個參數就是系統消息WM_SIZE,這個是消息類型 窗口尺寸變動類型

第二個是參數是消息狀態 下圖是尺寸定義看名字便知功能

//FilePath:..\Windows Kits\10\Include\10.0.17763.0\um\WinUser.h Line:2635
/*
 * WM_SIZE message wParam values
 */
#define SIZE_RESTORED       0
#define SIZE_MINIMIZED      1
#define SIZE_MAXIMIZED      2
#define SIZE_MAXSHOW        3
#define SIZE_MAXHIDE        4

第三個參數是窗口尺寸數據,他使用MAKELPARAM 宏將窗口尺寸int數據拼接成爲一個64位數據

可以在源碼庫中看到這樣的定義

//FilePath:..\Windows Kits\10\Include\10.0.17763.0\um\WinUser.h Line:1870
#define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))

#define MAKEWPARAM(l, h)      ((WPARAM)(DWORD)MAKELONG(l, h))
#define MAKELPARAM(l, h)      ((LPARAM)(DWORD)MAKELONG(l, h))
#define MAKELRESULT(l, h)     ((LRESULT)(DWORD)MAKELONG(l, h))


 

消息分發處,原始結構見下

//FilePath:..\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxmsg_.h  L:393
#define ON_WM_SIZE() \
	{ WM_SIZE, 0, 0, 0, AfxSig_vwii, \
		(AFX_PMSG)(AFX_PMSGW) \
		(static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, int, int) > ( &ThisClass :: OnSize)) },

其中     AfxSig_vwii = AfxSig_v_u_ii,    // void (UINT, int, int)  標示了回調函數的參數類型

在源碼中wincore.cpp Line:2177  可以看到 WM_SIZE 是如何被處理的  以及2491行,消息是如何分發的

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
//...	
    switch (message)
	{
	case WM_SIZE:
		{
			ResizeDynamicLayout();

			CHwndRenderTarget* pRenderTarget = GetRenderTarget();
			if (pRenderTarget != NULL && pRenderTarget->IsValid())
			{
				pRenderTarget->Resize(CD2DSizeU(UINT32(LOWORD(lParam)), UINT32(HIWORD(lParam))));
				RedrawWindow();
			}
		}
		break;

//...
	switch (lpEntry->nSig)
	{
	case AfxSig_v_u_ii:
		(this->*mmf.pfn_v_u_i_i)(static_cast<UINT>(wParam), LOWORD(lParam), HIWORD(lParam));
		break;
//..
}

據此根據數據的處理過程我們便清楚了 WM_SIZE的產生到處理的整個流程

PostMessage ->WindowProc->OnWndMsg ->OnSize

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章