写惯了PC程序的人回头写一下CE的东西,不得不改变一下写程序的思路,尽管两者很多WINAPI都可以互用,但只有VS在编译时才会告诉哪些是不可以用的,CE6还好点,CE5就没那么好过了。
像CE5下的CButton居然没法调出WM_LBUTTONDOWN消息,如果想实现一个按钮的长按动作,面对BN_CLICKED这一个点击事件实在没法下手,最基本的实现长按的思路是实现截取WM_LBUTTONDOWN与WM_LBUTTONUP这两个消息,分别弄一个回调函数过去。之前有写过基于CWnd/CDC类的自定义按钮,但那实在不方便随时组一个可见即所得的人机界面,也不想重载CButton多弄一堆的代码,最简单的办法是,在按钮m_Btn所在窗口里截取WM_LBUTTONDOWN与WM_LBUTTONUP两个消息,具体实现代码如下:
在窗体头文件定义如下回调函数,然后重写PreTranslateMessage函数:
- //mydlg.h
- void OnBntDownRun();//WM_LBUTTONDOWN消息回调函数
- void OnBtnUpRun();//WM_LBUTTONDOWN消息回调函数
- virtual BOOL PreTranslateMessage(MSG* pMsg);//重写该窗体函数
在窗体实现文件中实现以上函数:
- //mydlg.cpp
- //窗体消息分发
- BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
- {
- if (pMsg->message == WM_LBUTTONDOWN)
- {
- //指定点击控件的ID
- int id = ::GetDlgCtrlID(pMsg->hwnd);
- if (id == IDC_RUN)
- {
- //消息已经被截获
- TRACE(_T("Down\r\n"));
- this->OnBntDownRun();
- }
- }else if(pMsg->message == WM_LBUTTONUP)
- {
- int id = ::GetDlgCtrlID(pMsg->hwnd);
- if (id == IDC_RUN)
- {
- TRACE(_T("Up\r\n"));
- this->OnBtnUpRun();
- }
- }
- return CDialog::PreTranslateMessage(pMsg);
- }
- //WM_LBUTTONDOWN消息回调函数
- void CMyDlg::OnBtnDownRun()
- {
- //实现代码
- }
- //WM_LBUTTONUP消息回调函数
- void CMyDlg::OnBtnUpRun()
- {
- //实现代码
- }
好吧,以上代码已经说得很清楚啦,一直在进行CE的界面开发,这点代码还是挺有用的,权放在这当个备忘吧。需要提醒一下,DOWM的时候千万别弹出MessageBox,要问为什么——这种东西,你没试过那就是你的幸运啦。
其实相对C#中的代理,还是蛮喜欢MFC的消息机制的,主要是可以做很多很深层次的应用,呵呵……
转载于:https://blog.51cto.com/joeyliu/991464