对话框基础复习三 2011.4.24
Tab Control控件:(CTabCtr类)
分析原理,其实TabControl控件并不是多页面,只是在一个窗体上面添加了Tab的按钮,每次在Tab按钮的选择改变时候响应消息,通过利用它作为父窗口创建的子窗口集合相互交替显示和隐藏,就可以实现Tab页面的切换。
使用方法:
①为Tab Control关联一个控制对象,例如m_TabTest
②要设置多少个页面就创建多少个Dialog,并将Dialog 设置为Child
③为每个页面的Dialog创建一个类,并创建响应的对象,例如m_page0
④InsertItem 添加一个页面Tab标签,可以直接添加一个宽字的字串,也可以用TCITEM 结构体来添加图片等作为Tab标签
⑤让Tab Control作为父窗口Creat 非模态对话框
m_page0.Create(IDD_PAGE0, &m_TabTest);
⑥设置这些非模态对话框的位置,下面是技巧
CRect rc;
m_TabTest.GetClientRect(rc); //获得Tab面板的区域
rc.top += 20;
rc.bottom -= 8;
rc.left += 8;
rc.right -= 8;
m_page0.MoveWindow(&rc);
⑦把页面非模态对话框显示,并把第0页设为可见
m_page0.ShowWindow(SW_SHOW);
m_page1.ShowWindow(SW_HIDE);
⑧响应 Tab Control 的 TCN_SELCHANGING 消息
GetCurSel 获取选中tab的index,例如m_TabTest.GetCurSel();
然后会相应的对话框进行显示和隐藏,便可以实现页面的切换了。
关于Hot Key 控件 :(CHotKeyCtrl类)
分析原理,其实不用HotKey 控件也可以创建全局热键,下面的方法直接第③步就可以了。其实不用添加消息映射也行,override ProcessMessageFilter这个virtual Function,在这里过滤WM_HOTKEY这个消息也行。
全局热键创建方法:
①为 HotKey 控件关联一个控制对象
②对控制对象进行设置
SetRules 设置热键的规制
SetHotKey 设置一个热键 Virtual-key 是 VK_* 可以到MSDN查
③RegisterHotKey 系统API注册一个热键
BOOL RegisterHotKey(
HWND hWnd, // handle to window
int id, // hot key identifier
UINT fsModifiers, // key-modifier options
UINT vk // virtual-key code
);
在(MESSAGE_MAP )消息映射中添加WM_HOTKEY消息的响应
ON_MESSAGE(WM_HOTKEY, OnHotKey)
在头文件中添加OnHotKey处理函数
afx_msg void OnHotKey(WPARAM wParam, LPARAM lParam);
④在 OnHotKey中获取热键消息
WPARAM 是在 RegisterHotKey 这设置的ID
LPARAM 其中low-order word specify 了对应用的组合键
high-order word specify 了virtual-key code
其中用取高低位的方法获得对应的元素
HIWORD 取高位UINT uVirtKey = (UINT) HIWORD(lParam);
LOWORD 取低位
⑤在程序结束之后要注销系统热键
例如在 OnDestroy 中 UnRegisterHotKey ,这样就不会占用系统热键了。
关于 Accelerator 的使用 (非全局热键 的创建):
①创建一个Accelerator
②将一个控件ID 和 KEY 进行关联
③创建类成员,类型为HACCEL
④在构造函数中初始化
m_hAccel=::LoadAccelerators(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_ACCELERATOR1));
⑤override the Virtual Function: PreTranslateMessage 在其中设置拦截
用TranslateAccelerator 来处理消息,然后return TRUE
例如:
if(m_hAccel) {
if(::TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) {
return TRUE;
}
}
这样就能对非全局热键进行响应了
PreTranslateMessage 返回非零就会特殊处理,返回0就会正常处理
对字的操作扩展:
HIWORD、LOWORD 取高、低位字 MAKEWPARAM 构造WPARMA
HIBYTE、LOBYTE 取高、低位字节 MAKELPARAM 构造 LPARMA