void CAnalyzeDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CResizingDialog::OnActivate(nState, pWndOther, bMinimized); if (nState == WA_INACTIVE) m_pTree->SetWindowPos(&wndNoTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOACTIVATE ); else m_pTree->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE |SWP_NOACTIVATE ); }代码解释
时间: 2023-07-14 13:12:01 浏览: 139
这段代码是 MFC 框架下对话框类 CAnalyzeDlg 的 OnActivate 函数的实现。OnActivate 函数会在对话框被激活或非激活状态改变时被调用。
该函数调用了基类 CResizingDialog 的 OnActivate 函数,然后根据 nState 参数的值来判断对话框当前是激活还是非激活状态。如果是非激活状态(即 nState == WA_INACTIVE),则将对话框中的一个树形控件 m_pTree 设置为非置顶窗口,否则将其设置为置顶窗口,以便在对话框被激活时树形控件能够显示在最上层。其中的 SetWindowPos 函数用于设置窗口的大小、位置和显示状态。
相关问题
MFC,用void CClientPropertyPageDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)写一个取消置顶的函数
在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()`仅获取桌面顶层窗口,对于某些特定的应用场景可能不准确。
class CAnalyzeDlg : public CResizingDialog { // Construction public: CString GetStepInfo(int iStep, const vector <int> & Status, const vector <char> & Symbol, CString sInput, Pair Action, int Goto); CAnalyzeDlg(CWnd* pParent = NULL); // standard constructor ~CAnalyzeDlg(); void SetGrammar(const Grammar & g); // Dialog Data //{{AFX_DATA(CAnalyzeDlg) enum { IDD = IDD_DIALOG2 }; CEdit m_edit1; CExplorer1 m_web; CString m_input; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAnalyzeDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: Grammar m_g; CTreeDlg * m_pTree; string m_strTempFilename; // Generated message map functions //{{AFX_MSG(CAnalyzeDlg) virtual void OnOK(); virtual void OnCancel(); afx_msg void OnButton1(); virtual BOOL OnInitDialog(); afx_msg void OnButton2(); afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: void MakeTree(); stack <int> TreeStack; };代码解释
这是 MFC 中一个用于语法分析的对话框类 CAnalyzeDlg 的定义。它继承自 CResizingDialog 类,具有自适应大小的特性。其中包含了成员函数 GetStepInfo、SetGrammar、MakeTree 等。GetStepInfo 用于获取语法分析过程中每一步的信息,SetGrammar 用于设置语法分析所使用的文法,MakeTree 用于生成分析树。在对话框上,包含了一个编辑框和一个 CExplorer1 控件,用于显示分析结果和分析树。
阅读全文