龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++深入详解:在窗口中显示按钮(1)[组图](3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
从例3-22所示代码可知,CMainFrame类的OnCreate函数首先调用基类CFrameWnd的OnCreate函数,创建一个窗口,然后创建工具条(m_wndToolBar)和状态栏(m_ wndStatusBar)对

  从例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;

精彩图集

赞助商链接