3.3窗口类、窗口类对象和窗口

3.3.1三者之间的关系

C++窗口类对象与窗口并不是一回事,它们之间唯一的关系是C++窗口类对象内部定义了一个窗口句柄变量。窗口销毁时,窗口类对象销毁与否,要看其生命周期是否结束。但窗口类对象销毁,与之对应的窗口也将销毁。

3.3.2在窗口中显示按钮

显示一个按钮:
1、定义CButton类对象。
2、调用CButton类构造函数
3、调用CButton类Create函数创建这个按钮,从而把按钮窗口与CButton类对象关联起来

CButton::Create
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
lpszCaption:按钮控件的文本。
dwStyle:指定按钮控件的风格。不仅具有按钮风格,还有窗口风格。
rect:按钮控件的大小和位置
pParentWnd:按钮控件的父窗口
nID:按钮控件的标识

在框架窗口上产生一个按钮控件,是在窗口框架产生之后。
窗口创建时都会产生WM_CREATE消息,CMainFrame类提供一个OnCreate函数来响应此消息。该函数创建一个窗口,然后创建工具条和状态栏,因此我们在该函数最后完成按钮的创建

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
....
 CButton btn;
 btn.Create("按钮",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);
 return 0;
}

按钮标识ID为123,风格为子窗口和下按按钮风格,CMainFrame类对象this指针为其父窗口。
CButton btn;定义为了局部变量,CMainFrame类对象的OnCreate函数执行完毕就销毁了。所以将其定义为CMainFrame类的一个成员变量,访问权限为private实现信息隐藏。
添加成员变量的方法:
1、ClassView的类名上鼠标右键选择Add member variable/
2、弹出的对话中。Variable Type(变量类型):CButton,Variable Name(变量名):m_btn。Acess(访问权限):Private。

删除局部变量定义,将按钮的对象名称改为m_btn。

此时,还未显示窗口,需要在m_btn.Create函数后面添加:
m_btn.ShowWindow(SW_SHOWNORMAL);
显示窗口,显示类型为一般。

在这里插入图片描述
工具栏属于CMainFrame类窗口,标题栏和菜单栏位于非客户区,

若在CTestView类中创建按钮,会怎么样?
注释CMainFrame类OnCreate函数中的代码。
同样定义一个类成员变量:m_btn
CTestView类中没有OnCreate函数来响应WM_CREATE消息。既然窗口在创建时都会产生WM_CREATE消息,那么为视图类添加消息响应函数。
ClassView的类名上鼠标右键选择Add Windows Message Hander,记得单击AddHander,然后单击Add and Edit,就定义到它的消息处理函数处。

在这里插入图片描述

int CTestView::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;
}

运行程序:按钮位置发生了变化,因为这时this指针指向CTestView类的对象。如果想在CMainFrame类窗口上显示,需要用GetParent函数来获取父窗口的指针,即CTestView类窗口的父窗口CMainFrame类窗口。
将之前的代码改为:
m_btn.Create(“按钮”,WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),GetParent(),123);
按钮的位置与父窗口有关,而不是与代码所在类有关。

扫描二维码关注公众号,回复: 10522478 查看本文章

如果创建按钮时立刻显现出来,可以指定窗口风格为WS_VISIBLE,而不用调用ShowWindow函数了。
m_btn.Create(“按钮”,WS_CHILD|BS_DEFPUSHBUTTON|WS_VISIBLE,CRect(0,0,100,100),GetParent(),123);
在这里插入图片描述

发布了47 篇原创文章 · 获赞 3 · 访问量 865

猜你喜欢

转载自blog.csdn.net/qq_42148307/article/details/105322136
今日推荐