目录
OnCreate函数(MainFrm.cpp)CMainFrame类:
接下:VC++Button Styles Window Styles
为了更好地理解窗口类、窗口类对象和窗口之间的关系,接下来实现在窗口中显示一个按钮这一功能,在已有的Test程序(设为启动项目)中实现。首先需要创建一个按钮类对象,按钮对应的MFC类是CButton类,其继承层次结构如图所示,得知 CButton类派生于CWnd类。
在MFC提供的资源类中,有些类的对象的构造(包括对象构造与初始化)直接通过其构造函数就可以完成。也就是说,这些对象的构造函数包含了这个对象的初始化操作。但有些对象的产生除了调用构造函数外,还需要调用其他一些函数来进行初始化的工作,然后才能使用该对象。对于一个CButton对象,在定义之后就可以使用了。但是作为一个窗口类对象,即CWnd对象,如果在构造之后还需要产生这个窗口的话,则需要调用CreateEx函数来完成初始化工作。也就是说,如果要显示一个按钮,那么在定义这个 CButton类对象之后(即调用CButton类的构造函数之后)还需要调用CButton的Create函数创建这个按钮窗口,从而把按钮窗口与CButton对象关联起来。
CButton的Create函数声明如下。
CButton::Create
virtual BOOL Create(
LPCTSTR lpszCaption,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
各个参数的意义如下所述。
■ lpszCaption
指定按钮控件的文本。
■ dwStyle
指定按钮控件的风格。按钮控件不仅具有按钮风格类型,还具有窗口风格类型。多种风格类型可以通过位或操作加以组合。
■ rect
指定按钮控件的大小和位置。该参数是RECT结构体类型,通过指定左上角和右下角两个点的坐标定义一个矩形。结构体也是一种特殊的类,所以可以用类CRect来构造一个RECT结构体。
■ pParentWnd
指定按钮控件的父窗口。这是一个 CWnd 类型的指针。MFC 中不再通过窗口句柄,而是通过一个与窗口相关的C++窗口类对象指针来传递窗口对象。
■ nID
指定按钮控件的标识。
为了在框架窗口上产生一个按钮控件,显然应该是在框架窗口产生之后,再创建该按钮控件,否则没有地方放置它。窗口创建时都会产生WM_CREATE消息,CMainFrame类提供一个OnCreate函数,该函数就是用来响应这条窗口创建消息的。该函数的默认实现代码如下所示。
OnCreate函数(MainFrm.cpp)CMainFrame类:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}