MFC对话框程序基础复习003

对话框基础复习三 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 获取选中tabindex,例如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就会正常处理

对字的操作扩展

HIWORDLOWORD  取高、低位字    MAKEWPARAM    构造WPARMA

HIBYTELOBYTE    取高、低位字节  MAKELPARAM     构造 LPARMA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值