VC动态生成菜单项的实现方法
本例所述为使用VC编写的一个可以动态生成菜单项的类文件,这里展示的是其核心代码,代码备有比较详细的注释,相对而言理解起来并不复杂。
主要功能代码如下:
#include"stdafx.h" #include"Test.h" #include"TestDlg.h" #ifdef_DEBUG #definenewDEBUG_NEW #endif //用于应用程序“关于”菜单项的CAboutDlg对话框 classCAboutDlg:publicCDialog { public: CAboutDlg(); //对话框数据 enum{IDD=IDD_ABOUTBOX}; protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持 //实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD) { } voidCAboutDlg::DoDataExchange(CDataExchange*pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) END_MESSAGE_MAP() //CTestDlg对话框 CTestDlg::CTestDlg(CWnd*pParent/*=NULL*/) :CDialog(CTestDlg::IDD,pParent) { m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); } voidCTestDlg::DoDataExchange(CDataExchange*pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CTestDlg,CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BTNADDSYSTEMMENU,OnBnClickedBtnaddsystemmenu) END_MESSAGE_MAP() //CTestDlg消息处理程序 BOOLCTestDlg::OnInitDialog() { CDialog::OnInitDialog(); //将\“关于...\”菜单项添加到系统菜单中。 //IDM_ABOUTBOX必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 //执行此操作 SetIcon(m_hIcon,TRUE);//设置大图标 SetIcon(m_hIcon,FALSE);//设置小图标 //TODO:在此添加额外的初始化代码 returnTRUE;//除非设置了控件的焦点,否则返回TRUE } voidCTestDlg::OnSysCommand(UINTnID,LPARAMlParam) { if(nID==ID_FILE_OPEN) { MessageBox("测试添加系统菜单功能","信息提示",MB_OK); } elseif((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); } } //如果向对话框添加最小化按钮,则需要下面的代码 //来绘制该图标。对于使用文档/视图模型的MFC应用程序, //这将由框架自动完成。 voidCTestDlg::OnPaint() { if(IsIconic()) { CPaintDCdc(this);//用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0); //使图标在工作矩形中居中 intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //绘制图标 dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSORCTestDlg::OnQueryDragIcon() { returnstatic_cast<HCURSOR>(m_hIcon); } voidCTestDlg::OnBnClickedBtnaddsystemmenu() { CMenu*pMenu=GetSystemMenu(FALSE); pMenu->AppendMenu(0,ID_FILE_OPEN,"显示提示信息"); MessageBox("增加系统菜单操作成功!","信息提示",MB_OK); }