zoukankan      html  css  js  c++  java
  • MFC菜单、工具栏和状态栏

    菜单:CMenu类

    CMenu类的主要成员函数
    
           BOOL LoadMenu(UINT nIDResource);
    
           加载菜单资源,并将其附加到CMenu对象上。参数nIDResource指定了要加载的菜单资源的ID。如果菜单加载成功则返回TRUE,否则返回FALSE。
    
           BOOL DeleteMenu(UINT nPosition,UINT nFlags);
    
           在菜单中删除一个菜单项。参数nPosition指定要删除的菜单项。参数nFlags就用来解释nPosition的意义,为MF_BYCOMMAND时说明nPosition表示菜单项的ID,为MF_BYPOSITION时说明nPosition表示菜单项的位置,第一个菜单项的位置为0。如果删除菜单项成功则返回TRUE,否则返回FALSE。
    
           BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = 0);
    
           用来在指定位置显示一个浮动的弹出式菜单。参数nFlags指定屏幕坐标和鼠标位置的标志,可以是以下取值:
    
           TPM_CENTERALIGN:菜单在水平方向上相对于参数x指定的坐标值居中显示
           TPM_LEFTALIGN:菜单的左侧与参数x指定的坐标值对齐
           TPM_RIGHTALIGN:菜单的右侧与参数x指定的坐标值对齐
           TPM_BOTTOMALIGN:菜单的底部与参数y指定的坐标值对齐
           TPM_TOPALIGN:菜单项的顶部与参数y指定的坐标值对齐
           TPM_VCENTERALIGN:菜单在垂直方向上相对于参数y指定的坐标值居中显示
    
           这里先介绍这几个比较常用的,其他可参见MSDN。参数x指定弹出式菜单的水平方向的屏幕坐标,参数y指定菜单顶部垂直方向上的屏幕坐标,参数pWnd指明哪个窗口拥有此弹出式菜单,不能为NULL,参数lpRect忽略。
    
           UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);
    
           在弹出菜单中为菜单项增加选中标记或移除选中标记。参数nIDCheckItem指定要选中或取消选中的菜单项。参数nCheck指定菜单项的选中状态和如何根据nIDCheckItem确定菜单项的位置,可以是MF_CHECKED或MF_UNCHECKED与MF_BYPOSITION或MF_BYCOMMAND的组合,这几个标志的含义如下:
    
           MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID
           MF_BYPOSITION:说明参数nIDCheckItem表示菜单项的位置,第一个菜单项的位置是0
           MF_CHECKED:为菜单项添加选中标记
           MF_UNCHECKED:为菜单项移除选中标记
    
           该函数返回菜单项之前的状态:MF_CHECKED或MF_UNCHECKED, 如果菜单项不存在则返回0xFFFFFFFF。
    
           UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);
    
           激活、禁用菜单项或使其变灰。参数nIDEnableItem指定要激活、禁用或变灰的菜单项。参数nEnable指定操作的类型,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED与MF_BYCOMMAND或MF_BYPOSITION的组合,这些值的含义如下:
    
           MF_BYCOMMAND:同CheckMenuItem
           MF_BYPOSITION:同CheckMenuItem
           MF_DISABLED:禁用菜单项,使其不能被选择但不变灰
           MF_ENABLED:激活菜单项,使其能够被选择并由变灰状态恢复
           MF_GRAYED:禁用菜单项,使其不能被选择并变灰
    
           该函数返回菜单项之前的状态:MF_DISABLED、MF_ENABLED或MF_GRAYED
    
           CMenu* GetSubMenu(int nPos) const;
    
           获取弹出菜单的CMenu对象。参数nPos指定弹出菜单在菜单中的位置,不能使用ID。返回值是CMenu对象的指针,该CMenu对象的m_hMenu成员为由nPos指定的弹出菜单的句柄,如果不存在这样的CMenu对象则返回NULL,然后创建一个临时弹出菜单。
    
    菜单消息
    
           菜单主要能发送两种消息:COMMAND消息和UPDATE_COMMAND_UI消息。下面分别讲解:
    
           COMMAND消息:在菜单项被点击时发送该消息。
    
           UPDATE_COMMAND_UI消息:用来维护菜单项的各项状态,包括激活、禁用、变灰、选中、未选中等。在下拉菜单每次打开的时候,所有菜单项的此消息都会被发送出去。如果所属类中为菜单项的该消息添加了处理函数,则执行相应函数更新菜单状态,如果菜单项没有此消息处理函数,也没有COMMAND消息的处理函数,那么它就会变灰。
     

    工具栏:CToolBar类

    CToolBar类的主要成员函数:
    
           virtual BOOL CreateEx(
                     CWnd* pParentWnd,
                     DWORD dwCtrlStyle = TBSTYLE_FLAT,
                     DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
                     CRect rcBorders = CRect(0, 0, 0, 0),
                     UINT nID = AFX_IDW_TOOLBAR
            );
    
           创建工具栏对象。参数pParentWnd为工具栏父窗口的指针。参数dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。参数dwStyle为工具栏的风格,默认取值WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部, 各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。参数rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。参数nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。
    
           BOOL LoadBitmap(UINT nIDResource);
    
           为工具栏加载位图。参数nIDResource为位图资源的ID。成功则返回TRUE,否则返回FALSE。注意,这里的位图资源应当为每个工具栏按钮都提供位图,如果图片不是标准大小(16像素宽,15像素高),则需要调用SetSizes成员函数调整按钮大小和图片大小。
    
           BOOL LoadToolBar(UINT nIDResource);
    
           加载由nIDResource指定的工具栏。参数nIDResource为要加载的工具栏的资源ID。成功则返回TRUE,否则返回FALSE。
    
           void SetSizes(SIZE sizeButton,SIZE sizeImage);
    
           设置工具栏按钮的大小和图片的大小。参数sizeButton为工具栏按钮的像素大小。参数sizeImage为图片的像素大小。
    
           void SetButtonStyle(int nIndex,UINT nStyle);
    
           设置工具栏按钮或分隔线的风格,或者为按钮分组。参数nIndex为将要进行设置的按钮或分隔线的索引。参数nStyle为按钮风格,可以是以下取值:
    
           TBBS_BUTTON   标准按钮(默认)
           TBBS_SEPARATOR   分隔条 
           TBBS_CHECKBOX   复选框 
           TBBS_GROUP   标记一组按钮的开始
           TBBS_CHECKGROUP   标记一组复选框的开始
           TBBS_DROPDOWN   创建下拉列表按钮
           TBBS_AUTOSIZE   按钮的宽度根据按钮文本计算,而不基于图片大小 
           TBBS_NOPREFIX   按钮的文本没有快捷键前缀
    
           UINT GetButtonStyle(int nIndex) const;
    
           获取工具栏按钮或分隔条的风格。风格可参考SetButtonStyle。参数nIndex为按钮或分隔条的索引。
    
           BOOL SetButtonText(int nIndex,LPCTSTR lpszText);
    
           设置工具栏按钮的文本。参数nIndex为工具栏按钮的索引。参数lpszText为指向要设置的文本字符串的指针。设置成功则返回TRUE,否则返回FALSE。
    
           CString GetButtonText(int nIndex) const;
    
           获取工具栏按钮上显示的文本。参数nIndex为工具栏按钮的索引。
     

    工具栏的创建

    1. 创建工具栏资源。

    2. 构造CMFCToolBar类的对象。

    3. 调用CMFCToolBar类的Create或CreateEx成员函数创建工具栏。

    4. 调用LoadToolBar成员函数加载工具栏资源。

    工具栏的停靠

    工具栏停靠的步骤及需要调用的函数如下(前两个步骤可以颠倒顺序):

       1. 在框架窗口中启用停靠。

               若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。可以在CFrameWndEx类中调用下面的成员函数来实现:

    BOOL EnableDocking(DWORD dwDockStyle);

               该函数采用一个DWORD参数,用来指定框架窗口的哪个边可以接受停靠,可以有四种取值:CBRS_ALIGN_TOP(顶部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左侧)、CBRS_ALIGN_RIGHT(右侧)。如果希望能够将控制条停靠在任意位置,将CBRS_ALIGN_ANY作为参数传递给EnableDocking。

       2. 工具栏启用停靠。

               框架窗口启用停靠准备好后,必须以相似的方式准备工具栏。为想要停靠的每一个工具栏CMFCToolBar对象调用下面的函数:

    virtual void EnableDocking(DWORD dwAlignment);

               允许工具栏停靠到框架窗口,并指定工具栏应停靠的目标边。此函数指定的目标边必须与框架窗口中启用停靠的边匹配,否则工具栏无法停靠,为浮动状态。

    3. 停靠工具栏。

               当用户试图将工具栏放置在允许停靠的框架窗口某一边时,需要框架CFrameWndEx类调用以下函数:

    void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);

               参数pBar为要停靠的控制条的指针,参数nDockBarID为要停靠的框架窗口某条边的ID,可以是以下四种取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。

     

    状态栏:CStatusBar类

     
    CStatusBar类几个主要的成员函数:
    
           virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR);
    
           创建一个状态栏。参数pParentWnd为状态栏父窗口的指针,参数dwStyle为状态栏的风格,除了标准的Windows风格外,它还支持:
    
           CBRS_TOP:位于框架窗口的顶部。
    
           CBRS_BOTTOM:位于框架窗口的底部。
    
           CBRS_NOALIGN:父窗口大小改变时状态栏不会被重新定位。
    
           参数nID指定状态栏的ID。
    
           BOOL SetIndicators(const UINT* lpIDArray, int nIDCount);
    
           为每个指示器设置显示文本,具体来说,就是用lpIDArray数组中的对应元素为每个指示器设置一个ID,然后加载每个ID代表的字符串,设置为这些指示器的显示文本。参数lpIDArray为指向一个ID数组的指针,参数nIDCount为lpIDArray数组的元素个数。
    
           UINT GetItemID(int nIndex) const; 
    
           获取由nIndex指定的指示器的ID。参数nIndex为要获取ID的指示器索引。
    
           CString GetPaneText(int nIndex) const;
    
           获取状态栏窗格中显示的文本。参数nIndex为要获取文本的窗格的索引。返回值为包含窗格文本的CString对象。
    
           BOOL SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE);
    
           设置状态栏窗格的显示文本。参数nIndex为要设置文本的窗格的索引,参数lpszNewText为指向新的窗格文本的指针,参数bUpdate表示是否设置后立即更新显示。如果设置成功则返回TRUE,否则返回FALSE。

    状态栏的创建

    1. 构造一个CMFCStatusBar类的对象。
    
           在MainFrm.h文件中,为CMainFrame类定义了一个成员对象:CMFCStatusBar     m_wndStatusBar;。
    
    2. 调用CMFCStatusBar::Create函数来创建状态栏窗口。
    
           在CMainFrame::OnCreate函数的实现中,我们可以找到CMFCStatusBar::Create函数的调用:
    
    if (!m_wndStatusBar.Create(this))   
    {   
        TRACE0("Failed to create status bar
    ");   
        return -1;      // fail to create   
    }  
    
    3. 调用CMFCStatusBar::SetIndicators函数为状态栏划分窗格,并为每个指示器设置显示文本。
    
           CMFCStatusBar::SetIndicators函数需要一个ID数组的参数,在MainFrm.cpp中,如下定义了一个窗格ID的数组:
    
    static UINT indicators[] =   
    {   
        ID_SEPARATOR,           // status line indicator   
        ID_INDICATOR_CAPS,   
        ID_INDICATOR_NUM,   
        ID_INDICATOR_SCRL,   
    };  
           indicators数组定义了状态栏窗格的划分信息。第一个元素一般为ID_SEPARATOR,对应的窗格用来显示命令提示信息,上面数组中的后三项为指示器文本的字符串ID,可以根据这些ID在String Table字符串资源中找到相应的字符串,查找方法是,在Resource View资源视图中,打开String Table字符串资源,可以看到有ID、Value和Caption三列,在ID列中找到需要的ID,对应的Caption列文本就是要查找的字符串。ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL对应的字符串分别是CAP、NUM、SCRL,对应的三个窗格分别为Caps Lock指示器、Num Lock指示器和Scroll Lock指示器。
    
           定义了指示器数组就可以使用CMFCStatusBar::SetIndicators函数为状态栏划分窗格了,依然是在CMainFrame::OnCreate函数中调用:
    
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));  
           这样状态栏就创建完成了,之后我们可以通过CMFCStatusBar::SetPaneText设置窗格的文本。
     
     
     
     
     
     
  • 相关阅读:
    第二周作业
    第一周作业
    抓老鼠啊~亏了还是赚了?
    打印沙漏
    寒假作业2
    我与老师
    自我介绍
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周实验报告(五)&周总结
  • 原文地址:https://www.cnblogs.com/lucas-hsueh/p/3714154.html
Copyright © 2011-2022 走看看