写惯了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函数:

   
   
   
   
  1. //mydlg.h  
  2. void OnBntDownRun();//WM_LBUTTONDOWN消息回调函数  
  3. void OnBtnUpRun();//WM_LBUTTONDOWN消息回调函数  
  4. virtual BOOL PreTranslateMessage(MSG* pMsg);//重写该窗体函数  

在窗体实现文件中实现以上函数:

   
   
   
   
  1. //mydlg.cpp  
  2.  
  3.  
  4. //窗体消息分发  
  5. BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)  
  6. {  
  7.     if (pMsg->message == WM_LBUTTONDOWN)  
  8.     {  
  9.                   //指定点击控件的ID  
  10.         int id = ::GetDlgCtrlID(pMsg->hwnd);  
  11.         if (id == IDC_RUN)  
  12.         {  
  13.                            //消息已经被截获  
  14.             TRACE(_T("Down\r\n"));  
  15.             this->OnBntDownRun();  
  16.         }  
  17.     }else if(pMsg->message == WM_LBUTTONUP)  
  18.     {  
  19.         int id = ::GetDlgCtrlID(pMsg->hwnd);  
  20.         if (id == IDC_RUN)  
  21.         {  
  22.             TRACE(_T("Up\r\n"));  
  23.             this->OnBtnUpRun();  
  24.         }  
  25.     }  
  26.     return CDialog::PreTranslateMessage(pMsg);  
  27. }  
  28.  
  29. //WM_LBUTTONDOWN消息回调函数  
  30. void CMyDlg::OnBtnDownRun()  
  31. {  
  32.     //实现代码  
  33. }  
  34.  
  35. //WM_LBUTTONUP消息回调函数  
  36. void CMyDlg::OnBtnUpRun()  
  37. {  
  38.     //实现代码  

好吧,以上代码已经说得很清楚啦,一直在进行CE的界面开发,这点代码还是挺有用的,权放在这当个备忘吧。需要提醒一下,DOWM的时候千万别弹出MessageBox,要问为什么——这种东西,你没试过那就是你的幸运啦。

其实相对C#中的代理,还是蛮喜欢MFC的消息机制的,主要是可以做很多很深层次的应用,呵呵……