VisualFC使用 - UpdateUI

来源:互联网 发布:关于乒乓球赛事的软件 编辑:程序博客网 时间:2024/05/02 01:33

WTL提供了菜单和工具栏以及控件的UI更新机制,VisualFC对WTL这种UpdateUI机制具备良好的支持,我们将使用VFC的WTL向导为对话框应用程序和视图程序进行可视化UpdateUI设计。事例如下:

一、对话框应用程序:使用WTL新建一个对话框应用程序,注意只能使用非模式对话框,WTL的模式对话框不支持UpdateUI机制。为了进一步说明,我们利用资源编辑器添加一菜单IDR_MENU1,添加简单的文件菜单,包括ID_FILE_OPEN(打开)和ID_APP_EXIT(退出)两个菜单项,将IDD_MAINDLG的MENU设置为IDR_MENU1,这样我们就有了一个支持菜单的对话框窗口。运行VFC的WTL类向导,将Class Name切换为CMainDlg,然后选择WTL UpdateUI页面,上面列表为支持UpdateUI的资源列表(包括控件和菜单ID),下面列表为应用了UpdateUI属性的资源列表。选择ID_APP_ABOUT,点击Add UpdateUI按钮,将弹出UpdateUI编辑窗口,默认属性为CHILDWINDOW,直接OK确认即可,将在下面列表看到改变。再选择ID_FILE_OPEN,添加UpdateUI属性,这次的UpdateUI编辑窗口默认为MENUPOPUP,还有一个选择为TOOLBAR,因为我们未使用工具栏,所以不需要选择,按OK确认即可。我们按下VFC的WTL类向导的确认键,将在应用程序中自动添加以下代码。

BEGIN_UPDATE_UI_MAP(CMainDlg)
    UPDATE_ELEMENT(ID_APP_ABOUT, UPDUI_CHILDWINDOW)
    UPDATE_ELEMENT(ID_FILE_OPEN, UPDUI_MENUPOPUP)
END_UPDATE_UI_MAP()

WTL自带的应用程序向导没有为对话框应用程序添加UpdateUI的完全支持,如果要支持控件的更新,需要在OnIdle中添加  UIUpdateChildWindows(),如果要支持菜单的更新,需要将CUpdateUI<CMainDlg>加入到消息链表。代码如下:

class CMainDlg : public CDialogImpl<CMainDlg>public CUpdateUI<CMainDlg>,
        
public CMessageFilter, public CIdleHandler
{
。。。。。。
    
virtual BOOL OnIdle()
    
{
        UIUpdateChildWindows();
//我们手工加入以支持控件的更新
        return FALSE;
    }


    BEGIN_UPDATE_UI_MAP(CMainDlg)
        UPDATE_ELEMENT(ID_APP_ABOUT, UPDUI_CHILDWINDOW)
        UPDATE_ELEMENT(ID_FILE_OPEN, UPDUI_MENUPOPUP)
    END_UPDATE_UI_MAP()

    BEGIN_MSG_MAP(CMainDlg)
        COMMAND_ID_HANDLER(ID_APP_EXIT, OnAppExit)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
        COMMAND_ID_HANDLER(IDOK, OnOK)
        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
        CHAIN_MSG_MAP(CUpdateUI
<CMainDlg>//我们手工加入以支持菜单的更新
    END_MSG_MAP()
。。。。。。
}
    现在可以加入对需要更新的控件或菜单的操作部分了。代码如下:
UIEnable(ID_FILE_OPEN,FALSE); //使ID_FILE_OPEN禁用
UISetText(ID_APP_ABOUT,_T("MyAbout"); //更改ID_APP_ABOUT的文本
。。。。。。

   

二、视图框架应用程序:视图框架应用程序的UpdateUI主要是对菜单和工具栏进行更新,WTL自带的的应用程序向导默认就生成了完整的支持,我们来试一下。新建一个WTL的视图框架应用程序,为了进一步说明,我们在工具栏上添加一个按钮ID_VIEW_STATUS_BAR来控制状态栏的显示,运行VFC的WTL类向导,将Class Name切换为CMainDlg,选择WTL UpdateUI页面,上面列表为控件及菜单ID列表,下面的列表为使用了UpdateUI属性的ID列表,目前已包括ID_VIEW_TOOLBAR和ID_VIEW_STATUS_BAR,可以看到ID_VIEW_STATUS_BAR的属性为UPDUI_MENUPOPUP,我们选择下面列表的ID_VIEW_STATUS_BAR,按Del UpdateUI将其删除,然后按Add UpdateUI为其添加新的UpdateUI属性,将弹出编辑UpdateUI窗口,默认的MENUPOPUP已经选中,我们将TOOLBAR也选中按OK即可。完成后按VFC的WTL类向导确认按钮,将自动生成以下代码:

BEGIN_UPDATE_UI_MAP(CMainFrame)
    UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP 
| UPDUI_TOOLBAR)
    UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
    
//UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)
END_UPDATE_UI_MAP()

编译运行,点击工具栏上的ID_VIEW_STATUS_BAR,可能看到ID_VIEW_STATUS_BAR已经能够自动选择Check和非Check状态了。

原创粉丝点击