窗口创建时都会产生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中创建按钮的位置一样,可见按钮的位置与其父窗口有关,而不是与创建它的代码所在的类有关。