失去和得到焦点OnActivate

失去焦点和得到焦点响应的是:ON_WM_ACTIVATE()
对应的处理是:afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
nState有三种状态:
WA_INACTIVE The window is being deactivated.
WA_ACTIVE The window is being activated through some method other than a mouse click (for example, by use of the keyboard interface to select the window).
WA_CLICKACTIVE The window is being activated by a mouse click.
当窗口得到或失去焦点时,会触发这个消息.
我们接收到这个消息后,可以判断到底是哪一种状态.

C/C++ code
   
   
void CXXXDlg::OnActivate( UINT nState, CWnd * pWndOther, BOOL bMinimized ) { CDialog::OnActivate(nState, pWndOther, bMinimized); if (WA_ACTIVE == nState) { ...... } else if (WA_INACTIVE == nState) { ...... } else { ...... } }
在MFC中,`OnActivate`是一个消息处理函数,用于响应窗口的激活状态改变事件。如果你想写一个取消置顶的函数,这个函数通常会在窗口失去焦点或者变为非活动状态时执行,以阻止其成为当前窗口(即置于最顶层)。这里我们可以假设`CClientPropertyPageDlg`类有一个窗口句柄,可以用来操作窗口位置。 下面是一个示例的函数实现,它将窗口降低到窗口堆栈的底层: ```cpp void CClientPropertyPageDlg::CancelPromotion() { // 确保窗口不是最小化状态 if (!IsWindowMinimized()) { // 获取顶级窗口句柄 HWND hWndTop = GetDesktopWindow(); // 如果我们的窗口是顶层窗口(在窗口堆栈顶部) if (IsWindowVisible() && IsWindowPosChanged(NULL)) { // 将窗口位置设回原处,使其不再置顶 SetWindowPos(hWndTop, // 指定顶层窗口 NULL, // 上层窗口,NULL表示恢复默认顺序 0, // x坐标 0, // y坐标 0, // 长度 0, // 宽度 SWP_NOMOVE | // 无移动 SWP_NOSIZE // 无大小调整 ); } } } // 调用取消置顶的函数,例如当窗口失去焦点时 LRESULT CClientPropertyPageDlg::OnDeactivate(WPARAM wParam, LPARAM lParam) { CancelPromotion(); return CallWindowProc(m_pfnMessagePreHandler, hWnd, message, wParam, lParam); } ``` 请注意,这只是一个基本的示例,实际场景可能会更复杂,比如需要处理更复杂的窗口层级关系。另外,`GetDesktopWindow()`仅获取桌面顶层窗口,对于某些特定的应用场景可能不准确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值