乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      自定義WM_NOTIFY消息

       herowuking 2015-10-07
      習(xí)慣了用自定義用戶消息進(jìn)行各種狀態(tài)的通知,特別是子窗口與父窗口之間的交互。但ON_MESSAGE沒有控件ID的限制,如果有多個子窗口發(fā)送同一個消息給父窗口時,父窗口就不知道哪個窗口發(fā)的(當(dāng)然可以用參數(shù)進(jìn)行約定)。
      如何解決這個問題?

      有幾種思路:1.重寫ON_MESSAGE宏,增加ID的限制;2.模擬按鈕單擊消息;3.自定義WM_NOTIFY消息?;谶@些思路都不能修改MFC底層的代碼。

      用調(diào)試的方式查看MFC的實(shí)現(xiàn)代碼,發(fā)現(xiàn)重寫ON_MESSAGE宏不能實(shí)現(xiàn),具有ID判斷的只在WM_NOTIFY和WM_COMMAND兩個消息中,兩個消息最終都會進(jìn)入 CCmdTarget::OnCmdMsg函數(shù)進(jìn)行ID判斷。在比較之下,決定使用WM_NOTIFY消息。

      下面分析下WM_NOTIFY消息的路由過程。

      分析 CWnd::OnWndMsg函數(shù),在MFC中窗口消息在這邊派送的。關(guān)于WM_NOTIFY消息的代碼如下:
      LRESULT lResult = 0;
      ...
      // special case for notifies
      if (message == WM_NOTIFY)
      {
      NMHDR* pNMHDR = (NMHDR*)lParam;
      if (pNMHDR->hwndFrom != NULL && OnNotify(wParam, lParam, &lResult))
      goto LReturnTrue;
      return FALSE;
      }

      OnNotify的定義如下:
      BOOL CWnd::OnNotify(WPARAM, LPARAM lParam, LRESULT* pResult)
      可以發(fā)現(xiàn)這邊忽略了WPARAM的作用,lParam的參數(shù)實(shí)際指向NMHDR* pNMHDR信息。
      在OnNotify中進(jìn)過必要的處理后進(jìn)入OnCmdMsg函數(shù),在這個函數(shù)中會找相應(yīng)的消息映射,并進(jìn)行ID對應(yīng)。如果找到會進(jìn)入_AfxDispatchCmdMsg函數(shù)調(diào)用對應(yīng)的消息函數(shù)。

      分析到這,我們比較關(guān)心的是NMHDR結(jié)構(gòu)體的定義
      typedef struct tagNMHDR
      {
          HWND      hwndFrom;
          UINT_PTR  idFrom;
          UINT      code;         // NM_ code
      }   NMHDR;

      通過分析代碼發(fā)現(xiàn):
      hwndFrom:必須有,聲明消息來自哪個窗口。
      idFrom:可有可無,聲明窗口ID
      code:具體的子消息,即通知類型。非常關(guān)鍵。

      分析到此,我們實(shí)現(xiàn)下自定義notify.

      1.定義通知類型:
      #define WM_GRID_SELECT_CHANGE(WM_USER + 1)

      2.增加消息映射函數(shù),并實(shí)現(xiàn):
      afx_msg void OnNotifyGridChanged(NMHDR *pNMHDR, LRESULT *pResult);

      3.增加映射對應(yīng)關(guān)系:
      ON_NOTIFY(WM_GRID_SELECT_CHANGE, GRIDCTRL_ID, &CContradictionRuleView::OnNotifyGridChanged)

      4.在子窗口中發(fā)送WM_NOTIFY消息
      if (this->GetParent())
      {
      NMHDR nmhdr;
      nmhdr.hwndFrom= this->m_hWnd;
      nmhdr.idFrom = 0;//m_id;
      nmhdr.code = WM_GRID_SELECT_CHANGE;  // 用戶自定義消息

      //發(fā)送notify消息
      this->GetParent()->SendMessage(WM_NOTIFY, (WPARAM)nmhdr.idFrom,(LPARAM)&nmhdr);
      }
      OK到此實(shí)現(xiàn)了自定義的notify消息。希望對你有所幫助,如果有什么疑問請聯(lián)系wjh_2010@163.com。
      版權(quán)所有,如需轉(zhuǎn)載請聲明出處和作者(wjh_2010@163.com)

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多