Processing Tab Control Notification Messages 发送反馈 As users click tabs or buttons, the tab control ( CTabCtrl) sends notification messages to its parent window. Handle these messages if you want to do something in response. For example, when the user clicks a tab, you may want to preset control data on the page prior to displaying it.Process WM_NOTIFY messages from the tab control in your view or dialog class. Use the Properties window to create an OnChildNotify handler function with a switch statement based on which notification message is being handled. For a list of the notifications a tab control can send to its parent window, see the Notifications section of Tab Control Reference in the Windows SDK.See Also Reference Using CTabCtrl Concepts Controls (MFC)这是 VS2010 的文档,再详细点的可以自己去查现在首先了解一下你自己的需求,看了所有楼层,猜测你是想要获取当前 Tab 焦点栏目里的对话框句柄? 但这个是不可能的,因为 Tab 控件只负责给你一个“界面”,里面的对话框是需要你自己安放进去的,Tab 不负责管理 所以你不能单纯的说获得 Tab 焦点栏目就获得焦点对话框但是你可以在插入 Tab Item 的时候,有个 lParam 的参数,你可以给它制定为子对话框的句柄或者窗口类 那么在焦点通知消息里再获得 Tab 的 lParam 参数 (我之前习惯用 VS2005,至于 2010 能不能绑顶子窗口我没试过) 可能我说的有点混乱或者难明,但如果你是了解 MFC 消息机制及处理,那么不难明白我所说的意思
如果继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么pMsg->hwnd不就是自己写的这个类的窗口句柄了? if (pMsg->hwnd == m_hWnd) 请问这句判断有什么作用?
wnd=m_hWnd;//此句柄是主对话框的句柄值
当我把对话框焦点换到Cancel上时,再触发KEYDOWN,hwnd的值果然变成了Cancel的句柄值
所以,hwnd应该是对话框上当前获得焦点的控件的句柄,wnd是主对话框的句柄
初始化时保存好分页的指针,然后获取句柄就简单了,http://hi.baidu.com/cannotforget/item/33693636d461944b3075a1c8
你要标记你的三个页面>
1, 可以使用tab顺序, 因为你就是做一个tab页.
2. 可以使用窗口标题(GetWindowText)
3. 可以在你自己的类中提供一个方法还获取一个标记.
{
if(pMsg->hwnd==m_控件.m_hWnd) m_控件.DoSomething();;
}
那是不可能的。而且即便如果能,那你其他控件不需要处理么?我觉得你可以先说下你的需求,说不定有其他更好的方法解决
那就是
m_TabCtrl.GetCurSel();
函数里加判断 if (pMsg->hwnd == m_hWnd)
然后在判断里面写上你想要的代码不就行了如果不想写继承类,那就在主窗口的 WM_NOTIFY 消息里处理通用控件的通知消息
MFC 带有这些通用控件的通知消息处理方法,详细的可以自己去查 MSDN 的通用控件文档PreTranslateMessage 的作用,在我看来只是为了“吃”掉某些消息用的,而不是让你在里面写功能代码的
发送反馈
As users click tabs or buttons, the tab control ( CTabCtrl) sends notification messages to its parent window. Handle these messages if you want to do something in response. For example, when the user clicks a tab, you may want to preset control data on the page prior to displaying it.Process WM_NOTIFY messages from the tab control in your view or dialog class. Use the Properties window to create an OnChildNotify handler function with a switch statement based on which notification message is being handled. For a list of the notifications a tab control can send to its parent window, see the Notifications section of Tab Control Reference in the Windows SDK.See Also
Reference
Using CTabCtrl
Concepts
Controls (MFC)这是 VS2010 的文档,再详细点的可以自己去查现在首先了解一下你自己的需求,看了所有楼层,猜测你是想要获取当前 Tab 焦点栏目里的对话框句柄?
但这个是不可能的,因为 Tab 控件只负责给你一个“界面”,里面的对话框是需要你自己安放进去的,Tab 不负责管理
所以你不能单纯的说获得 Tab 焦点栏目就获得焦点对话框但是你可以在插入 Tab Item 的时候,有个 lParam 的参数,你可以给它制定为子对话框的句柄或者窗口类
那么在焦点通知消息里再获得 Tab 的 lParam 参数
(我之前习惯用 VS2005,至于 2010 能不能绑顶子窗口我没试过)
可能我说的有点混乱或者难明,但如果你是了解 MFC 消息机制及处理,那么不难明白我所说的意思
如果继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么pMsg->hwnd不就是自己写的这个类的窗口句柄了?
if (pMsg->hwnd == m_hWnd) 请问这句判断有什么作用?
如果继承 CTabCtrl 自己写个类,在该类中重写 PreTranslateMessage,那么pMsg->hwnd不就是自己写的这个类的窗口句柄了?
if (pMsg->hwnd == m_hWnd) 请问这句判断有什么作用?我是根据你的提问写的回答
你自己在CHotKeysAppDlg里重载PreTranslateMessage里面的pMsg->hwnd都不一定等于对话框的m_hWnd了
所以我才给你加个判断但是通用控件的消息处理,还是在WM_NOTIFY里面处理就行了,用不着在PreTranslateMessage里面处理
还是那句话,一般通用控件的消息处理都是在父窗口的 WM_NOTIFY 里面处理
像你这种在 PreTranslateMessage 的情况我还真没试过你有没有看我19#的回答?我不知道有没有理解错你的意图?
我猜测你的意图流程是有一个父对话框A,在A里面有一个CTabCtrl控件,控件里面相对每个页都有一个子对话框?
你现在想做的是想知道 CTabCtrl 中获得焦点的页和于该页对应的子对话框句柄?
我19#的回答就是按这个流程回答的
{
//隐藏当前页面
m_pdlg[m_currpage]->ShowWindow(SW_HIDE);
//获取新页面索引
m_currpage = m_tabctrl.GetCurSel();
//显示新页面
m_pdlg[m_currpage]->ShowWindow(SW_SHOW);
*pResult = 0;
}我的m_currpage 就是表示哪个页面获取焦点。
我其实只是想知道PreTranslateMessage 的pMsg->hwnd是谁的句柄而已
其他 消息 可能 是 没焦点的 hWnd (如 paint 消息)