亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

VC/MFC中如何自定義消息

2020-05-23 14:24:19
字體:
來源:轉載
供稿:網友

 定義一個自定義消息號:const UINT WM_MYMESSAGE = WM_USER + n; // 自定義消息一般大于WM_USER,然后就可以為該消息添加映射了。

  afx_msg LRESULT OnMyMessage ( WPARAM wParam, LPARAM lParam );

  ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage )

  LRESULT cxx::OnMyMessage ( WPARAM wParma, LPARAM lParam )

  {

  ...

  }

  如果該消息不需要返回值,也不需要參數,那么可以使用宏ON_MESSAGE_VOID來映射

  afx_msg void OnMyMessage ();

  ON_MESSAGE_VOID ( WM_MYMESSAGE, OnMyMessage )

  void cxx::OnMyMessage ()

  {

  ...

  }

  復雜全面版本:

  消息映射、循環機制是Windows程序運行的基本方式。VC++ MFC 中有許多現成的消息句柄,可當我們需要完成其它的任務,需要自定義消息,就遇到了一些困難。在MFC ClassWizard中不允許添加用戶自定義消息,所以我們必須在程序中添加相應代碼,以便可以象處理其它消息一樣處理自定義消息。通常的做法是采取以下步驟:

  第一步:定義消息。

  推薦用戶自定義消息至少是WM_USER+100,因為很多新控件也要使用WM_USER消息。

  #define WM_MY_MESSAGE (WM_USER+100)

  第二步:實現消息處理函數。該函數使用WPRAM和LPARAM參數并返回LPESULT。

  LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)

  {

  // TODO: 處理用戶自定義消息

  ...

  return 0;

  }

  第三步:在類頭文件的AFX_MSG塊中說明消息處理函數:

  class CMainFrame:public CMDIFrameWnd

  {

  ...

  // 一般消息映射函數

  protected:

  // {{AFX_MSG(CMainFrame)

  afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

  afx_msg void OnTimer(UINT nIDEvent);

  afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()

  }

  第四步:在用戶類的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數中。

  BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

  //{{AFX_MSG_MAP(CMainFrame)

  ON_WM_CREATE()

  ON_WM_TIMER()

  ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)

  //}}AFX_MSG_MAP

  END_MESSAGE_MAP()

  如果用戶需要一個定義整個系統唯一的消息,可以調用SDK函數RegisterWindowMessage定義消息:

  static UINT WM_MY_MESSAGE=RegisterWindowMessage(User);

  并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。

  當需要使用自定義消息時,可以在相應類中的函數中調用函數PostMessage或SendMessage發送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他進程發送消息可通過如下方法發送消息:

  DWORD result;

  SendMessageTimeout(wnd->m_hWnd, // 目標窗口

  WM_MY_MESSAGE, // 消息

  0, // WPARAM

  0, // LPARAM

  SMTO_ABORTIFHUNG |

  SMTO_NORMAL,

  TIMEOUT_INTERVAL,

  &result);

  以避免其它進程如果被阻塞而造成系統死等狀態。

  可是如果需要向其它類(如主框架、子窗口、視類、對話框、狀態條、工具條或其他控件等)發送消息時,上述方法顯得無能為力,而在編程過程中往往需要獲取其它類中的某個識別信號,MFC框架給我們造成了種種限制,但是可以通過獲取某個類的指針而向這個類發送消息,而自定義消息的各種動作則在這個類中定義,這樣就可以自由自在的向其它類發送消息了。

  下面舉的例子敘述了向視類和框架類發送消息的方法:

  在主框架類中向視類發送消息:

  視類中定義消息:

  ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定義消息映射

  視類定義消息處理函數:

  // 消息處理函數

  LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)

  {

  // TODO: 處理用戶自定義消息

  ...

  return 0;

  }

  //發送消息的測試函數

  void CMainFrame::OnTest()

  {

  CView * active = GetActiveView();//獲取當前視類指針

  if(active != NULL)

  active->PostMessage(WM_MY_MESSAGE,0,0);

  }

  在其它類中向視類發送消息:

  //發送消息的測試函數

  void CMainFrame::OnTest()

  {

  CMDIFrameWnd *pFrame;

  CMDIChildWnd *pChild;

  CView *pView;

  //獲取主窗口指針

  pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;

  // 獲取子窗口指針

  pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();

  //獲取視類指針

  pView = pChild->GetActiveView();

  if(pView != NULL)

  pView->PostMessage(WM_MY_MESSAGE,0,0);//發送消息

  }

  其余步驟同上。

  在視類中向主框架發送消息:

  首先在主框架中定義相關的消息,方法同上,然后在發送消息的函數中添加代碼如下

  //發送消息的測試函數

  void CMessageView::OnTest()

  {

  CFrameWnd * active = GetActiveFrame();//獲取當前主窗口框架指針

  if(active != this)

  active->PostMessage(WM_MY_MESSAGE,0,0);

  return 0;

  }

  在其它類中向不同的類發送消息可依次方法類推,這樣我們的程序就可以的不受限制向其它類和進程發送消息,而避免了種種意想不到的風險。

  下面一個例子程序為多文檔程序里在一對話框中向視類發送消息,詳述了發送自定義消息的具體過程。

  實現步驟:

  第一步:在VC++中新建工程Message,所有ClassWizard步驟選項均為缺省,完成。

  第二步:在主菜單中添加測試菜單為調出對話框,在框架類中建立相應函數OnTest()

  第三步:在資源中建立對話框,通過ClassWizard添加新類TestDialog,添加測試按鈕,

  在對話框類中建立相應函數OnDialogTest()

  //通過對話框按鈕發送消息的函數

  void TestDialog::OnDialogTest()

  {

  CMDIFrameWnd *pFrame;

  CMDIChildWnd *pChild;

  CView *pView;

  //獲取主窗口指針

  pFrame =(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;

  // 獲取子窗口指針

  pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();

  //獲取視類指針

  pView = pChild->GetActiveView();

  if(active != NULL)

  active->PostMessage(WM_MY_MESSAGE,0,0);//發送消息

  }

  在Message.h頭文件中添加如下語句:

  static UINT WM_MY_MESSAGE=RegisterWindowMessage(Message);

  第四步:在視類中添加自定義消息:

  在頭文件MessageView.h中添加消息映射

  protected:

  //{{AFX_MSG(CMessageView)

  //}}AFX_MSG

  afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); //此行為添加代碼

  DECLARE_MESSAGE_MAP()

  在視類文件MessageView.cpp中的消息映射中添加自定義消息映射

  BEGIN_MESSAGE_MAP(CMessageView, CView)

  //{{AFX_MSG_MAP(CMessageView)

  //}}AFX_MSG_MAP

  // Standard printing commands

  ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //此行添加代碼定義唯一消息

  END_MESSAGE_MAP()

  添加相應的0消息處理函數

  LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)

  {

  CRect rect;

  GetClientRect(&rect);

  InvalidateRect(&rect);

  test=!test;

  return 0;

  }

  在MessageView.h中添加布爾變量 public:BOOL test;

  在視類構造函數中初始化 test變量:test=FALSE;

  修改CMessageView::OnDraw()函數

  void CMessageView::OnDraw(CDC* pDC)

  {

  CMessageDoc* pDoc = GetDocument();

  ASSERT_VALID(pDoc);

  // 以下程序顯示消息響應效果

  if(test)

  pDC->TextOut(0,0,消息響應!);

  }

  第五步:顯示測試對話框

  在MainFrame類中包含對話框頭文件:

  #include TestDialog.h;

  OnTest()函數中添加代碼

  void CMainFrame::OnTest()

  {

  TestDialog dialog;

  dialog.DoModal();

  }

  運行程序,在測試菜單打開對話框,點擊測試按鈕即可看到結果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩电影在线观看| 日韩免费在线视频| 日韩在线免费视频观看| 日韩成人中文字幕在线观看| 欧美性开放视频| 羞羞色国产精品| 久久久人成影片一区二区三区观看| 久久久久久高潮国产精品视| 欧洲日本亚洲国产区| 日韩av资源在线播放| 激情成人中文字幕| 欧美高清videos高潮hd| 亚洲人午夜色婷婷| 欧美国产精品va在线观看| 精品久久久久久久久久久久| 国产主播喷水一区二区| 日韩视频在线免费| 欧美日韩ab片| 国产精品爽爽爽爽爽爽在线观看| 性欧美办公室18xxxxhd| 久久人91精品久久久久久不卡| 亚洲精品美女久久久久| 久久久免费高清电视剧观看| 亚洲第一网站免费视频| 8x海外华人永久免费日韩内陆视频| 精品欧美激情精品一区| 91av在线精品| 97碰在线观看| 在线观看欧美视频| 亚洲视频专区在线| 日韩中文字幕网址| 精品av在线播放| 一区二区三区视频免费在线观看| 欧美与欧洲交xxxx免费观看| 亚洲欧美制服另类日韩| 亚洲精品美女在线观看| www高清在线视频日韩欧美| 国产成人亚洲综合91| 欧美专区在线观看| 国产成人免费91av在线| 日韩电影大全免费观看2023年上| 在线看日韩欧美| 亚洲欧美精品在线| 隔壁老王国产在线精品| 日韩专区中文字幕| 久久亚洲国产成人| 欧美在线激情视频| 一本色道久久88综合亚洲精品ⅰ| 欧美精品九九久久| 国产成人精品网站| 日韩av一区二区在线| 一本一道久久a久久精品逆3p| 中文字幕成人精品久久不卡| 国产精品第3页| 欧美性生交xxxxx久久久| 爽爽爽爽爽爽爽成人免费观看| 国产一区二区三区三区在线观看| 综合网日日天干夜夜久久| 亚洲欧美日韩中文在线| 亚洲天堂男人天堂女人天堂| 欧美精品午夜视频| 成人国产在线激情| 久久久精品在线| 国产91露脸中文字幕在线| 亚洲aⅴ男人的天堂在线观看| 国产精品一区二区3区| 日本一区二区不卡| 久久99热精品这里久久精品| 亚洲一区精品电影| 91麻豆国产语对白在线观看| 日韩精品一二三四区| 91精品国产自产在线老师啪| 欧美激情一区二区三级高清视频| 51精品国产黑色丝袜高跟鞋| 日韩电影免费观看中文字幕| 欧美日韩亚洲高清| 欧美激情一区二区三区高清视频| 91精品久久久久久久久青青| 国产丝袜精品视频| 国产精品免费久久久久影院| 欧美高清不卡在线| 北条麻妃久久精品| 成人激情综合网| 欧美综合激情网| 日韩a**站在线观看| 亚洲成人精品在线| 一区二区亚洲欧洲国产日韩| 国产精品扒开腿做爽爽爽视频| 亚洲深夜福利视频| 青草成人免费视频| 国产精品丝袜久久久久久高清| 亚洲日韩欧美视频一区| 欧美xxxx18性欧美| 欧美最猛性xxxx| 色www亚洲国产张柏芝| 亚洲色图五月天| 日韩综合视频在线观看| 欧美亚洲免费电影| 国产在线不卡精品| 午夜精品三级视频福利| 精品国内亚洲在观看18黄| 久久久久久久国产精品视频| 亚洲欧美国产精品va在线观看| 日韩黄色在线免费观看| 搡老女人一区二区三区视频tv| 久久久精品在线观看| 日韩精品一区二区三区第95| 日产精品99久久久久久| 国产视频丨精品|在线观看| 亚洲精品免费网站| 日韩成人激情在线| 精品在线小视频| 欧美激情一区二区三区在线视频观看| 国产综合香蕉五月婷在线| 久久精品美女视频网站| 美女久久久久久久久久久| 亚洲电影在线观看| 精品福利樱桃av导航| 午夜精品久久久久久99热| 欧美日韩在线观看视频小说| 亚洲成人动漫在线播放| 国产视频久久久久久久| 97在线视频免费| 色综合五月天导航| 欧美日韩一区二区免费在线观看| 成人免费在线网址| 亚洲精品视频网上网址在线观看| 日韩在线视频播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 一区二区三区视频在线| y97精品国产97久久久久久| 蜜臀久久99精品久久久无需会员| 中文字幕亚洲欧美一区二区三区| 成人激情春色网| 亚洲精品久久久久国产| 欧美亚洲视频在线看网址| 亚洲成人精品av| 国产成+人+综合+亚洲欧美丁香花| 欧美黑人巨大xxx极品| 亚洲激情久久久| 亚洲精品久久7777777| 亚洲成在人线av| 国产精品日韩在线一区| 欧美日韩免费在线| 在线播放精品一区二区三区| 日韩中文字幕在线观看| 91最新在线免费观看| 91久久久久久国产精品| 精品偷拍一区二区三区在线看| 亚洲欧洲日韩国产| 亚洲国产高潮在线观看| 久久久久国产精品免费网站| 欧美黄网免费在线观看| 欧美插天视频在线播放| 成人黄色片在线| 国产精品成久久久久三级| 日韩一级黄色av| 国产精品无av码在线观看| 久久久人成影片一区二区三区| 欧美激情手机在线视频| 久久久国产精品一区| 91亚洲va在线va天堂va国| 欧美激情亚洲自拍| 久久精品国产一区|