VC++深入详解:在窗口中显示按钮(1)[组图](3)
从例3-22所示代码可知,CMainFrame类的OnCreate函数首先调用基类CFrameWnd的OnCreate函数,创建一个窗口,然后创建工具条(m_wndToolBar)和状态栏(m_ wndStatusBar)对象。我们可以在该函数的最后完成按钮的创建工作,即在return语句之前添加例3-23所示代码中加灰显示的代码。
例3-23
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
CButton btn;
btn.Create("按钮",WS_CHILD | BS_DEFPUSHBUTTON,CRect(0,0,100,100),this, 123);
return 0;
}
其中,将该按钮的名称设置为“按钮”,其位置由CRect(0,0,100,100)这一矩形确定,ID号为123。前面已经讲过,按钮控件不仅具有按钮风格类型,还具有窗口风格类型,因此,在按钮的Create函数中指定该按钮具有WS_CHILD窗口风格类型,同时还具有BS_DEFPUSHBUTTON按钮风格类型,即下按按钮风格。
另外,我们知道每个对象都有一个this指针,代表对象本身。为了使按钮控件的父窗口就是框架窗口,这里可以直接将代表CMainFrame对象的this指针作为参数传递给按钮的Create函数。
编译并运行Test程序,但发现按钮并没有显示出来。问题的原因有两个:一是这里定义的btn对象是个局部对象,当执行到OnCreate函数的右大括号(})时,该对象的生命周期就结束了,就会发生析构。前面已经讲过,如果一个窗口与一个C++窗口类对象相关联,当这个C++对象生命周期结束时,该对象在析构时通常会把与之相关联的窗口资源进行回收。这就是说,当执行到例3-22所示的OnCreate函数的右大括号时,刚刚创建的btn窗口就被与之相关的C++对象销毁了。因此,不能将这个按钮对象定义为一个局部对象。解决方法是:将其定义为CMainFrame类的一个成员变量,可以将其访问权限定义为private类型以实现信息隐藏。
有多种方法可以定义一个类的成员变量,可以直接在该类的定义中添加成员变量定义代码,也可以利用VC++提供的工具来定义。后者的方法是:在ClassView标签页中的类名上单击鼠标右键,从弹出的快捷菜单上选择【Add member variable…】菜单命令,将弹出Add Member Variable对话框。通常,在定义类的成员变量名称时都以“m_”为前缀,表明这个变量是类的一个成员变量。在添加成员变量对话框的Variable Type(变量类型)文本框中输入变量类型CButton,Variable Name(变量名称)文本框中输入按钮对象名称m_btn,并为其选择private类型的访问权限,如图3.25所示。
图3.25 Add Member Variable对话框
然后单击对话框上的【OK】按钮,即可以在CMainFrame类的头文件中看到新成员变量的定义,代码如下:
private:
CButton m_btn;