窗口类,窗口类对象与窗口

来源:互联网 发布:阿里云资源短信包 编辑:程序博客网 时间:2024/04/27 16:53

 

 

  窗口创建时都会产生WM_CREATE消息,CMainFrame提供一个OnCreate函数,该函数是用来响应这条窗口创建消息的。在OnCreate函数return语句签添加如下代码

   CButton btn;
   btn.Create("按键",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123); 

  我们发现按钮并没有显示出来。原因一:btn是一个局部变量,当执行到OnCreate函数的右大括号时,该对象的生命周期就结束了,就会发生析构。如果一个窗口与一个C++窗口类对象相关联,当这个C++对象生命周期结束时,该对象在析构时通常会把与之相关联的窗口资源进行回收。所以可以为CMainFrame类添加一个CButton类型的成员变量:m_btn。原因二:一个窗口成功创建之后,应该将这个窗口显示出来。运行Test2程序,运行结果如下:

  之所以该按钮显示在工具栏上是因为工具栏位于主框架类的客户区。如果我们在CTest2View类中实现类似的操作,既然窗口创建时都会产生一个WM_CREATE消息,需要添加让CTest2View响应WM_CREATE消息,实现代码:

int CTest2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 // TODO: Add your specialized creation code here
 m_btn.Create("按键",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);
 m_btn.ShowWindow(SW_SHOWNORMAL);

 return 0;
}

则结果为:

  有趣的是若想让按钮的父窗口为CMainFrame类窗口,可以调用GetParent函数来获得视类的父窗口对象的指针,并将该指针传递给按钮的Create函数,实现代码:

  int CTest2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
    if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;
   // TODO: Add your specialized creation code here
   m_btn.Create("按键",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),GetParent(),123);
   m_btn.ShowWindow(SW_SHOWNORMAL);

   return 0;

       }

 

  按钮的位置又和在CMainFrame中创建按钮的位置一样,可见按钮的位置与其父窗口有关,而不是与创建它的代码所在的类有关。