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

📄 mfc.htm

📁 一本关于WINDOWS核心编程的书籍
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  17 };<br>
  它包括一个新的构造函数,同时还有一个指向程序中所使用的唯一用户界面控制的数据成员。你多建立的每个应用程序在主窗口中都会有唯一的一组控制。因此,继承类将有一个重载的构造函数以用来建立主窗口所需要的所有控制。典型情况下,该类会包含有一个析构函数以便在窗口关闭时来删除他们。我们这里没有使用析构函数。在第四讲中,我们将会看到继承窗口类也会说明一个消息处理函数来处理这些控制在响应用户事件所产生的消息。<br>
  典型地,一个应用程序将有一个主应用程序窗口。因此,CHelloApp 应用程序类定义了一个名为 m_pMainWnd 成员变量来指向主窗口。为了建立该程序的主窗口,InitInstance 函数(第18至26行)建立了一个 CHelloWindow 事例,并使用 m_pMainWnd 来指向一个新的窗口。我们的 CHelloWindow 对象是在第22行建立的:<br>
  18 // The InitInstance function is called each<br>
  19 // time the application first executes.<br>
  20 BOOL CHelloApp::InitInstance()<br>
  21 {<br>
  22 m_pMainWnd = new CHelloWindow();<br>
  23 m_pMainWnd->ShowWindow(m_nCmdShow);<br>
  24 m_pMainWnd->UpdateWindow();<br>
  25 return TRUE;<br>
  26 }<br>
  只建立一个简单的框架窗口是不够的。还要确保窗口能正确地出现在屏幕上。首先,代码必须要调用窗口的 ShowWindow 函数以使窗口出现在屏幕上(第23行)。其次,程序必须要调用 UpdateWindow 函数来确保窗口中的每个控制和输出能正确地出现在屏幕上(第24行)。<br>
  你可能奇怪,ShowWindow 和 UpdateWindow 函数是在哪儿定义的。例如,如果你要查看以便了解它们,你可能要查看 MFC 的帮助文件中的 CFrameWnd 定义部分。但是 CFrameWnd 中并不包含有这些成员函数。CFrameWnd 是从 CWnd 类继承来的。你可以查看 MFC 文档中的 CWnd,你会发现它包含有200多个不同的成员函数。显然,你不能在几分钟内掌握这些函数,但是你可以掌握其中的几个,如 ShowWindow 和UpdateWindow。<br>
  现在让我们花几分钟来看一下 MFC 帮助文件中的 CWnd::ShowWindow 函数。为此,你你可以单击帮助文件中的 Search 按钮,并输入“ShowWindow”。找到后,你会注意到,ShowWindow 只有一个参数,你可以设置不同的参数值。我们把它设置成我们程序中 CHelloApp 的数据成员变量 m_nCmdShow (第23行)。m_nCmdShow 变量是用来初始化应用程序启动的窗口显示方式的。例如,用户可能在程序管理器中启动应用程序,并可通过应用程序属性对话框来告知程序管理器应用程序在启动时要保持最小化状态。m_nCmdShow 变量将被设置成 SW_SHOWMINIMIZED,并且应用程序会以图标的形式来启动,也就是说,程序启动后,是一个代表该程序的图标。m_nCmdShow 变量是一种外界与应用程序通讯的方式。如果你愿意,你可以用不同的 m_nCmdShow 值来试验 ShowWindow 的效果。但要重新编译程序才能看到效果。<br>
  第22行是初始化窗口。它为调用 new 函数分配内存。在这一点上,程序在执行时会调用CHelloWindow的构造函数。该构造函数在每次带类的事例被分配时都要调用。在窗口构造函数的内部,窗口必须建立它自己。它是通过调用 CFrameWnd 的 Create 成员函数来实现的(第31行):<br>
  27 // The constructor for the window class<br>
  28 CHelloWindow::CHelloWindow()<br>
  29 { <br>
  30 // Create the window itself<br>
  31 Create(NULL, <br>
  32 "Hello World!", <br>
  33 WS_OVERLAPPEDWINDOW,<br>
  34 CRect(0,0,200,200));<br>
  建立函数共传递了四个参数。通过查看 MFC 文档,你可以了解不同类型。NULL 参数表示使用缺省的类名。第二个参数为出现在窗口标题栏上的标题。第三个参数为窗口的类型属性。该程序使用了正常的、可覆盖类型的窗口。在下一讲中将详细介绍类型属性。第四个参数指出窗口应该放在屏幕上的位置和大小,左上角为(0,0), 初始化大小为 200×200个象素。如果使用了 rectDefault,则 Windows 会为你自动放置窗口及大小。<br>
  因为我们的程序太简单了,所以它只在窗口中建立了一个静态文本控制。见第35至40行。下面将详细介绍。<br>
  静态文本控制<br>
  程序在从 CFrameWnd 类中继承 CHelloWindow 类时(第11至17行)时,说明了一个成员类型 CStatic及其构造函数。<br>
  正如在前面所见到的,CHelloWindow 构造函数主要做两件事情。第一是通过调用Create函数(第31行)来建立应用程序的窗口。然后分配和建立属于窗口的控制。在我们的程序中,只使用了一个控制。在 MFC 中建一个对象总要经过两步。第一是为类的事例分配内存,然后是调用构造函数来初始化变量。下一步,调用 Create 函数来实际建立屏幕上的对象。代码使用这两步分配、构造和建立了一个静态文本对象(第36至40行):<br>
  27 // The constructor for the window class<br>
  28 CHelloWindow::CHelloWindow()<br>
  29 { <br>
  30 // Create the window itself<br>
  31 Create(NULL, <br>
  32 "Hello World!", <br>
  33 WS_OVERLAPPEDWINDOW,<br>
  34 CRect(0,0,200,200)); <br>
  35 // Create a static label<br>
  36 cs = new CStatic();<br>
  37 cs->Create("hello world",<br>
  38 WS_CHILD|WS_VISIBLE|SS_CENTER,<br>
  39 CRect(50,80,150,150),<br>
  40 this);<br>
  41 }<br>
  CStatic 构造函数是在为其分配内存时调用的,然后就调用了 Create 函数来建立 CStatic 控制的窗口。Create 函数所使用的参数与窗口建立函数所使用的参数是类似的(第31行)。第一个参数指定了控制中所要显示的文本内容。第二个参数指定了类型属性。类型属性在下一讲中将详细介绍。在次我们使用的是子窗口类型(既在别的窗口中显示的窗口),还有它是可见的,还有文本的显示位置是居中的。第三个参数决定了控制的大小和位置。第四参数表示该子窗口的父窗口。已经建立了一个静态控制,它将出现在应用程序窗口上,并显示指定的文本。<br>
  结论<br>
  第一次浏览该代码,也可能不是很熟悉和有些让人烦恼。但是不要着急。从程序员的观点来看,整个程序的主要工作就是建立了 CStatic 控制(36至40行)。在下一讲中,我们详细向你介绍36至40行代码的含义,并可看到定制 CStatic 控制的几个选项。<br>
<br><br><center><h4>第三部分:MFC样式</h4></center>
  控制是用来建立Windows应用程序用户界面的用户界面对象。你所见到的大部分Windows应用程序和对话框只不过是由一些控制所组成的、用来实现程序功能的东西。为了建立有效的应用程序,你必须完全理解在Windows应用程序中应该如何合理的使用控制。有六个基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增强了的控制。你需要理解的是那个控制能做些什么、你应该如何控制它的外表和行为以及如何让控制能响应用户事件。只要掌握了这些,再加上掌握了菜单和对话框,你就可以建立你所想象的任何Windows应用程序。你可以象本教程这样用程序代码来建立控制,也可以使用资源编辑器通过资源文件来建立。当然,对话框编辑器更方便些,它对于已经基本掌握了控制的情况下特别有用。<br>
  最简单的控制是CStatic, 它是用来显示静态文本的。CStatic类没有任何数据成员,它只有少量的成员函数:构造函数、Create函数(用于获取和设置静态控制上的图标)等等。它不响应用户事件。因为它的简单性,所以最好把它作为学习Windows控制的开端。<br>
  在本讲中,我们从CStatic着手,看一下如何修改和定制控制。在下一讲中,我们将学习CButton和CScrollBar类,以理解事件处理的概念。一旦你理解和掌握了所有控制极其类,你就可以建立完整的应用程序了。<br>
  基 础<br>
  MFC中的CStatic类是用来显示静态文本信息的。这些信息能够可以作为纯信息(例如,显示在信息对话框中的错误消息), 或作为小的标签等。在Windows应用程序的文件打开对话框中,你会发现有六个这样的标签。<br>
  CStatic控制还有几种其它的显示格式。你可以通过修改标签的样式来使它表现为矩形、边框或图标等。<br>
  CStatic控制总是作为子窗口的形式出现的。典型情况下,其父窗口是应用程序的主窗口或对话框。正如上一讲所介绍的,你用两行代码就可以建立一个静态控制:<br>
  CStatic *cs; <br>
  ... <br>
  cs = new CStatic(); <br>
  cs->Create("hello world", <br>
  WS_CHILD|WS_VISIBLE|SS_CENTER, <br>
  CRect(50,80, 150, 150), <br>
  this);<br>
  这两行代码是典型的MFC建立所有控制的代码。调用new来为CStatic类的事例分配内存,然后调用类的构造函数。构造函数是用来完成类所需要的初始化功能的。Create函数建立控制并把它放到屏幕上。<br>
  Create函数有五个参数:<br>
  lpszText: 指定了要显示的文本。<br>
  rect: 控制文本区域的位置、大小和形状。<br>
  pParentWnd: 指明CStatic控制的父窗口。该控制会出现在其父窗口中,且其位置是相对于其父窗口的用户区域而言的。<br>
  nID: 整数值,表示该控制的标识符。<br>
  dwStyle: 最重要的参数。它控制着控制的外观和行为。<br>
  CStatic样式<br>
  所有的控制都有各种显示样式。样式是在用Create函数建立控制时传递给它的dwStyle参数所决定的。对CStatic有效的样式简介如下:<br>
  从CWnd继承来的样式:<br>
  WS_CHILD CStatic所必须的。 <br>
  WS_VISIBLE 表示该控制对用户应该是可见的。 <br>
  WS_DISABLED 表示该控制拒绝接受用户事件。 <br>
  WS_BORDER 控制的文本区域带有边框。 <br>
  CStatic固有的样式:<br>
  SS_BLACKFRAME 该控制区域以矩形边界显示。颜色与窗口框架相同。 <br>
  SS_BLACKRECT ? 该控制以填充的矩形显示。颜色与当前的窗口框架相同。 <br>
  SS_CENTER 文本居中。 <br>
  SS_GRAYFRAME 控制以矩形边框方式显示。颜色与当前桌面相同。 <br>
  SS_GRAYRECT 该控制以填充的矩形显示。颜色与当前的桌面相同。 <br>
  SS_ICON 控制以图标形式显示。文本作为图标在资源文件的名称。rect参数只控制位置。 <br>
  SS_LEFT 文本居左显示。文字可回绕。 <br>
  SS_LEFTNOWORDWRAP 文本居左显示。多余的文字被剪裁。 <br>
  SS_NOPREFIX 表示字符串中的"&"字符不表示为加速前缀。 <br>
  SS_RIGHT 文本居右显示。文字可回绕。 <br>
  SS_SIMPLE 只简单的显示一行文本。任何CTLCOLOR信息都被其父窗口忽略。 <br>
  SS_USERITEM 用户定义项。 <br>
  SS_WHITEFRAME 控制以矩形边框方式显示。颜色与当前窗口背景颜色相同。 <br>
  SS_WHITERECT 控制以填充矩形方式显示。颜色与当前窗口背景颜色相同。 <br>
  这些常数中,“SS”(Static Style)开头的表示只能用于CStatic控制。以“WS”(Window Style)开头的常数表示可适用于所有窗口,它们定义在CWnd对象中。CWnd中还有很多以“WS”样式常数。你可以在MFC文档中的CWnd::Create函数中找到它们。上面的四种是只用于CStatic对象的。<br>
  CStatic对象至少要带有两个样式:WS_CHILD和WS_VISIBLE。该控制必须作为另一窗口的子窗口来建立。如果不使用WS_VISIBLE,则所建立的控制是看不见的。WS_DISABLED控制着标签对事件的响应,因为CStatic不接收键盘或鼠标事件,所以使用该项是多余的。<br>
  所有的其它样式选项都是可选的,它们控制着标签的外观。在CStatic::Create函数中使用这些控制,可以控制CStatic在屏幕上的显示。<br>
  CStatic文本的外观<br>
  下面的代码对于理解CStatic是有帮助的。它与上一讲中介绍的代码类似,但是修改了CStatic的建立部分。 <br>
  //static1.cpp<br>
  #include <afxwin.h><br>
  // Declare the application class<br>
  class CTestApp : public CWinApp<br>
  {<br>
  public:<br>
  virtual BOOL InitInstance();<br>
  };<br>
  // Create an instance of the application class<br>
  CTestApp TestApp; <br>
  // Declare the main window class<br>
  class CTestWindow : public CFrameWnd<br>
  { <br>
  CStatic* cs;<br>
  public:<br>
  CTestWindow();<br>
  };<br>
  // The InitInstance function is called<br>
  // once when the application first executes<br>
  BOOL CTestApp::InitInstance()<br>
  {<br>
  m_pMainWnd = new CTestWindow();<br>
  m_pMainWnd->ShowWindow(m_nCmdShow);<br>
  m_pMainWnd->UpdateWindow();<br>
  return TRUE;<br>

⌨️ 快捷键说明

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