通过鼠标单击选项卡来捕获选项卡更改事件
Posted
技术标签:
【中文标题】通过鼠标单击选项卡来捕获选项卡更改事件【英文标题】:Catch tab change event by mouse clicking on the tab 【发布时间】:2016-06-24 09:34:40 【问题描述】:我有一个CPropertySheet
有几个标签。每个选项卡都有一个不同的 CPropertyPage
类。如果用户单击一个页面(选项卡),则该页面被激活。我如何知道用户是点击了 Tab 还是该页面中的其他位置?
我正在尝试在属性表类的PreTranslateMessage()
中获取该事件(WM_LBUTTONDOWN
)。
BOOL CMyPropertySheet::PreTranslateMessage(MSG* pMsg)
switch (pMsg->message)
case WM_LBUTTONDOWN:
// here I need to handle if user clicks on page (Tabs)
// But this is invoking if user clicking inside page also
return CPropertySheet::PreTranslateMessage(pMsg);
我不知道该怎么做,如果有任何帮助,我将不胜感激。
【问题讨论】:
【参考方案1】:你想看看OnSetActive
和OnKillActive
。
他们提供了一个例子:
// CShapePage is the last wizard property page. Enable the Back
// button and change the Next button to Finish. The "Finish" button
// will have "Done" as its caption.
BOOL CShapePage::OnSetActive()
CPropertySheet* psheet = (CPropertySheet*) GetParent();
psheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
psheet->SetFinishText(_T("Done"));
return CPropertyPage::OnSetActive();
这就是我使用的。您可以从 ClassWizard 实现它们。 工作表本身而不是页面需要知道什么原因?
【讨论】:
这两个函数各有缺点。在处理页面更改时,根据一些输入,我必须关闭属性表并重新打开它(比如刷新之类的东西)。见link。所以这就是为什么我需要在 PretranslateMessage() 中处理页面更改。 当然。 PTM 进行救援。 ?【参考方案2】:使用TCN_SELCHANGE
函数体会是这样的
void CDlgName::OnTcnSelchangeFuncName(NMHDR *pNMHDR, LRESULT *pResult)
// TODO: Add your control notification handler code here
int nCur = m_tabSettings.GetCurSel();
if(nCur == 0) //first tab clicked
//your code
else if(nCur == 1) //Second tab clicked
//your code
else if(nCur == 2) //Third tab clicked
//your code
*pResult = 0;
这可能对你有帮助。
【讨论】:
我有属性表和属性页。我不知道如何将它们转换为 Tab 控件。如果你能提供更多代码,我可以提供帮助。以上是关于通过鼠标单击选项卡来捕获选项卡更改事件的主要内容,如果未能解决你的问题,请参考以下文章