2008年(884)
分类: C/C++
2008-08-06 10:04:39
首先,我们来改造这个对话框程序。因为是个框架程序,所以做为一个对话框我们假设这个对话框要有可改变窗体尺寸的要求,我们先更改窗体属性,显示主对话框的属性对话框(View -> Properties),在Dialog Properties对话框中,进入Styles页,将Border列表中选择Resizing,并将Minimize box以及Maximize box复选框选上,为了防止控件在改变尺寸时闪烁,选上Clip children选项,最终如下图所示:
这样更改之后,对话框就在运行时可以改变尺寸大小了,也可以最大化、最小化,但是我们画上去的TangramMiniCtrl组件并不会同步更改大小,这样我们有必要响应主对话框的确WM_SIZE消息,并在此消息处理过程中改变TangramMiniCtrl组件的尺寸。
首先,响应WM_SIZE消息,在ClassView中,右击主对话框类(CTutorial1Dlg),在右击菜单中选择Add Windows Message Handler…项,在弹出的对话框中,从左边的New Windows messages/events列表中选择WM_SIZE并双击(选择后单击Add Handler也一样),此对话框自动将WM_SIZE消息加入到右边的Existing message/event handlers列表中。然后在右边的列表中双击WM_SIZE项,VC自动转到OnSize(…)函数中,我们在这里加入以下代码:
if (IsWindow(m_wndMiniCtrl.m_hWnd)) { m_wndMiniCtrl.MoveWindow(0,0,cx,cy,false); }最终代码如下:
CRect rt; GetClientRect(&rt); m_wndMiniCtrl.MoveWindow(0,0,rt.Width(),rt.Height(),false);这样程序一启动就会调节尺寸, 现在尺寸合理了,但是没有退出的地方,我们给对话框加入一个菜单(Insert -> Resource…)在弹出的Insert Resource对话框中,选择Menu,然后单击New按钮,加入一个菜单(IDR_MENU1),我们加入的菜单简单一点,就一个File菜单下有一项Exit项(ID为ID_FILE_EXIT),此Exit项对应的于CTutorial1Dlg类,添加此项的COMMAND消息,处理函数为OnFileExit(),在函数体内加入退出代码(我加入了保存框架的功能):
m_wndMiniCtrl.Save(); CDialog::OnOK();然后设置主对框资源的菜单为IDR_MENU1,对话框属性中的General页将Menu项设置为IDR_MENU1,最终编译运行效果图如下:
BOOL SetCaption(LPCTSTR strObjName, LPCTSTR strCaption);
该方法有两个参数,第一个参数为Tangram节点对象的名称,第二个参数为我们要设置的新标题,两个参数都为字符串类型,返回布尔型,表示设置是否成功。
为了改变标题,我们继续在BOOL CTutorial1Dlg::OnInitDialog()函数体中加入以下代码:
m_wndMiniCtrl.SetCaption(_T("page1"),_T("Main")); m_wndMiniCtrl.SetCaption(_T("page2"),_T("About"));
加入此两行代码后,分页上的标题将被修改为Main、About。
在这步之后,我新建了一个CAboutDlg对象,并将此对象设置到Page2中,要将一个对话框放在另一个对话框中,最好做一些有必要的风格修改,我将CAboutDlg对话框的风格属性修改结果如下:Style修改为Child,Border修改为None,并将上面的OK按钮设置为不可见,这样是为了防止用户单击此按钮而销毁此窗体。
具体的在page2中安装CAboutDlg的分以下几步:
1、在CTutorial1Dlg定义一个类型为CAboutDlg*的成员变量m_pAboutDlg;
2、分配(new)一新CAboutDlg对象给m_pAboutDlg,并创建对象(Create);
3、安装窗口,利用SetWnd()方法,Tangram节点名称为page2;
4、删除(delete)分配的空间。
具体的代码可以查看源码,我这里就不贴出来了。通过上面的修改后,我们的结果如下:
通过上图,我们可以看出标题已经修改了,而且给第二页添加了对象。
现在新的问题是可能你正在看About页,然后用File菜单中的Exit功能退出程序,由于退出的时候记住了框架,因此程序重新启动的时候还是会显示为About页,可能你认为这样不好,你要求每次启动时都应该显示Main页,那么你就有必要使用一个新的方法SetActive()。
BOOL SetActive(LPCTSTR strObjName);
该方法需要一个参数为Tangram节点对象名称,返回一个布尔值,表示设置是否成功。
我们在BOOL CTutorial1Dlg::OnInitDialog()函数体中加入此语句:
m_wndMiniCtrl.SetActive(_T("page1"));
表示每一次启动程序时默认显示第一页。
好了,这一篇就介绍到这里,主要介绍了两个方法:SetCaption与SetActive,都很方便使用,在下一篇中我将完成一些基本的通信,大家将看到更高级的效果与更好的体验。
下载本文示例代码