当前位置:松语文学 > 其他类型 >VC++_6.0程序设计从入门到精通最新章节 > VC++_6.0程序设计从入门到精通TXT下载
错误举报

第 11 章

  d

  {

  ...

  protected:

  CMDIClient m_wndMDIClient;

  }

  在CMainFrcom 中重载CMDIFrcomWnd::OnCreateClient

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·32·

  BOOL CMainFrcom::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

  {

  if ( CMDIFrcomWnd::OnCreateClient(lpcs, pContext) )

  {

  m_wndMDIClient.SubclassWindow(m_hWndMDIClient);

  return TRUE;

  }

  else

  return FALSE;

  }

  //然后就可以加入对消息WM_ERASEBKGND 的处理函数。

  BOOL CMDIClient::OnEraseBkgnd(CDC* pDC)

  {

  CBrush brush(RGB(200,100,0));

  CRect rect;

  GetClientRect(&rect);

  pDC->FillRect(rect,&brush);

  return TRUE;

  }

  程序运行结果如图2-23 所示,其中框架颜色变成了橘红色,有关该技巧的源代码请参见

  附带光盘。

  图2-23 改变MDI 窗口的框架颜色

  枫叶文学网www.fywxw.com

  第2 章 应用程序基本框架

  ·33·

  2.5.3 工具栏

  工具栏由一系列的按钮和间隔(Seperator)组成。一般功能相关的按钮组成一组,各组

  按钮之间以一定的间隔分开。通常,工具栏作为主框架窗口中的一个子窗口存在。MFC 中使

  用CToolBar 类来封装工具条控件的各种cāo作,可以在资源编辑器的ToolBar 上单击鼠标右键,

  选择Insert ToolBar 项,选中一个工具栏后,鼠标左键双击该工具栏就可以编辑,如图2-24

  所示。

  图2-24 添加一个新的ToolBar 资源

  工具栏上所有按钮的图形在资源中实际上是以一个位图文件存在的。在利用AppWizard

  创建的工程中,自动创建的工具栏位图文件名为Res\ToolBar.bmp。在位图中每个按钮占用一

  个宽为16 像素、高为15 像素的区域。可以用图形工具条及颜色盒绘制按钮的外表,它的属

  xìng包括ID、长、宽及鼠标指向它时的说明。一般在CMainFrcom 中定义CToolBar,其实现在

  CMainFrcom 的OnCreate 函数中完成,在该函数中用于创建工具栏的具体特征。

  在工具栏中嵌入编辑框等控件,可以通过下面的方法:

  ? 定义一个编辑控件对象,不能是局部变量,否则会被释放掉;

  ? 调用Create,惟一注意的是要在工具条中调用。

  CRect rect;

  m_wndToolBar.GetItemRect(1,&rect);

  edit.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndToolBar,ID_EDIT);

  实例2-6:添加工具栏程序。源代码在光盘中“\02\实例2-6\MyToolBar”目录下。

  下面是一个MyToolbar 的示例程序,集中演示了ToolBar 在框架窗口中的应用。新建一

  个空的Win32 Application 工程,然后加入下面的MyToolBar.cpp 源文件,按照前面给出的步

  骤加入新的工具栏资源,这里工具栏的ID 设置为IDR_MYTOOL1,其属xìng如图2-25 所示。

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·34·

  图2-25 工具栏属xìng对话框

  #include <afxwin.h>

  #include <afxext.h>

  #include "resource.h"

  class CMyApp:public CWinApp

  {

  public:

  virtual BOOL InitInstance();

  };

  class CMyWnd:public CFrcomWnd

  {

  public:

  ~CMyWnd();

  CToolBar MyToolBar;

  afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

  afx_msg void OnButton10();

  afx_msg void OnButton11();

  afx_msg void OnButton12();

  afx_msg void OnButton13();

  DECLARE_MESSAGE_MAP()

  };

  CMyApp MyApp;

  BEGIN_MESSAGE_MAP(CMyWnd,CFrcomWnd)

  ON_WM_CREATE()

  ON_COMMAND(ID_BUTTON40010,OnButton10)

  ON_COMMAND(ID_BUTTON40011,OnButton11)

  ON_COMMAND(ID_BUTTON40012,OnButton12)

  ON_COMMAND(ID_BUTTON40013,OnButton13)

  END_MESSAGE_MAP()

  BOOL CMyApp::InitInstance()

  {

  CMyWnd* pCWindow=new CMyWnd;

  pCWindow->LoadFrcom(IDR_MYTOOLBAR1);//创建主窗口,加载菜单

  m_pMainWnd = pCWindow;

  枫叶文学网www.fywxw.com

  第2 章 应用程序基本框架

  ·35·

  pCWindow->ShowWindow(m_nCmdShow);

  pCWindow->UpdateWindow();

  return TRUE;

  }

  int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)

  {

  CFrcomWnd::OnCreate(lpCreateStruct);

  SetWindowText("ToolBar");

  MyToolBar.CreateEx(this, TBSTYLE_FLAT,

  WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER);

  MyToolBar.LoadToolBar(IDR_MYTOOL1);

  MyToolBar.EnableDocking(CBRS_ALIGN_ANY);

  EnableDocking(CBRS_ALIGN_ANY);

  DockControlBar(&MyToolBar);

  return 0;

  }

  CMyWnd::~CMyWnd()

  {

  }

  void CMyWnd::OnButton10()

  {

  AfxMessageBox("Click button 10");

  }

  void CMyWnd::OnButton11()

  {

  AfxMessageBox("Click button 11");

  }

  void CMyWnd::OnButton12()

  {

  AfxMessageBox("Click button 12");

  }

  void CMyWnd::OnButton13()

  {

  AfxMessageBox("Click button 13");

  }

  程序运行结果如图2-26 所示。

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·36·

  图2-26 MyToolbar 示例程序运行结果

  2.5.4 状态栏

  利用AppWizard 自动创建的工程文件中,一般都自动添加了状态栏,在编程过程中,只

  要在原有状态栏的基础上进行修改就可以了。

  状态栏实际上是个窗口,一般分为几个窗格,每个窗格显示不同的信息。AppWizard 会

  为应用程序自动创建一个默认的状态栏,该状态栏包括几个窗格,分别用来显示状态栏提示、

  大小写锁定键(CAPS LOCK)、数字锁定键(NUM LOCK)和滚动锁定键(SCROLL LOCK)

  的状态。在MFC 中,状态栏的功能由CStatusBar 类实现,创建一个状态栏需要以下几个步

  骤:

  ? 构建一个CStatusBar 对象;

  ? 调用CStatusBar::Create 创建状态栏窗口;

  ? 调用CStatusBar::SetIndicators 函数分配窗格,并将状态栏的每一个窗格与一个字符串

  ID 相联系。

  if (!m_wndStatusBar.Create(this) ||

  !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))

  {

  TRACE0("Failed to create status bar\n");

  return -1; // fail to create

  }

  实例2-7:电子时钟。源代码在光盘中“\02\实例2-7\EClock”目录下。

  下面将通过一个电子时钟(在状态栏中嵌入一个电子时钟)的例程来向读者详细讲述工

  具栏的使用。

  首先在indicators 数组的ID_SEPARATOR 项之后chā入一个名为ID_INDICATOR_CLOCK

  的ID,然后找到并双击字符串资源,打开字符串资源编辑窗口,接着在编辑窗口内按Insert

  键以chā入一个新的字符串,指定字符串的ID 为ID_INDICATOR_CLOCK,内容为00:00:00。

  由于状态栏将根据字符串的长度来确定相应窗格的默认宽度,所以指定为00:00:00 就为时间

  的显示预留了空间。添加该字符串资源的结果如图2-27 所示。

  枫叶文学网www.fywxw.com

  第2 章 应用程序基本框架

  ·37·

  时间窗格显示的时间必须每隔一秒钟更新一次。更新时间窗格的正文可调用CStatusBar::

  SetPaneText 函数,要定时更新,则应利用定时器消息(WM_TIMER)。在Windows 中用户可

  以安装一个或多个计时器,计时器每隔一定的时间间隔就会自动发出一个WM_TIMER 消息,

  而这个时间间隔可由用户指定。MFC 的Window 类提供了WM_TIMER 消息处理函数

  OnTcomr,可以在该函数内进行更新时间窗格的工作。

  图2-27 添加ID_INDICATOR_CLOCK 字符串资源的结果

  可以利用ClassWizard 工具给CMainFrcom 类加入WM_TIMER 的消息处理函数OnTcomr

  和WM_CLOSE 消息的处理函数OnClose。具体方法是在Class ncom 栏中选择CMainFrcom,

  在Object IDs 栏中选择CMainFrcom,在Messages 栏中找到WM_TIMER 和WM_CLOSE 项,

  分别双击之然后单击“OK”按钮退出ClassWizard。CMainFrcom::OnClose 函数是在关闭主框

  架窗口是被调用的,程序可以在该函数中做一些清除工作。部分核心代码如下:

  int CMainFrcom::OnCreate(LPCREATESTRUCT lpCreateStruct)

  {

  if (CFrcomWnd::OnCreate(lpCreateStruct) == -1)

  return -1;

  if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP

  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

  {

  TRACE0("Failed to create toolbar\n");

  return -1; // fail to create

  }

  if (!m_wndStatusBar.Create(this) ||

  !m_wndStatusBar.SetIndicators(indicators,

  sizeof(indicators)/sizeof(UINT)))

  {

  TRACE0("Failed to create status bar\n");

  return -1; // fail to create

  }

  枫叶文学网www.fywxw.com

  Visual C++ 6.0 程序设计从入门到精通

  ·38·

  m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

  EnableDocking(CBRS_ALIGN_ANY);

  DockControlBar(&m_wndToolBar);

  SetTcomr(1,1000,NULL); //设置时钟定时器

  return 0;

  }

  void CMainFrcom::OnTcomr(UINT nIDEvent)

  {

  // TODO: Add yourcomssage handler code here and/or call default

  CTcom tcom;

  tcom=CTcom::GetCurrentTcom(); //得到当前时间

  CString s=tcom.Format("%H:%M:%S");//格式化时间显示格式

  m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s);

  CFrcomWnd::OnTcomr(nIDEvent);

  }

  void CMainFrcom::OnClose()

  {

  // TODO: Add yourcomssage handler code here and/or call default

  KillTcomr(1); //删除定时器

  CFrcomWnd::OnClose();

  }

  在CMainFrcom::OnCreate 函数内调用了CWnd::SetTcomr 以设置一个计时器,SetTcomr

  的第一个参数指定计时器ID 为1,第二个参数则规定了计时器的时间间隔为1000 毫秒即1

  秒,这样,每隔1 秒OnTcomr 函数就会被调用一次。在OnTcomr 函数中,首先构建了一个

  CTcom 对象,接着调用CTcom 的静态成员函数GetCurrentTcom 以获得当前的系统时间,然后

  利用CTcom::Format 函数返回一个按“时:分:秒”的格式表示的字符串,最后调用

  CStatusBar::SetPaneText 来更新时间窗格显示的正文。SetPaneText 的第一个参数是窗格的索

  引,对于某一个窗格ID,可调用CStatusBar::CommandToIndex 来获得索引。在撤销主框架窗

  口时应关闭计时器,因此在CMainFrcom::OnClose 函数内调用了KillTcomr 函数。

  电子时钟运行结果如图2-28 所示,在框架底部的状态栏的右方可以看到当前时间。

  图2-28 电子时钟示例程序运行结果

  枫叶文学网www.fywxw.com

  第2 章 应用程序基本框架

  ·39·

  松语文学免费小说阅读_www.16sy.com