1、1、工具栏1、1工具栏简介l工具栏对象是一种窗口,其中包含一些水平排放的图形按钮。工具栏中的所有按钮的图形被存储在一个位图中,而该位图被定义在应用程序的资源文件中。l工具栏按钮与菜单选项是类似的。单击工具栏按钮将产生相应的命令,应用程序通过提供消息处理函数来处理产生的命令。如果工具栏的某个按钮没有COMMAND或UPDATE_COMMAND_UI处理函数,那么框架自动使该按钮无效。l工具栏和状态栏一般作为框架窗口类的成员变量声明,在创建框架窗口时自动创建它们,在销毁框架窗口时自动销毁所创建的控件栏对象。l使用AppWizard创建应用程序基本框架时,可以得到初始的工具栏和状态栏。1、2工具栏的
2、创建 工具栏创建有两种方法,第一种是使用工具栏编辑器。基本步骤为:(1)创建工具栏资源(2)构造CToolBar对象,即在边框窗口类的声明中添加类似以下的声明:CToolBar m_wndToolBar。(3)调用Create或CreateEx创建工具栏,然后调用LoadToolBar装载工具栏资源,即在边框窗口类的OnCreate添加类似下面的代码:if(!m_wndToolBar.Create(this)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACEO(“Faild to create toolbarn”);Return -1;(4)调用Cre
3、ate时还可以指定工具栏的风格,默认风格是WS_CHILD|WS_VISIBLE|CBRS_TOP。CBRS_TOP 工具栏在边框窗口顶部CBRS_BOTTOM 工具栏在边框窗口底部CBRS_NOALIGN 边框窗口改变大小时,工具栏不重定位CBRS_TOOLTIPS 使工具提示有效。CBRS_SIZE_DYNAMIC 工具栏尺寸可变。CBRS_SIZE_FIXED 工具栏尺寸固定。CBRS_FLOATLNG 工具栏是浮动的。CBRS_FLYBY 在状态栏中显示按钮的有关信息。CBRS_HIDE_INPLANE 不显示工具栏。如果创建后要改变工具栏的风格,则调用CControlBar:SetB
4、arStyle来实现。工具栏创建的另一方法为:(1)构造CToolBar对象(2)调用Create或CreateEx创建工具栏。(3)调用LoadBitmap装载包含工具按钮图像的位图。(4)调用SetButton设置按钮并使每个按钮与位图图像相关。l所有工具栏按钮图像都保存在一个位图文件中,在AppWizard创建工程过程中,自动创建的工具栏位图文件名为ResToolBar.bmp,可以在资源编辑器中编辑该位图。每个图像都有相同的大小,默认为16像素宽,15像素高。lCToolBar对象根据被单击按钮在工具栏中的位置来处理工具栏中的鼠标单击事件,并产生适当的命令。按钮通过控件ID数组与按钮所
5、产生的命令相关,控件ID在数组中的位置与按钮图像在工具栏位图中的位置是一样的。数组中含有分隔符(ID_SEPARATOR),用于将按钮分组。在确定按钮位置时,分隔符是被忽略的。工具栏按钮可以以按钮、复选框或单选框的形式出现和起作用,默认情况下以按钮形式出现。若想让工具栏按钮以复选框形式出现时,应将风格TBBS_ CHECKBOX赋给该CToolBar对象或在一个ON_UNDATE_COMMAND_UI处理程序中使用某个CCmdUI对象的SetCheck函数;如果按钮为单选框形式,那么应在命令更新处理函数中调用CCmdUI:SetRadio。1、3特殊形式的工具栏(1)浮动式工具栏 通过AppW
6、izard创建的工具栏可以浮动。若要将工具栏移动到某个位置,可以调用框架窗口类的成员函数FloatControlBar来实现,该函数的原型如下:CFrameWnd*FloatControlBar(CControlBar*pBar,CPoint point,DWORD dwstyle=CBRS_ALIGN_TOP);第一个参数是指向工具栏的指针,第二个参数说明工具栏在哪儿浮动,第三个参数指定工具栏与边框窗口的对齐方式。以下代码使工具栏在左上角浮动。FloatControlBar(&m_wndToolBar,CPoint(0,0);(2)船坞化工具栏 要使工具栏为船坞化的,需要使用类似以下的代码:
7、m_wndToolBar.EnableDocking(CBRS_ ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);首先要使工具栏能够船坞化,要通过调用CControlBar:EnableDocking来实现;然后应该确保边框窗口能够船坞化,这是通过调用CFrameWnd:EnableDocking来实现;最后调用CControlBar:DockControlBar使工具栏固定在边框窗口上。例子1、4类CToolBar 类CToolBar提供了带有位图按钮和可选分隔符的工具栏,工具栏按钮有下压式、复选框
8、按钮或单选按钮。CToolBar对象通常被嵌入派生类CFrameWnd或CMDIFrameWnd的框架窗口对象的成员。利用AppWizard创建应用程序框架时,通常为框架类创建一个CToolBar对象。(1)Create()函数 Create()函数用于创建一个Windows工具栏,并将其连接到CToolBar对象上,同时设置工具条的默认高度。该函数的原型如下:BOOL Create(CWnd*pParentWnd,DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,UINT Nid=AFX_IDW_TOOLBAR);其中参数pParentWnd为指向父窗口C
9、Wnd对象的指针;dwStyle指定工具栏的风格,除了标准的Windows风格外,还可以是CBRS_BOTTOM(工具栏位于框架窗口的底部)、CBRS_NOALIGN(当父窗口改变时,工具栏不被重新定位);参数nID表示该工具栏的子窗口ID。(2)LoadToolBar()函数 该函数装载指定的工具栏资源,它的原型为:BOOL LoadToolBar(LPCTSTR lpszResourceName);BOOL LoadToolBar(UINT nIDResource);参数lpszResourceName指向被重载的工具栏资源名字的指针,参数nIDResource为被重载的工具栏资源的ID。
10、2 状态栏2、1状态栏简介 状态栏是显示在框架窗口的多区域窗口,它由一行输出面板或指示器组成。输出面板通常用作消息行和状态指示符。大多数Windows应用程序都包括一个状态栏,在状态栏中显示诸如工具栏按钮帮助和应用程序的特殊信息(如在字处理软件中的CapsLock键的状态)。AppWizard创建应用程序时,一般自动添加状态栏,程序员在编程的过程中只需在原有的状态栏的基础上适当修改即可。状态栏中的子窗口可以分为状态信息行和状态指示器。状态信息行显示应用程序动态提供的字符串,常见的为菜单命令的说明。状态指示器显示一些状态信息,如键盘状态,其标识符存放在一个数组中。例如,当创建应用程序的基本框架时
11、,AppWizard会在主边框窗口类(CMainFram)中创建类似下面的提示符数组:static UINT indicators=ID_SEPARATOR,/状态行指示器 ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,提示符从左到右水平排列在状态栏中,往数组中添加更多的标识符就可以在状态栏增加更多的提示符,可以根据需要动态改变提示符的大小,通过增加ID_SEPARATOR元素还可增加分隔符。最左边的提示符(位置0)通常用作消息区,可以在其中显示命令提示之类的文本字符串。2、2创建状态栏 创建状态栏的步骤:(1)构造CStatusBa
12、r对象。(2)调用Create创建状态栏并将其与CStatusBar对象联结。(3)调用成员函数SetIndicators,设置指示符的标识符为数组中相应元素指定的值,装载每个标识符指定的字符串资源并将字符串设为提示符文本。2、3状态栏类CStatusBar MFC的CStatusBar类用来实现状态栏的功能。CStatusBar类CControlBar类的派生类,它定义了一个默认的构造函数和一个Create()成员函数。CStatusBar:Create()函数用于创建一个Windows状态栏(子窗口),并将其连接到CStatusBar对象上,同时设置初始字体和状态栏的高度,该函数原型为:B
13、OOL Create(CWnd*pParentWnd,DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINT nID=AFX_IDW_STATUS_BAR);其中参数pParentWnd为指向父窗口CWnd对象的指针;dwStyle指定状态栏的风格,除了标准的Windows风格外,还可以是CBRS_TOP(状态栏 位于框架窗口的顶部)、CBRS_BOTTOM(状态栏位于框架窗口的底部)、CBRS_NOALIGN(当父窗口改变时,状态栏不被重新定位);参数nID表示该状态栏的子窗口ID。如果函数调用成功,则返回一个非0值,否则返回0。CStatusB
14、ar类还提供一系列成员函数来管理状态栏的指示器,主要有:1、SetIndIcators()函数 函数SetIndIcators()用于设置指示器的ID,并装入由每个ID指定的字符串资源,然后将指示器的文字设置为该字符串,该函数的原型为:BOOL SetIndIcators(const UINT*lpIDArray,int nIDCount);参数lpIDArray为指向ID数组的指针,nIDCount为lpIDArray所指向的数组元素的个数。该函数按照数组lpIDArray中的对应元素的值设定标识符ID 的值,加载由每个ID所指定的字符串资源,并把字符串设置为标识符的文字。如果该函数操作成功
15、,在返回一个非0值,否则返回0。2、SetPaneInfo()函数 函数SetPaneInfo()用于设置给定索引值的指示器ID、风格和宽度。它的原型为:void SetPaneInfo(int nIndex,UINT nID,UINT nStyle,int cxWidth);该函数给标识符栏设置一个新的ID、风格和宽度。可供选择的标识符风格有:SBPS_NOBORDERS 指示器周围无3-D边界 SBPS_POPOUT 反转边界,以使文字突出 SBPS_DISABLED 不写文字 SBPS_NORMAL 一般方式,不扩展,有边 界,文字突出SBPS_STRETCH 扩展指示器以填上不用的空
16、间,在每一个状态栏中只有 一个指示器可以使用这种风格3、SetPaneText()函数 函数SetPaneText()用于设置给定索引值的指示器的文本。它的原型为:BOOL SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE);该函数用lpszNewText所指向的字符串来设置状态栏的文字。2、4状态指示器的操作实例 状态指示器总是与一个字符串相连的,该字符串是由资源来提供的,它是否被显示安全取决于相应的更新命令UI消息控制函数。指示器是由一个字符串资源ID来标识的,该ID也被用来传递更新命令UI消息。菜单的更新命令UI消息
17、控制函数是在单击了顶层菜单后而被调用的;而状态栏的更新命令UI 消息控制函数是在空阶段被调用的,这样就可以连续地更新状态栏。下面介绍如何在程序运行时控制消息行的信息显示以及如何在状态指示器中指示特殊键的状态。有三种方法可以更新状态栏指示器中的提示文本:调用Cwnd:SetWindowText更新最左边的指示符的文本。即该函数只能更新第一个指示器(索 引值为0)中的文字。在状态栏的命令更新(ON_UPDATE_COMMAND_UI)处理函数中调用CCmdUI:SetText来设置文本。调用CStatusBar:SetPaneText来更新任何指示器中文字。下面为在状态栏中显示“欢迎使用状态条”的
18、典型的几行代码:CStatusBar*pStatus=(CStatusBar*)AfxGetApp()-m_pMainWnd-GetDescendantWindow(ID_VIEW_STATUS_BAR);pStatus-SetPaneText(0,“欢迎使用状态条”);首先通过调用AfxGetApp()函数获取指向应用程序的指针,指针具有这样的好处,只要获得了某 个对象的指针,就可以利用这个对象所隶属的类的一切公共数据成员和公共成员函数,而使用类的公共数据成员和公共成员函数就可以操纵该对象的一切。既然我们已经取得应用程序的指针,所以马上就能得到应用程序对象的公共数据成员m_pMainWnd,
19、它是一个指向CWin(应用程序的主窗口)的指针,利用这个指针我们又可使用该指针所指向的对象(CWin对象)的成员函数GetDescendantWindow,这个函数的作用是求得某个子窗口,即状态栏这个窗口的指针。有了状态栏的指针,就可以使用状态栏的改变指示器的文本的成员函数SetPaneText。如果想给菜单项添加菜单提示,而菜单提示在状态栏的第一个指示器内显示,所以只需在菜单编辑器的菜单项属性对话框中的提示编辑框内添加菜单提示文字。系统自动管理显示在状态栏上的菜单是提示文字。通过调用函数SetPaneText()还可以改变指示器的风格和宽度等。例如,为了使第一个指示器也像其他指示器一样具有立
20、体边框,则只需在CmainFrame类的OnCreate()函数中加入下面一行代码即可(加在状态栏的Create()函数调用之后)。m_wndStatusBar.setPaneInfo (0,0,SBPS_STRETCH,0);状态指示器是否显示对应的字符串资源,由该指示器的ID的ON_UPDATE_COMMANDUI更新命令消息处理函数ONUpdate()决定。和工具栏按钮一样,ONUpdate()函数向pCmdUI发送Enable消息。状态栏的更新处理函数在系统空闲阶段被调用,因而状态栏在程序生命期中反复被更新。例如状态指示器指示系统键 ALT的状态:ON_UPDATE_COMMAND_U
21、I (ID_INDICATOR_ALT,OnUpdatekeyAlt)/*消息映射,若系统产生消息 ID_INDICATOR_ALT时,将调用映射函数OnUpdatekeyAlt去处理。下面为该处理函数的实现。*/Void CmainFrame:OnUpdatekeyAlt (CcmdUI*pCmdUI)pCmdUI-Enable(:GetKeyState(VK_MENU)0 /*若Alt键按下,则:GetKeyState(VK_MENU)1000#pragma once#endif/_MSC_VER1000class CMainFrame:public CFrameWnd protected
22、:/create from serialization only CMainFrame();DECLARE_DYNCREATE(CMainFrame)/*使用DECLARE_DYNCREATE宏以便允许CObject派生类的对象在运行时刻自动建立。主机使用此功能自动建立新对象,例如,当它在串行化的过程中从磁盘读一个对象时,文件、视图和框架应该支持动态建立,因为框架需要自动建立它们,把该宏加入类的.h模式中,然后在全部需要访问此类对象的.cpp模块中包含这一模式*/Attibutes public:/Operations public:/Overrides/ClassWizard generat
23、ed virtual function overrides/AFX_VIRTUAL(CMainFrame)virtual BOLL PreCreateWindow(CREATESTRUCT&cs);/AFX_VIRTUAL/Implementationpublic:virtualCMainFrame();#ifdef_DEBUG virtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;#endifprotected:/control bar embedded members CStatusBar m_wnd
24、StatusBar;/状态条变量 CToolBar m_wndToolBar;/工具条变量/Generated message map functionsprotected:/AFX_MSG(CMainFrame)afx_msg void OnUpdateLeft(CCmdUI*pCmdUI);/用户手工添加,响应点鼠标左键的函数 afx_msg void OnUpdateKeyInsert(CCmdUI*pCmdUI);/用户手工添加,响应按Insert键的函数afx_msg void OnUpdateTime(CCmdUI*pCmdUI);/用户手工添加,在状态条上显示时间的函数Afx_m
25、sg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnDestroy();/AFX_MSGDECLARE_MESSAGE_MAP()/*用户程序中的每个CCmdTarget派生类必须提供消息图以处理消息。在类定义的末尾使用DECLARE_MESSAGE_MAP宏。接着在类成员函数的.cpp文件中使用BEGIN_MESSAGE_MAP宏,每个消息处理函数的宏入口下面的列表,以及END_MESSAGE_MAP宏。*/;/AFX_INSERT_LOCATION/Microsoft Visual C+will insert addi
26、tional declarations immediately before the previous line.#endif以下是MainFram.cpp的内容/MainFrm.cpp:implementation of the CMainFrame class#include“stdafx.h”#include“StatusBar.h”#include“MainFrm.h”#ifdef_DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE=_FILE_;#endif/CMainFrameIMPLEMENT_DYNCR
27、EATE(CMainFrame,CFrameWnd)/*通过DECLARE_DYNCREATE宏来使用IMPLEMENT_DYNCREATE宏以允许CObject派生类对象在运行时刻内自动建立。主机使用此功能自动建立新对象。例如,当它在串行化过程中从磁盘读取一个对象时。它在类工具中加入IMPLEMENT_DYNCREATE宏。BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)/*在定义用户类函数的工具(.cpp)文件中,以BEGIN_MESSAGE_MAP宏开始消息图,然后为每个信息处理函数增加宏入口,接着以END_MESSAGE_MAP宏完成信息图。*/AFX_M
28、SG_MAP(CMainFrame)ON_UPDATE_COMMAND_UI(ID_INDICATOR_ LEFT,OnUpdateLeft)ON_UPDATE_COMMAND_UI(ID_INDICATOR_ VR,OnUpdateKeyInsert)ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME,OnUpdateTime)ON_WM_CREATE()ON_WM_DESTROY()/AFX_MSG_MAPEND_MESSAGE_MAP()static UINT indicators=ID_SEPARATOR,/status line indicator ID_I
29、NDICATOR_CAPS,/判断是否是大写 状态的资源ID ID_INDICATOR_LEFT,/判断是否是按下鼠标左 键的资源ID ID_INDICATOR_OVR,/判断是改写态还是插入 态的资源IDID_INDICATOR_NUM,/判断NumLock键的 状态的资源IDID_INDICATOR_SCRL,/判断ScrollLock键 的状态的资源IDID_INDICATOR_TIME,/显示时间的资源ID;/CMainFrame construction/destructionCMainFrame:CMainFrame()/TODO:add member initialization
30、 code hereCMainFrame:CMainFrame()int CMaimFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;/创建工具栏 if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT|TBSTYLE_TRANSPARENT,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_
31、wndToolBar.LoadToolBar(IDR_MAINFRAME)/*CBRS_BOTTOM含义为工具栏在框架窗口的底部,CBRS_TOOLTIPS为工具栏显示提示文本,LoadToolBar是类CToolBar的成员函数,它加载工具栏资源IDR_MAINFRAME*/TRACE0(“Failed to create toolbarn”);/*TRACE0与TRACE相似,通过把一个已格式化字符串送到转储设备,例如文件或调试监视器,而提供与printf相似的功能。同MS_DOS下C程序中的printf一样,TRACE宏是一个在程序运行时跟踪变量值的方便形式。在debug环境中,TRAC
32、E宏输出到afxDump。在release环境中,它不做任何工作*/return-1;/fail to create/创建状态栏 if(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)/*SetIndicators的作用是按照Indicators数组中的对应元素的值设定标识符ID的值,加载由每个ID所指定的字符串资源,并把字符串设置为标识符的文字*/TRACE0(“Failed to create status barn”);return-1
33、;/fail to create /指定工具栏可停靠在其父窗口的哪个位置m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);/指定框架窗口的任意位置都可以停放工具栏EnableDocking(CBRS_ALIGN_ANY);/使得工具栏可以停靠在框架窗口中DockControlBar(&m_wndToolBar);/设置定时器,因为状态栏要显示时间,所以每隔一秒要改变状态栏的时间SetTimer(ID_INDICATOR_TIME,1000,NULL);return 0;/CMainFrame diagnostics#ifdef_DEBUGvoid CMain
34、Frame:AssertValid()const CFrameWnd:AssertValid();/*AssertValid()通过检查此类内部状态的方法来确定此对象的合法性。在此库中的debug版本中,AssertValid()可以维护且由此终止程序,当它维护失败时,终止程序并返回行号,文件名的列表信息。对自己编写的类,用户重载AssertValid()提供诊断服务。重载的AssertValid()函数常在检查派生类的成员数据前调用基类的AssertValid()。*/void CMainFrame:Dump (CDumpContext&dc)const CFrameWnd:Dump(dc)
35、;/*把用户对象中的内容转向CDumpContext对象。用户编制自己的类时,重载Dump函数为自己和其他用户提供此类的诊断服务,重载Dump常调用Dump函数作为其基本功能,在派生类打印数据成员之前,若用户类用IMPLEMENT_DYNAMI或IMPLEMENT_SERIAL宏,CObject:Dump打印类名。注意Dump调用仅在debug版本中使用。*/#endif/_DEBUG/CMainFrame message handlersvoid CMainFrame:OnUpdateLeft (CCmdUI*pCmdUI)pCmdUI-Enable(:GetKeyState (VK_LBU
36、TTON)m_pMainWnd-GetDescendantWindow (ID_VIEW_STATUS_BAR);CString Content;Content=(:GetKeyState(VK_INSERT)&1)?“插入”:“改写”;pStatus-SetPaneText(pStatus-CommandToIndex (ID_INDICATOR_OVR),Content);/*CommandToIndex()函数的作用为把一个给定的ID转换为其标识符索引,第一个标识符的索引(下标)为0。有一个函数GetItenID()的作用恰恰与它相反,它是由标识符索引求出标识符ID。*/void CMa
37、inFrame:OnUpdateTime (CCmdUI*pCmdUI)pCmdUI-Enable(true);pCmdUI-SetText(CTime:GetCurrentTime().Format(“%H:%M:%S”);/SetText()为类CCmdUI的成员函数,调用它以设置用户界面文本。void CMainFrame:OnDestroy()CFrameWnd:OnDestroy();KillTimer(ID_INDICATOR_TIME);(2)视图类主要是处理工具条按钮、菜单和鼠标。下面是StatusBarView.h和StatusBarView.cpp的内容。StatusBar
38、View.h的内容如下:/StatusBarView.h:interface of the CStatusBarView class/#if!defined(AFX_STATUSBARVIEW_H_A93C5BAC_D2AC_11D4_A6B0_444553540000_INCLUDED_)#defineAFX_STATUSBARVIEW_H_A93C5BAC_D2AC_11D4_A6B0_444553540000_INCLUDED_#if_MSC_VER1000#pragma once#endif/_MSC_VER1000class CStatusBarView:public CViewpr
39、otected:/create from serialization only CStatusBarView();DECLARE_DYNCREATE(CStatusBarView)/Attributespublic:CStatusBarDoc*GetDocument();/Operationspublic:/Overrides /ClassWizard generated virtual function overrides /AFX_VIRTUAL(CStatusBarView)public:virtual void OnDraw(CDC*pDC);/overridden to draw t
40、his view virtual BOOL PreCreateWindow(CREATESTRUCT&cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo*pInfo);virtual void OnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtual void OnEndPrinting(CDC*pDC,CPrintInfo*pInfo);/AFX_VIRTUAL/Implementationpublic:virtualCStatusBarView();#ifdef_DEBUG()virtua
41、l void AssertValid()const;virtual void Dump(CDumpContext&dc)const;#endifprotected:/Generated message map functionsprotected:/AFX_MSG(CStatusBarView)afx_msg void OnMouseMove(UINT nFlags,CPiont point);afx_msg void OnDestroy();afx_msg void OnQuitWindows();afx_msg void OnCartoon();/AFX_MSG DECLARE_MESSA
42、GE_MAP();#ifndef_DEBUG /debug version in StatusBarView.cppinline CStatusBarDoc*CStatusBarView:GetDocument()return(CStatusBarDoc*)m_pDocument;#endif/AFX_INSERT_LOCATION /Microsoft Visual C+will insert additional declarations immediately before the previous line.#endif/!defined(AFX_STATUSBARVIEW_H_A93
43、C5BAC_D2AC_11D4_A6B0_444553540000_INCLUDED_)以下是StatusBarView.cpp的主要内容/StatusBarView.cpp:implementation of the CStatusBarView class#include“stdafx.h”#include“StatusBar.h”#include“StatusBarDoc.h”#include“StatusBarView.h”#include“winuser.h”#pragma comment(lib,”user32.lib”)/加载user.lib库#pargma comment(li
44、b,”winmm.lib”)/加载winmm.lib库#define OCR_NORMAL 32512 /定义光标正常显示的常量值#ifdef_DEBUG#define new DEBUG_NEW#unfef THIS_FILEstatic char THIS_FILE=_FILE_;#endif/CStatusBarViewIMPLEMENT_DYNCREATE(CStatusBarView,CView)BEGIN_MESSAGE_MAP(CStatusBarView,CView)/AFX_MSG_MAP(CStatusBarView)ON_WM_MOUSEMOVE()ON_WM_DESTR
45、OY()ON_COMMAND(ID_QUIT_WINDOWS,OnQuitWindows)ON_COMMAND(ID_CARTOON,OnCartoon)/AFX_MSG_MAP /Standard printing commands ON_COMMAND(ID_FILE_PRINT,CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:OnFilePrintPreview)END_MESSAGE_MAP()void CStatusBa
46、rView:OnDraw(CDC*pDC)CSatusBarDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereCStatusBarDoc*CStatusBarView:GetDocument()ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CStatusBarDoc);/*IsKindOf()是测试一个对象以确定其是否是一个特定类的对象,或看是否从一个特定的类继承的对象。使用RUNTIME_CLASS宏从C+类名中获取运行时刻类结构,它返回一指
47、针到CRuntimeClass结构,只有以DECLARE_DYNAMIC,DECLARE_DYNCREATE,DECLARE_SERIAL定义的CObject派生类才返回一个CruntimeClass结构的指针*/return(CStatusBarDoc*)m_pDocument;#endif/_DEBUG/CStatusBarView message handlersvoid CStatusBarView:OnMouseMove(UINT nFlags,CPoint point)CStatusBar*pStatus=(CStatusBar*)AfxGetApp()-m_pMainWnd-Ge
48、tDescendantWindow(ID_VIEW_STATUS_BAR);/AfxGetApp()为VC的一个全程函数,调用该函数将返回一个指向CWinApp(应用程序类)的指针,使用该指针可访问应用程序的任何信息,比如主信息发送代码或最顶层的窗口。m_pMainWnd为CWinApp类的一个公共数据成员,它是一个指向CWin(应用程序的主窗口)的指针。GetDescendantWindow为CWin类的成员函数,其原型为CWnd*GetDescendantWindow(int nID,BOOL bOnlyPern=FALSE)const;/调用此成员函数,找出具有指定ID的子窗口,这个成员
49、函数将在整个子窗口中查找,而不仅仅是在当前的子窗口中查找*/if(pStatus)char tbuf40;sprintf(tbuf,“%s%3d,%3d”,“光标在”,point.x,point.y);pStatus-SetPaneText(0,tbuf);/说明:用lpszNewText所指向的字符串设置栏的文字。CView:OnMouseMove(nFlags,point);void CStatusBarView:OnDestroy()HCURSOR MyCursor;MyCursor=LoadCursor(0,IDC_ARROW);/退出应用程序前恢复成原先的光标SetSystemCur
50、sor(MyCursor,OCR_NORMAL);CView:OnDestroy();void CStatusBarView:OnQuitWindows()/重新启动计算机 ExitWindowsEx(EWX_REBOOT,0);/*ExitWindowsEx()函数的作用是退出windows,并用特定的选项重新启动。这个函数调用后会立刻返回,系统关闭过程是在后台进行的。注意先中止自己的应用程序,使关闭程序更显平顺。当然,该进程必须有足够的优先权,否则也不能执行这种操作。该函数的第一个参数的常见取值为:EWX_FORCE(强迫中止没有响应的进程);EWX_LOGOFF(中止进程,然后注销);E
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100