啰啰嗦嗦学习VC++_<<第六课:菜单>>

作者在 2010-07-19 19:31:41 发布以下内容

 

一、Pop-up

弹出菜单复选框,当这个被选中的时候就会有弹出的菜单,同时取消了ID号和prompt的提示。

(&H)为快捷键提示显示为(H)

作为弹出菜单(Pop-up)不能完成命令响应的。

二、ID标识:

ID标识要用大写字母。MFC对资源进行标识的时候都是用大写进行标识,我们跟MFC保持相同的习惯也用最好是大写的标识。

ID去名字时在ID后加一个字母标识他是那一种标识。如:”IDM_”为菜单的ID

三、所见即所得。

四、菜单响应顺序、消息的分类:

1、我们通过”View””ClassWizard”来给自定义的资源进行响应的编辑。

frame\view\doc\app四个类中Ontest()的响应顺序:

View(视图程序类)-Doc(文档程序类)-Frame(应用程序类)-App(应用程序类)

2、消息分类:

n        标准消息

      WM_COMMAND之外,所有以WM_开头的消息。

      CWnd派生的类,都可以接收到这类消息。如:WM_CHAR,WM_CREATE,WM_PAIN

       CCmdTargetCWnd的父类。凡是从CWnd派生出来的类即可以接收标准消息也可以接收命令消息。

n        命令消息

      来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。

       CCmdTarget派生的类,都可以接收到这类消息。 

       CDocumentCWinApp都是从CCndTarget中派生出来因此不能接受标准消息,只能接收命令消息。

n        通告消息

      由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。

       CCmdTarget派生的类,都可以接收到这类消息。

3、接收一个命令消息时:


1

2

3

4

5

6

protected:

       //{{AFX_MSG(CMenu3View)

       afx_msg void OnPhno();

       afx_msg void OnTest();

       //}}AFX_MSG

       DECLARE_MESSAGE_MAP()


在消息映射中添加命令消息函数原型如34行代码。


1

2

3

4

5

6

7

8

9

10

11

12

// CMenu3View

IMPLEMENT_DYNCREATE(CMenu3View, CView)

BEGIN_MESSAGE_MAP(CMenu3View, CView)

       //{{AFX_MSG_MAP(CMenu3View)

       ON_COMMAND(IDM_PHNO, OnPhno)

       ON_COMMAND(IDM_TEST, OnTest)

       //}}AFX_MSG_MAP

       // Standard printing commands

       ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

       ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

       ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

END_MESSAGE_MAP()


在原文件中(从构造函数前找到上边的代码),在源文件的消息映射当中用ON_COMMAND添加消息映射,如56行,将我们菜单项的ID号和命令消息响应函数相关联。ON_COMMAND(IDM_TEST, OnTest); IDM_TEST: 菜单项的IDOnTest: 命令消息响应函数。


1

2

3

4

5

6

7

void CMenu3View::OnTest()

{

       // TODO: Add your command handler code here

       AfxMessageBox("MB_ICONSTOP",NULL,MB_OK);

       AfxMessageBox("这是一个VIEW的提示,你能看到多少:

              11111111111111111111111111111111111111",MB_YESNO|MB_ICONEXCLAMATION );   

}


最后:这个是命令响应函数。

她的形式与标准消息添加是一样的,只是命令消息是通过ON_COMMAND宏完成命令消息的映射。

4、命令消息的路由与标准消息的路由有区别:

AMFCAfxWndProc替换了窗口过程函数;

BAfxWndProc调用AfxCallWndPro窗口回调函数;

CAfxCallWndPro调用WindowProWindowProCwnd的成员函数。不管标准消息、命令消息、通告消息都会到WindowPro窗口过程函数里边来。

DWindowPro调用OnWndMsgOnWndMsg判断消息类型,调用相应的消息处理函数。

E、若命令消息OnWndMsg调用OnCommand,若为通告消息OnWndMsg调用OnNotify函数。

OnCommand中完成命令消息路由。以MFC默认生成的单窗口程序为例命令消息路由过程也就是当我们点击菜单项时接收消息的顺序为:CMainFrame框架类将消息交给子窗口View(View类首先进行处理)→View没有找到相关消息映射就会将这个消息交给Doc文档类若文档类没有相应响应就会将消息交还给View→View类将这个消息交还给CMainFrame,此时CMainFrame才查看有没有对这个消息进行响应的函数,有则进行响应如果没有CMainFrame就将这个消息交给App应用程序类进行响应。

F、最后OnCommandOnNotify都会调用OnCmdMsg进行处理。

五、应用程序框架函数

用的大函数:

AfxMessageBox();

MessageBox();

1AfxMessageBox

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );

int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );

Return Value

Zero if there is not enough memory to display the message box; otherwise one of the following values is returned:

  • IDABORT   The Abort button was selected.
  • IDCANCEL   The Cancel button was selected.
  • IDIGNORE   The Ignore button was selected.
  • IDNO   The No button was selected.
  • IDOK   The OK button was selected.
  • IDRETRY   The Retry button was selected.
  • IDYES   The Yes button was selected.

If a message box has a Cancel button, the IDCANCEL value will be returned if either the ESC key is pressed or the Cancel button is selected. If the message box has no Cancel button, pressing the ESC key has no effect.

The functions AfxFormatString1 and AfxFormatString2 can be useful in formatting text that appears in a message box.

Parameters

lpszText

Points to a CString object or null-terminated string containing the message to be displayed in the message box.

nType

The style of the message box. Apply any of the message-box styles t

默认分类 | 阅读 1466 次
文章评论,共0条
游客请输入验证码