⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc.htm

📁 一本关于WINDOWS核心编程的书籍
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  }<br>
  // The constructor for the window class<br>
  CTestWindow::CTestWindow()<br>
  { <br>
  CRect r;<br>
  // Create the window itself<br>
  Create(NULL, <br>
  "CStatic Tests", <br>
  WS_OVERLAPPEDWINDOW,<br>
  CRect(0,0,200,200));<br>
  // Get the size of the client rectangle<br>
  GetClientRect(&r);<br>
  r.InflateRect(-20,-20);<br>
  // Create a static label<br>
  cs = new CStatic();<br>
  cs->Create("hello world",<br>
  WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,<br>
  r,<br>
  this);<br>
  }<br>
  下面是窗口构造函数加上了行编号:<br>
  CTestWindow::CTestWindow()<br>
  { <br>
  CRect r;<br>
  // Create the window itself<br>
  1 Create(NULL, <br>
  "CStatic Tests", <br>
  WS_OVERLAPPEDWINDOW,<br>
  CRect(0,0,200,200));<br>
  // Get the size of the client rectangle<br>
  2 GetClientRect(&r);<br>
  3 r.InflateRect(-20,-20);<br>
  // Create a static label<br>
  4 cs = new CStatic();<br>
  5 cs->Create("hello world",<br>
  WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,<br>
  r,<br>
  this);<br>
  }<br>
  首先在单击1行中调用CTestWindow::Create函数。它是CFrameWnd对象的Create函数,因为CTestWindow从CFrameWnd继承了其行为。所以第一行中的代码指定了窗口大小应该为200×200个象素,窗口的左上角被初始化在屏幕的0,0位置处。常数rectDefault可用CRect参数来替代。<br>
  在第2行,调用了CTestWindow::GetClientRect,向它传递了&r参数。GetClientRect函数是从CWnd类继承来的。变量r是CRect类型的,并且在函数的开头部分被说明为局部变量。<br>
  理解这段代码时可能会有两个问题 1) GetClientRect函数是干什么的? 2) CRect变量是干什么的? 让我们先回答第一个问题。当你查看MFC文档中的CWnd::GetClientRect函数时,你会发现它返回一CRect类型,它包含了指定窗口的用户区域矩形。它保存的是参数的地址&r。该地址指向CRect的位置。CRect类型是在MFC中定义的。用它处理矩形是非常方便的。如果你看以下MFC文档,就会看到其中定义了30多种处理矩形的成员函数和操作符。<br>
  在我们的情况下,我们要在窗口中间显示“Hello World”。因此,我们用GetClientRect来获取用户区域的矩形坐标。在第3行中调用了CRect::InflateRect,同时还可以增大或减少了矩形的尺寸(参见CRect::DeflateRect)。这里我们对矩形的各边减少了20个象素。如果不这样的话,标签周围边界就会超出窗口框架。<br>
  实际上,CStatic是在第4和5行建立的。样式属性为居中并有边框。其大小和位置由CRect参数r确定的。<br>
  通过修改不同的样式属性,你可以理解CStatic的不同形式。例如,下面的代码包含有对CTestWindow构造函数进行了修改,所产生的控制有个位移: <br>
  CTestWindow::CTestWindow()<br>
  { <br>
  CRect r;<br>
  // Create the window itself<br>
  Create(NULL, <br>
  "CStatic Tests", <br>
  WS_OVERLAPPEDWINDOW,<br>
  CRect(0,0,200,200));<br>
  // Get the size of the client rectangle<br>
  GetClientRect(&r);<br>
  r.InflateRect(-20,-20);<br>
  // Create a static label<br>
  cs = new CStatic();<br>
  cs->Create("Now is the time for all good men to \<br>
  come to the aid of their country",<br>
  WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,<br>
  r,<br>
  this);<br>
  }<br>
  上面的代码除了所显示的文本比较长外没有什么不同。运行该代码你就可以看到,CStatic在指定的区域内的文本已经回绕了,且没一行都是居中的。<br>
  如果边框矩形太小不能包含所有的文本行,则文本会被剪切以适应之。你减小矩形大小或增大字符串长度就可以看到CStatic的该特性。<br>
  在我们所看到的所有代码中,样式SS_CENTER是用来居中文本的。CStatic也允许左对齐或右对齐。左对齐是用SS_LEFT来替代SS_CENTER属性。同样,右对齐是用SS_RIGHT来取代之。<br>
  SS_LEFTNOWORDWRAP属性是用来关闭文本回绕的。它会强迫使用左对齐属性。<br>
  CStatic的矩形显示模式<br>
  CStatic也支持两种不同的矩形显示模式:填充矩形和框架。通常用这两种模式来把一组控制框在一起。例如,你可以把黑背景框架窗口作为一组编辑框的背景。你可以选择六种不同的样式: SS_BLACKFRAME、SS_BLACKRECT、SS_GRAYFRAME、SS_GRAYRECT、SS_WHITEFRAME和SS_WHITERECT。RECT形成了一个填充的矩形,而FRAME组成一边框。其中的颜色标志,如SS_WHITERECT表示其颜色与窗口背景的颜色是相同的。尽管该颜色的缺省值是白色,但你可以使用控制面板来改变,此时矩形的颜色可能就不是白色的了。<br>
  当指定了矩形或框架属性后,CStatic的文本字符串会被忽略。典型情况是传递一空字符串。你可以试验以下这些特性。<br>
  字体<br>
  你可以使用CFont类来改变CStatic的字体。MFC中的CFont类保存着特殊Windows字体的单一实例。例如,一个实例的CFont类可能保存有18点的Times字体,而另一个可能保存着10点的Courier字体。你可以调用SetFont函数来修改字体。下面的代码给出了如何实现字体。<br>
  CTestWindow::CTestWindow()<br>
  { <br>
  CRect r;<br>
  // Create the window itself<br>
  Create(NULL, <br>
  "CStatic Tests", <br>
  WS_OVERLAPPEDWINDOW,<br>
  CRect(0,0,200,200));<br>
  // Get the size of the client rectangle<br>
  GetClientRect(&r);<br>
  r.InflateRect(-20,-20);<br>
  // Create a static label<br>
  cs = new CStatic();<br>
  cs->Create("Hello World",<br>
  WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,<br>
  r,<br>
  this);<br>
  // Create a new 36 point Arial font<br>
  font = new CFont;<br>
  font->CreateFont(36,0,0,0,700,0,0,0,<br>
  ANSI_CHARSET,OUT_DEFAULT_PRECIS,<br>
  CLIP_DEFAULT_PRECIS,<br>
  DEFAULT_QUALITY,<br>
  DEFAULT_PITCH|FF_DONTCARE,<br>
  "arial"); <br>
  // Cause the label to use the new font<br>
  cs->SetFont(font);<br>
  }<br>
  上面的代码开始于建立窗口和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会选择缺省字体,正如你在本教程所见到的。<br>
  要想更多的了解CFont类,可参见MFC文档。在API在线帮助文件中,有一篇文章对字体做了很好的概述。查找“Fonts and Text Overview”。<br>
  SetFont函数是从CWnd继承来的。它是用来设置窗口的字体的,在我们的程序中是CStatic子窗口。你可能要问:“我怎样知道CWnd中的哪些函数可以用于CStatic在?”你只能在实践中来学习。花上一些时间来看一下CWnd的所有函数。你定会有所收获,并会发现哪些函数可用于定制控制。我们在选下一讲中看到CWnd类中的其它Set函数。<br>
  结论<br>
  在本教程中,我们勘察了CStatic的很多不同特性。有关从CWnd继承来的Set函数,我们将放到下一讲介绍,因为在那里更合适。<br>
  查看Microsoft文档中的函数<br>
  在Visual C++ 5.x中,查找你多不熟悉的函数是很简单的。所有的MFC、SDK、Windows API和C/C++标准库函数都继承到同一个帮助系统中了。如果你不能确定所要的函数在哪儿,你可以使用帮助菜单中的Search选项来查找。所有相关的函数都会列出来的。<br>
  编译多个可执行程序<br>
  在本教程中,有几个例子程序。有两种方式来编译和运行它们。第一种方式是把每个程序都放到自己的目录中,然后为每个程序分别建立一个项目。使用该技术,你可以分别编译每个程序,并且可以同时或独立地使用他们。该方法的缺点是需要比较大的磁盘空间。<br>
  第二种方法是为所有的程序只建立一个目录。你可以一个项目文件。为了编译每个程序,你可以编辑项目和改变源文件。当你重新编译项目时,新的可执行程序就是你所选择的源文件的。该方法可以使用减少磁盘空间。<br>
<br><br><center><h4>第四部分:消息映射</h4></center>
  应用程序放在窗口中的任何用户界面对象都具有两种可控制的特性:1) 它的外观,2) 它响应事件的行为。在上一讲中,你已经学习了CStatic控制和如何使用样式属性来定制用户界面对象的外观。这些概念可用于MFC中的所有不同控制类。<br>
  在本讲中,我们将介绍CButton控制,以理解消息映射和简单的事件处理。然后还要介绍使用CScrollBar控制的稍微复杂点的例子。<br>
  理解消息映射<br>
  在第二讲中,MFC程序不包括主要函数或时间循环。所有的事件处理都是作为CWinApp的一部分在后台处理的。因为它们是隐藏的,所以我们需要一种方法来告诉不可见的时间循环通告我们应用程序所感兴趣的事件。这需要一种叫做消息映射的机制。消息映射识别感兴趣的事件然后调用函数来响应这些事件。<br>
  例如,如果你要编写一个程序,当用户按下标有“退出”的按钮时要退出应用程序。在程序中,你编写代码来建立按钮:你指示按钮应如何动作。然后,为其父窗口建立用户单击按钮时的消息映射,它试图要传递消息给其父窗口。为了建立父窗口的消息,你要建立截取消息映射的机制,并且使用按钮的消息。当一指定的按钮事件发生时,消息映射会请求MFC调用一指定的函数。在这种情况下,单击退出按钮就是所感兴趣的事件。然后你把退出应用程序的代码放到指定的函数中。<br>
  其它的工作就由MFC来做了。当程序执行时,用户单击“退出”按钮时,按钮就会自己加亮。然后MFC自动调用相应的函数,并且程序会终止。只使用很少的几行代码你就响应了用户事件。<br>
  CButton类<br>
  在上一讲中所讨论的CStatic控制是唯一不响应用户时间的控制。Windows中所有的其它控制都可响应用户事件。第一,当用户处理它们时,它们会自动更新其外观(例如,当用户单击按钮时,按钮会自己加亮以给用户一个反馈)。第二,每个不同的控制都要发送信息给你的代码以使程序能响应用户的需要。例如,当单击按钮时,按钮就会发送一个命令消息。如果你编写代码接收消息,则你的代码就能响应用户事件。<br>
  为了理解这个过程,我们从CButton控制开始。下面的代码说明了建立按钮的过程:<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -