当前位置: 代码迷 >> 综合 >> 【MFC】如何手动发送WM_SIZE系统消息
  详细解决方案

【MFC】如何手动发送WM_SIZE系统消息

热度:101   发布时间:2023-10-19 11:55:57.0

信息发送格式如下所示

    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

 

 

 

  相关解决方案