Visual C++ MFC 简明教程

peacehp 2010-04-29 07:12:51
基 础
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 <afxwin.h>

// 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确定的。
通过修改不同的样式属性,你可以理解CStatic的不同形式。例如,下面的代码

包含有对CTestWindow构造函数进行了修改,所产生的控制有个位移:
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("Now is the time for all good men to \
come to the aid of their country",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,
this);
}
上面的代码除了所显示的文本比较长外没有什么不同。运行该代码你就可以看到

,CStatic在指定的区域内的文本已经回绕了,且没一行都是居中的。
如果边框矩形太小不能包含所有的文本行,则文本会被剪切以适应之。你减小矩

形大小或增大字符串长度就可以看到CStatic的该特性。
在我们所看到的所有代码中,样式SS_CENTER是用来居中文本的。CStatic也允许

左对齐或右对齐。左对齐是用SS_LEFT来替代SS_CENTER属性。同样,右对齐是用

SS_RIGHT来取代之。
SS_LEFTNOWORDWRAP属性是用来关闭文本回绕的。它会强迫使用左对齐属性。

CStatic的矩形显示模式
CStatic也支持两种不同的矩形显示模式:填充矩形和框架。通常用这两种模式

来把一组控制框在一起。例如,你可以把黑背景框架窗口作为一组编辑框的背景

。你可以选择六种不同的样式: SS_BLACKFRAME、SS_BLACKRECT、SS_GRAYFRAME

、SS_GRAYRECT、SS_WHITEFRAME和SS_WHITERECT。RECT形成了一个填充的矩形,

而FRAME组成一边框。其中的颜色标志,如SS_WHITERECT表示其颜色与窗口背景

的颜色是相同的。尽管该颜色的缺省值是白色,但你可以使用控制面板来改变,

此时矩形的颜色可能就不是白色的了。
当指定了矩形或框架属性后,CStatic的文本字符串会被忽略。典型情况是传递

一空字符串。你可以试验以下这些特性。

字体
你可以使用CFont类来改变CStatic的字体。MFC中的CFont类保存着特殊Windows

字体的单一实例。例如,一个实例的CFont类可能保存有18点的Times字体,而另

一个可能保存着10点的Courier字体。你可以调用SetFont函数来修改字体。下面

的代码给出了如何实现字体。
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);

// Create a new 36 point Arial font
font = new CFont;
font->CreateFont(36,0,0,0,700,0,0,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
"arial");
// Cause the label to use the new font
cs->SetFont(font);
}
上面的代码开始于建立窗口和CStatic。然后建立一CFont类型对象。字体变量应

作为CTestWindow的数据成员来说明“CFont *font”。CFont::CreateFont函数

有15个参数,但是只有三个是最常用的。例如,36指定了以点为单位的字体大小

,700指定了字体的密度(400是正常“normal”, 700为加黑“bold”,值的范围

为1到1000。FW_NORMAL和FW_BOLD的含义实际上是相同的),“arial”是所用字

体的名称。Windows 通常带有五种True Type字体(Arial、Courier New、Symbol

、Times New Roman和Wingdings),使用它们,你可以确保任何机器上都会有该

字体。如果你使用了系统不知道的字体,则CFont会选择缺省字体,正如你在本

教程所见到的。
要想更多的了解CFont类,可参见MFC文档。在API在线帮助文件中,有一篇文章

对字体做了很好的概述。查找“Fonts and Text Overview”。
SetFont函数是从CWnd继承来的。它是用来设置窗口的字体的,在我们的程序中

是CStatic子窗口。你可能要问:“我怎样知道CWnd中的哪些函数可以用于

CStatic在?”你只能在实践中来学习。花上一些时间来看一下CWnd的所有函数。

你定会有所收获,并会发现哪些函数可用于定制控制。我们在选下一讲中看到

CWnd类中的其它Set函数。
...全文
266 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjdev 2010-05-07
  • 打赏
  • 举报
回复
帖子从4月29直接跨度到5月7日,呵呵,还有黑暗伯爵兄的跟帖,真是极品。
keghappy 2010-05-07
  • 打赏
  • 举报
回复
代码都显示乱了。。。
hilevel 2010-05-07
  • 打赏
  • 举报
回复
两位数了
kooko1986 2010-05-07
  • 打赏
  • 举报
回复
顶 MARK
vcrun 2010-04-29
  • 打赏
  • 举报
回复
尹成 2010-04-29
  • 打赏
  • 举报
回复
给我留点,支持楼主!
Eleven 2010-04-29
  • 打赏
  • 举报
回复
再接分。。。
Eleven 2010-04-29
  • 打赏
  • 举报
回复
再接分。。。
littlefangMFC 2010-04-29
  • 打赏
  • 举报
回复
JFJFJFJF
peacehp 2010-04-29
  • 打赏
  • 举报
回复
想发个文档分享,但是文字太多,只能分次发,本人最近学VC++兴趣比较大,所以就发了!!!
jingzhongrong 2010-04-29
  • 打赏
  • 举报
回复
接分?
aa3000 2010-04-29
  • 打赏
  • 举报
回复
啥?让人接分?

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧