📄 visual c++ mfc 简明教程.txt
字号:
30 // Create the window itself
31 Create(NULL,
32 "Hello World!",
33 WS_OVERLAPPEDWINDOW,
34 CRect(0,0,200,200));
35 // Create a static label
36 cs = new CStatic();
37 cs->Create("hello world",
38 WS_CHILD|WS_VISIBLE|SS_CENTER,
39 CRect(50,80,150,150),
40 this);
41 }
CStatic 构造函数是在为其分配内存时调用的,然后就调用了 Create 函数来建立 CStatic 控制的窗口。Create 函数所使用的参数与窗口建立函数所使用的参数是类似的(第31行)。第一个参数指定了控制中所要显示的文本内容。第二个参数指定了类型属性。类型属性在下一讲中将详细介绍。在次我们使用的是子窗口类型(既在别的窗口中显示的窗口),还有它是可见的,还有文本的显示位置是居中的。第三个参数决定了控制的大小和位置。第四参数表示该子窗口的父窗口。已经建立了一个静态控制,它将出现在应用程序窗口上,并显示指定的文本。
结论
第一次浏览该代码,也可能不是很熟悉和有些让人烦恼。但是不要着急。从程序员的观点来看,整个程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一讲中,我们详细向你介绍36至40行代码的含义,并可看到定制 CStatic 控制的几个选项。
第三部分:MFC样式
控制是用来建立Windows应用程序用户界面的用户界面对象。你所见到的大部分Windows应用程序和对话框只不过是由一些控制所组成的、用来实现程序功能的东西。为了建立有效的应用程序,你必须完全理解在Windows应用程序中应该如何合理的使用控制。有六个基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增强了的控制。你需要理解的是那个控制能做些什么、你应该如何控制它的外表和行为以及如何让控制能响应用户事件。只要掌握了这些,再加上掌握了菜单和对话框,你就可以建立你所想象的任何Windows应用程序。你可以象本教程这样用程序代码来建立控制,也可以使用资源编辑器通过资源文件来建立。当然,对话框编辑器更方便些,它对于已经基本掌握了控制的情况下特别有用。
最简单的控制是CStatic, 它是用来显示静态文本的。CStatic类没有任何数据成员,它只有少量的成员函数:构造函数、Create函数(用于获取和设置静态控制上的图标)等等。它不响应用户事件。因为它的简单性,所以最好把它作为学习Windows控制的开端。
在本讲中,我们从CStatic着手,看一下如何修改和定制控制。在下一讲中,我们将学习CButton和CScrollBar类,以理解事件处理的概念。一旦你理解和掌握了所有控制极其类,你就可以建立完整的应用程序了。
基 础
MFC中的CStatic类是用来显示静态文本信息的。这些信息能够可以作为纯信息(例如,显示在信息对话框中的错误消息), 或作为小的标签等。在Windows应用程序的文件打开对话框中,你会发现有六个这样的标签。
CStatic控制还有几种其它的显示格式。你可以通过修改标签的样式来使它表现为矩形、边框或图标等。
CStatic控制总是作为子窗口的形式出现的。典型情况下,其父窗口是应用程序的主窗口或对话框。正如上一讲所介绍的,你用两行代码就可以建立一个静态控制:
CStatic *cs;
...
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(50,80, 150, 150),
this);
这两行代码是典型的MFC建立所有控制的代码。调用new来为CStatic类的事例分配内存,然后调用类的构造函数。构造函数是用来完成类所需要的初始化功能的。Create函数建立控制并把它放到屏幕上。
Create函数有五个参数:
lpszText: 指定了要显示的文本。
rect: 控制文本区域的位置、大小和形状。
pParentWnd: 指明CStatic控制的父窗口。该控制会出现在其父窗口中,且其位置是相对于其父窗口的用户区域而言的。
nID: 整数值,表示该控制的标识符。
dwStyle: 最重要的参数。它控制着控制的外观和行为。
CStatic样式
所有的控制都有各种显示样式。样式是在用Create函数建立控制时传递给它的dwStyle参数所决定的。对CStatic有效的样式简介如下:
从CWnd继承来的样式:
WS_CHILD CStatic所必须的。
WS_VISIBLE 表示该控制对用户应该是可见的。
WS_DISABLED 表示该控制拒绝接受用户事件。
WS_BORDER 控制的文本区域带有边框。
CStatic固有的样式:
SS_BLACKFRAME 该控制区域以矩形边界显示。颜色与窗口框架相同。
SS_BLACKRECT ? 该控制以填充的矩形显示。颜色与当前的窗口框架相同。
SS_CENTER 文本居中。
SS_GRAYFRAME 控制以矩形边框方式显示。颜色与当前桌面相同。
SS_GRAYRECT 该控制以填充的矩形显示。颜色与当前的桌面相同。
SS_ICON 控制以图标形式显示。文本作为图标在资源文件的名称。rect参数只控制位置。
SS_LEFT 文本居左显示。文字可回绕。
SS_LEFTNOWORDWRAP 文本居左显示。多余的文字被剪裁。
SS_NOPREFIX 表示字符串中的"&"字符不表示为加速前缀。
SS_RIGHT 文本居右显示。文字可回绕。
SS_SIMPLE 只简单的显示一行文本。任何CTLCOLOR信息都被其父窗口忽略。
SS_USERITEM 用户定义项。
SS_WHITEFRAME 控制以矩形边框方式显示。颜色与当前窗口背景颜色相同。
SS_WHITERECT 控制以填充矩形方式显示。颜色与当前窗口背景颜色相同。
这些常数中,“SS”(Static Style)开头的表示只能用于CStatic控制。以“WS”(Window Style)开头的常数表示可适用于所有窗口,它们定义在CWnd对象中。CWnd中还有很多以“WS”样式常数。你可以在MFC文档中的CWnd::Create函数中找到它们。上面的四种是只用于CStatic对象的。
CStatic对象至少要带有两个样式:WS_CHILD和WS_VISIBLE。该控制必须作为另一窗口的子窗口来建立。如果不使用WS_VISIBLE,则所建立的控制是看不见的。WS_DISABLED控制着标签对事件的响应,因为CStatic不接收键盘或鼠标事件,所以使用该项是多余的。
所有的其它样式选项都是可选的,它们控制着标签的外观。在CStatic::Create函数中使用这些控制,可以控制CStatic在屏幕上的显示。
CStatic文本的外观
下面的代码对于理解CStatic是有帮助的。它与上一讲中介绍的代码类似,但是修改了CStatic的建立部分。
//static1.cpp
#include
// Declare the application class
class CTestApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
// Create an instance of the application class
CTestApp TestApp;
// Declare the main window class
class CTestWindow : public CFrameWnd
{
CStatic* cs;
public:
CTestWindow();
};
// The InitInstance function is called
// once when the application first executes
BOOL CTestApp::InitInstance()
{
m_pMainWnd = new CTestWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
// The constructor for the window class
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Get the size of the client rectangle
GetClientRect(&r);
r.InflateRect(-20,-20);
// Create a static label
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,
this);
}
下面是窗口构造函数加上了行编号:
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
1 Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Get the size of the client rectangle
2 GetClientRect(&r);
3 r.InflateRect(-20,-20);
// Create a static label
4 cs = new CStatic();
5 cs->Create("hello world",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,
this);
}
首先在单击1行中调用CTestWindow::Create函数。它是CFrameWnd对象的Create函数,因为CTestWindow从CFrameWnd继承了其行为。所以第一行中的代码指定了窗口大小应该为200×200个象素,窗口的左上角被初始化在屏幕的0,0位置处。常数rectDefault可用CRect参数来替代。
在第2行,调用了CTestWindow::GetClientRect,向它传递了&r参数。GetClientRect函数是从CWnd类继承来的。变量r是CRect类型的,并且在函数的开头部分被说明为局部变量。
理解这段代码时可能会有两个问题 1) GetClientRect函数是干什么的? 2) CRect变量是干什么的? 让我们先回答第一个问题。当你查看MFC文档中的CWnd::GetClientRect函数时,你会发现它返回一CRect类型,它包含了指定窗口的用户区域矩形。它保存的是参数的地址&r。该地址指向CRect的位置。CRect类型是在MFC中定义的。用它处理矩形是非常方便的。如果你看以下MFC文档,就会看到其中定义了30多种处理矩形的成员函数和操作符。
在我们的情况下,我们要在窗口中间显示“Hello World”。因此,我们用GetClientRect来获取用户区域的矩形坐标。在第3行中调用了CRect::InflateRect,同时还可以增大或减少了矩形的尺寸(参见CRect::DeflateRect)。这里我们对矩形的各边减少了20个象素。如果不这样的话,标签周围边界就会超出窗口框架。
实际上,CStatic是在第4和5行建立的。样式属性为居中并有边框。其大小和位置由CRect参数r确定的。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -