RSS
热门关键字:
当前位置 : 主页>编程开发>VC/Visual C++>列表

Visual C MFC 简明教程(3)

来源:我要研发网 作者: 时间:1970-01-01 点击:



  第三部分:MFC样式

  控制是用来建立Windows应用程序用户界面用户界面对象。你所见到大部分Windows应用程序和对话框只不过是由一些控制所组成、用来实现程序功能东西。为了建立有效应用程序,你必须完全理解在Windows应用程序中应该如何合理使用控制。有六个基本控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增强了控制。你需要理解是那个控制能做些什么、你应该如何控制它外表和行为以及如何让控制能响应用户事件。只要掌握了这些,再加上掌握了菜单和对话框,你就可以建立你所想象任何Windows应用程序。你可以象本教程这样用程序代码来建立控制,也可以使用资源编辑器通过资源文件来建立。当然,对话框编辑器更方便些,它对于已经基本掌握了控制情况下特别有用。

字串8

  最简单控制是CStatic, 它是用来显示静态文本。CStatic类没有任何数据成员,它只有少量成员函数:构造函数、Create函数(用于获取和设置静态控制上图标)等等。它不响应用户事件。因为它简单性,所以最把它作为学习Windows控制开端。

字串4

  在本讲中,我们从CStatic着手,看一下如何修改和定制控制。在下一讲中,我们将学习CButton和CScrollBar类,以理解事件处理概念。一旦你理解和掌握了所有控制极其类,你就可以建立完整应用程序了。

字串9

  基 础

字串8

  MFC中CStatic类是用来显示静态文本信息。这些信息能够可以作为纯信息(例如,显示在信息对话框中错误消息), 或作为小标签等。在Windows应用程序文件打开对话框中,你会发现有六个这样标签。 字串7

  CStatic控制还有几种其它显示格式。你可以通过修改标签样式来使它表现为矩形、边框或图标等。 字串8

  CStatic控制总是作为子窗口形式出现。典型情况下,其父窗口是应用程序主窗口或对话框。正如上一讲所介绍,你用两行代码就可以建立一个静态控制:

字串9

  CStatic *cs; 字串5

  ...

字串4

  cs = new CStatic();

字串3

  cs->Create("hello world", 字串8

  WS_CHILD|WS_VISIBLE|SS_CENTER,

字串9

  CRect(50,80, 150, 150),

字串7

  this); 字串4

  这两行代码是典型MFC建立所有控制代码。调用new来为CStatic类事例分配内存,然后调用类构造函数。构造函数是用来完成类所需要初始化功能。Create函数建立控制并把它放到屏幕上。

字串9

  Create函数有五个参数: 字串4

  lpszText: 指定了要显示文本。

字串7


字串5

  rect: 控制文本区域位置、大小和形状。 字串1

  pParentWnd: 指明CStatic控制父窗口。该控制会出现在其父窗口中,且其位置是相对于其父窗口用户区域而言字串4

  nID: 整数值,表示该控制标识符。

字串5

  dwStyle: 最重要参数。它控制着控制外观和行为。

字串3

  CStatic样式 字串3

  所有控制都有各种显示样式。样式是在用Create函数建立控制时传递给它dwStyle参数所决定。对CStatic有效样式简介如下:

字串7

  从CWnd继承来样式: 字串2

  WS_CHILD CStatic所必须

字串3

  WS_VISIBLE 表示该控制对用户应该是可见

字串6

  WS_DISABLED 表示该控制拒绝接受用户事件。

字串9

  WS_BORDER 控制文本区域带有边框。

字串5

  CStatic固有样式:

字串5

  SS_BLACKFRAME 该控制区域以矩形边界显示。颜色与窗口框架相同。 字串4

  SS_BLACKRECT ? 该控制以填充矩形显示。颜色与当前窗口框架相同。

字串8

  SS_CENTER 文本居中。

字串9

  SS_GRAYFRAME 控制以矩形边框方式显示。颜色与当前桌面相同。 字串9

  SS_GRAYRECT 该控制以填充矩形显示。颜色与当前桌面相同。 字串8

  SS_ICON 控制以图标形式显示。文本作为图标在资源文件名称。rect参数只控制位置。 字串7

  SS_LEFT 文本居左显示。文字可回绕。 字串6

  SS_LEFTNOWORDWRAP 文本居左显示。多余文字被剪裁。 字串1

  SS_NOPREFIX 表示字符串中"&"字符不表示为加速前缀。 字串3

  SS_RIGHT 文本居右显示。文字可回绕。 字串1

  SS_SIMPLE 只简单显示一行文本。任何CTLCOLOR信息都被其父窗口忽略。

字串1

  SS_USERITEM 用户定义项。 字串2

  SS_WHITEFRAME 控制以矩形边框方式显示。颜色与当前窗口背景颜色相同。 字串6

  SS_WHITERECT 控制以填充矩形方式显示。颜色与当前窗口背景颜色相同。

字串3

  这些常数中,“SS”(Static Style)开头表示只能用于CStatic控制。以“WS”(Window Style)开头常数表示可适用于所有窗口,它们定义在CWnd对象中。CWnd中还有很多以“WS”样式常数。你可以在MFC文档中CWnd::Create函数中找到它们。上面四种是只用于CStatic对象字串2

  CStatic对象至少要带有两个样式:WS_CHILD和WS_VISIBLE。该控制必须作为另一窗口子窗口来建立。如果不使用WS_VISIBLE,则所建立控制是看不见。WS_DISABLED控制着标签对事件响应,因为CStatic不接收键盘或鼠标事件,所以使用该项是多余

字串5

  所有其它样式选项都是可选,它们控制着标签外观。在CStatic::Create函数中使用这些控制,可以控制CStatic在屏幕上显示。 字串5


字串8

  CStatic文本外观 字串9

  下面代码对于理解CStatic是有帮助。它与上一讲中介绍代码类似,但是修改了CStatic建立部分。

字串7

  //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

字串7


   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);
   }

  下面是窗口构造函数加上了行编号: 字串2

  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参数来替代。 字串8


字串6

  在第2行,调用了CTestWindow::GetClientRect,向它传递了&r参数。GetClientRect函数是从CWnd类继承来。变量r是CRect类型,并且在函数开头部分被说明为局部变量。 字串1

  理解这段代码时可能会有两个问题 1) GetClientRect函数是干什么? 2) CRect变量是干什么? 让我们先回答第一个问题。当你查看MFC文档中CWnd::GetClientRect函数时,你会发现它返回一CRect类型,它包含了指定窗口用户区域矩形。它保存是参数地址&r。该地址指向CRect位置。CRect类型是在MFC中定义。用它处理矩形是非常方便。如果你看以下MFC文档,就会看到其中定义了30多种处理矩形成员函数和操作符。

字串7

  在我们情况下,我们要在窗口中间显示“Hello World”。因此,我们用GetClientRect来获取用户区域矩形坐标。在第3行中调用了CRect::InflateRect,同时还可以增大或减少了矩形尺寸(参见CRect::DeflateRect)。这里我们对矩形各边减少了20个象素。如果不这样话,标签周围边界就会超出窗口框架。

字串5

  实际上,CStatic是在第4和5行建立。样式属性为居中并有边框。其大小和位置由CRect参数r确定字串8

  通过修改不同样式属性,你可以理解CStatic不同形式。例如,下面代码包含有对CTestWindow构造函数进行了修改,所产生控制有个位移: 字串6

  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在指定区域内文本已经回绕了,且没一行都是居中

字串8

  如果边框矩形太小不能包含所有文本行,则文本会被剪切以适应之。你减小矩形大小或增大字符串长度就可以看到CStatic该特性。 字串7

  在我们所看到所有代码中,样式SS_CENTER是用来居中文本。CStatic也允许左对齐或右对齐。左对齐是用SS_LEFT来替代SS_CENTER属性。同样,右对齐是用SS_RIGHT来取代之。 字串5


字串6

  SS_LEFTNOWORDWRAP属性是用来关闭文本回绕。它会强迫使用左对齐属性。 字串5

  CStatic矩形显示模式

字串7

  CStatic也支持两种不同矩形显示模式:填充矩形和框架。通常用这两种模式来把一组控制框在一起。例如,你可以把黑背景框架窗口作为一组编辑框背景。你可以选择六种不同样式: SS_BLACKFRAME、SS_BLACKRECT、SS_GRAYFRAME、SS_GRAYRECT、SS_WHITEFRAME和SS_WHITERECT。RECT形成了一个填充矩形,而FRAME组成一边框。其中颜色标志,如SS_WHITERECT表示其颜色与窗口背景颜色是相同。尽管该颜色缺省值是白色,但你可以使用控制面板来改变,此时矩形颜色可能就不是白色了。 字串8

  当指定了矩形或框架属性后,CStatic文本字符串会被忽略。典型情况是传递一空字符串。你可以试验以下这些特性。 字串8

  字体 字串6

  你可以使用CFont类来改变CStatic字体。MFC中CFont类保存着特殊Windows字体单一实例。例如,一个实例CFont类可能保存有18点Times字体,而另一个可能保存着10点Courier字体。你可以调用SetFont函数来修改字体。下面代码给出了如何实现字体。

字串8

  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会选择缺省字体,正如你在本教程所见到字串9


字串1

  要想更多了解CFont类,可参见MFC文档。在API在线帮助文件中,有一篇文章对字体做了很概述。查找“Fonts and Text Overview”。

字串5

  SetFont函数是从CWnd继承来。它是用来设置窗口字体,在我们程序中是CStatic子窗口。你可能要问:“我怎样知道CWnd中哪些函数可以用于CStatic在?”你只能在实践中来学习。花上一些时间来看一下CWnd所有函数。你定会有所收获,并会发现哪些函数可用于定制控制。我们在选下一讲中看到CWnd类中其它Set函数。 字串7

  结论 字串7

  在本教程中,我们勘察了CStatic很多不同特性。有关从CWnd继承来Set函数,我们将放到下一讲介绍,因为在那里更合适。

字串6

  查看Microsoft文档中函数

字串6

  在Visual C 5.x中,查找你多不熟悉函数是很简单。所有MFC、SDK、Windows API和C/C 标准库函数都继承到同一个帮助系统中了。如果你不能确定所要函数在哪儿,你可以使用帮助菜单中Search选项来查找。所有相关函数都会列出来字串5

  编译多个可执行程序 字串7

  在本教程中,有几个例子程序。有两种方式来编译和运行它们。第一种方式是把每个程序都放到自己目录中,然后为每个程序分别建立一个项目。使用该技术,你可以分别编译每个程序,并且可以同时或独立地使用他们。该方法缺点是需要比较大磁盘空间。

字串3

  第二种方法是为所有程序只建立一个目录。你可以一个项目文件。为了编译每个程序,你可以编辑项目和改变源文件。当你重新编译项目时,新可执行程序就是你所选择源文件。该方法可以使用减少磁盘空间。

字串1

字串3

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章