八宝书库 > 文学其他电子书 > C语言实例教程(PDF格式) >

第42部分

C语言实例教程(PDF格式)-第42部分

小说: C语言实例教程(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






(〃您刚才单击了按钮 IDC_CLICKHERE; 因此相应的命令处理函数 OnClickhere 被调用!〃);  



第二种方法:  



1。  在资源编辑器中右击按钮IDC_CLICKHERE,选择Events命令,打开 

如图6。15所示的对话框:  



2。  在Class or object to handle列表框中选择IDC_CLICKHERE,然 

后在New  Windows  messages/events列表框中选择BN_CLICKED,单击 

右边的Add and Edit,余下的步骤同第一种方法的第2步开始相同。  



这时编译并运行上面的程序,单击标签为 “单击这里”的下压按钮, 

弹出如图所示的消息框。  



                                           



                 图6。 16 程序PushButton的运行结果  



下面我们来看相应的消息映射。  



首先,在类CPushButtonDlg的定义中添加了消息处理函数 

OnClickhere的原型:  



afx_msg void OnClickhere();  



函数OnClickhere的声明被放进了两行注释分隔符//{{AFX_MSG 

(CPushButtonDlg)和//}}AFX_MSG之间。前面我们提到过, 

ClassWizard将由它定义的消息处理函数的声明放入这两行注释分隔 

符之间。  



下面我们来看相应的消息映射入口。它位于实现文件 


…………………………………………………………Page 320……………………………………………………………

PushButtonDlg。cpp中的两个宏BEGIN_MESSAGE_MAP和 

END_MESSAGE_MAP之间:  



ON_BN_CLICKED(IDC_CLICKHERE; OnClickhere)  



其中第一个参数IDC_CLICKHERE为控件的标识符,第二个参数 

OnClickhere为相应的消息处理函数。  



一旦弄清楚了由ClassWizard添加这些代码,我们就可以手动的添加 

命令消息处理函数的消息映射。但是,从上面的过程中我们可以很明 

显的看出一点,使用ClassWizard来完成这一点要简单得多。  



下面我们介绍与下压按钮控件有关的几个技巧:  



   (1) 在运行过程中改变下压按钮的标题文本  



有时候我们需要在程序运行的过程中改变按钮的标题文本。典型的, 

我们可能需要根据用户所输入的数据来决定按钮上应该写些什么。我 

们到前面去看一下表6。14,看一看有什么成员函数可以完成这种功 

能。  



很好,类CWnd的成员函数SetDlgItemText可以由窗口或对话框所有的 

控件的标题文本。其原型如下:  



void SetDlgItemText( int nID; LPCTSTR lpszString );  



其中nID为控件标识符 (ID),lpszString为控件的新标题文本。  



成员函数SetDlgItemText事实上是向控件发送一条WM_SETTEXT消息, 

该消息的wParam参数必须为0,而lParam为指向窗口标题文本字符串 

的指针。  



因此,SetDlgItemText等价于下面的函数调用:  



CWnd::SendDlgItemMessage(nID; WM_SETTEXT; 0; LPARAM(lpszString));  



或  



::SendDlgItemMessage(GetSafeHwnd(); nID; WM_SETTEXT; 0; LPARAM(lpszString));  



比如说,我们用以将下面的代码添加到OnClickhere中对MessageBox 

的调用之后:  



SetDlgItemText(IDC_CLICKHERE;〃此按钮已被单击过。〃);  


…………………………………………………………Page 321……………………………………………………………

      使用按钮无效 或有效   

   (2)         (     ) 



假设我们在上面的例子中希望用户只能单击按钮IDC_CLICKHERE一 

次。那么,按钮IDC_CLICKHERE被单击一次之后应该变灰,以禁止用 

户再次单它。这可以通过下面的步骤来实现:  



首先调用对话框对象的成员函数GetDlgItem  (该成员函数在类CWnd中 

定义),该成员函数获得一个指向对话框中的控件的CWnd指针,然后 

再通过该指针调用控件对象的成员函数EnableWindow  (该成员函数在 

类CWnd中定义)。该成员函数允许或禁止调用它的CWnd对象对应窗 

口。整个过程可以使用一行语句来实现,如下所示:  



GetDlgItem(IDC_CLICKHERE)…》EnableWindow(FALSE);  



其中GetDlgItem函数以控件的ID为参数,返回值的类型为CWnd  *,如 

果需要通过该指针调用在类CButton所定义的成员函数,可以使用强 

制类型转换。EnableWindow以一个布尔值为参数,该参数为真时表示 

允许该窗口接受鼠标和键盘输入,为假时禁止该窗口接受鼠标和键签 

署输入。这里再一次强调,控件本身也是一种窗口。  



将上面的代码放到命令处理函数OnClickhere的最后,这样,在单击 

一次按钮 “单击这里”之后,对话框如图6。17所示。  



                                 



                图6。 17 处于禁止状态的控钮控件  



此外,如果使用了ClassWizard为按钮建立了对话框的成员变量的数 

据映射,则可以通过对话框中的成员变量直接操纵控件。在本例中, 

如果我们已将下压按钮映射为类型为CButton的成员变量 

m_bnClickhere,则可以通过下面成员函数调用设置按钮的允许状 

态:  



m_bnClickhere…》EnableWindow(FALSE);  



   (3) 使按钮获得输入焦点  



具有输入焦点的窗口将会得到所有的键盘输入消息。我们可以通过类 

CWnd的成员函数GetFocus来使对话框中的控件获得输入焦点。  



试将下面的代码加到消息处理函数OnInitDialog的return语句前:  


…………………………………………………………Page 322……………………………………………………………

m_bnClickhere。SetFocus();  



或  



GetDlgItem(IDC_CLICKHERE)…》SetFocus();  



编译并运行程序。非常奇怪,输入焦点并没有被设置到下压按钮 “单 

击这里”上。依然是按钮 “确定”拥有当前输入焦点。  



请注意这样的事实:  



  l 注意:  



  l 如果在消息处理成员函数OnInitDialog中将输入焦点设置到指定 

   的控件,则函数应该返回FALSE,这是因为如果WM_INITDIALOG消 

   息的处理函数返回真值,Windows会将输入焦点设置为对话框中的 

   第一个控件。因此,如果在该处理函数中设置了控件的输入焦 

   点,WM_INITDIALOG消息的处理函数应该返回假值。  



将下面的代码  



return TRUE;  



修改为  



return FALSE;  



这时再编译并运行程序,则输入焦点将被正常地设置到下压按钮 “单 

击这里”上。这时按下空格键相当于在按钮 “单击这里”上单击鼠标 

左键。  



(4) 使用图形代替文本  



在一些应用程序,尤其是一些多媒体应用程序中,我们希望按钮的外 

观看起来更加的美观,比如说我们希望使用多变的图形代替单调乏味 

的纯文本。对于一般的按钮控件,我们可以使用两种方法来在按钮中 

使用图形来代替文本。  



第一种方法是使用图标来代替文本。下面的示例说明了这种用法:  



1。         使用资源编辑器或其它工作编辑一个图标资源,其ID为 

IDI_CLICKHERE,图案如图6。18所示。  



2。   在希望使用图标图案的按钮控件的Properties属性框在Styles选 


…………………………………………………………Page 323……………………………………………………………

项卡中设置Icon属性为真。并按图6。19修改对话框及其中控件的大 

小。  



3。   在类CPushButtonDlg的消息处理成员函数OnInitDialog中添加下 

面的代码。这些代码应该在对基类的OnInitDialog成员函数的调用之 

后。  



                                          



                       图6。 18 图标IDI_CLICKHERE  



                                          



                       图6。 19 为使用图标按钮修改  

                          对话框中控件的大小  



HICON hIcon=AfxGetApp()…》LoadIcon(IDI_CLICKHERE);  



m_bnClickhere。SetIcon(hIcon);  



编译该应用程序,运行结果如图6。20所示。  



                                          



                     图6。 20 在按钮中使用图标的示例  



这时单击按钮Click Here,图标图案会有向右和向下下压的效果。  



第二种方法是使用位图来代替文本。步骤如下:  



                                         



                      图6。 21 位图资源IDB_CLICKHERE  


…………………………………………………………Page 324……………………………………………………………

1。 向工程资源中添加如图6。21的位图资源,其ID为IDB_CLICKHERE。  



2。   在希望使用位图图案的按钮控件的Properties属性框在Styles选 

项卡中设置Bitmap属性为真。我们注意到Icon属性和Bitmap属性是互 

斥的,即选择一属性的同时也清除了另一属性。并按图6。19修改对话 

框及其中控件的大小。同时参考最终运行结果(如图6。22)修改对话框 

及其按钮的大小。  



3。 在OnInitDialog成员函数中添加如下的代码:  



HBITMAP hBitmap=LoadBitmap(AfxGetApp()…》m_hInstance;MAKEINTRESOURCE 

(IDB_CLICKHERE));  



m_bnClickhere。SetBitmap(hBitmap);  



在上面的代码中,我们使用Win32  API函数LoadBitmap  (注意它不是 

类CWinApp的成员函数)来加载位图资源IDB_CLICKHERE,从而获得位 

图句柄hBitmap,最后以该句柄为参数调用类CButton的成员函数 

SetBitmap。  



编译并运行上面的程序,得到如图6。22所示的运行结果。  



                                   



                 图6。 22 在按钮中使用位图的示例  



  l 注意:  



  l 在上面的示例程序中我们使用了真彩色 (24位)的位图。这样的位 

    图不可以使用资源编辑器来进行编辑。上面的位图是使用其它专 

    门的图形工具来进行编辑并保存到文件Clickhere。bmp中的。请按 

   下面的步骤将该文件添加为工程的资源:  



       1。 选择Insert菜单下的Resource命令,打开如 图所示的对话 

       框。  


…………………………………………………………Page 325……………………………………………………………

                                      



                   图6。 23 插入新的资源  



      2。  从中单击Import按钮,从位图文件Clickhere。bmp中输入 

      资源。注意在文件类型中选择 “All files (*。*)”。  



      Developer  Studio将弹出如图6。24所示的警告对话框。该对 

      话框表明位图资源已被正确添加。但由于使用了多于256色的 

      颜 色数,因此该资源不可以在资源编辑器中打开。  



                                       



        图6。 24 试图添加使用了多于256色的位图资源时的警告消息框  



      3。         按正常的方法将所添加的位图资源的ID修改为 

      IDB_CLICKHERE。必要时重新编辑资源文件或工程。  



6。3。2 位图按钮  



位图按钮是由MFC提供的几种附加控件之一。在前一节的过程中,我 

们可以使用一个位图来代替文本作为下压按钮的标签。而在位图按钮 

中,我们可以使用多达四个位图来分别代表按钮处于四种不同的状态 

(凸起、按下、获得焦点或被禁止)下的显示。而且,使用位图按钮还 

可以去除掉令人讨厌的按钮黑边。而使用位图按钮并不复杂,但是相 

比起标准的按钮控件 (它由Windows 自身所提供)而言有一些特殊。下 

面的过程描述了位图按钮的使用,它们在MFC中使用类CBitmapButton 

封装。  



1。 使用AppWizard创建新的基于对话框的MFC工程BitmapButton。  



2。  使用资源编辑器绘制一个标准按钮,将其ID设为IDC_CLICKHERE, 

标题文本设为CLICKHERE,然后在Styles选项卡中将Owner   draw属性 


…………………………………………………………Page 326……………………………………………………………

设置为真。  



3。 向工程中添加四个位图资源。  



                                                          

                 



     〃CLICKHEREU〃  〃CLICKHERED〃  〃CLICKHEREF〃  〃CLICKHEREX〃  



             图6。 25 位图按钮IDC_CLICKHERE所使用的四个位图资源  



所添加的四个位图资源的ID的设置取决于在第一步中的标题文本的设 

置:按钮未按下去时使用的位图添加了后缀〃U〃;按钮按下去时使用 

的位图添加了后缀〃D〃;按钮拥有焦点时使用的位图添加了后缀〃F〃; 

按钮被禁止时使用的位图添加了后缀〃X〃。需要注意的是,由于这些 

位图资源的ID为字符串,因此在使用属性对话框设置其ID时一定要加 

了双引号,否则资源编辑器会将该ID值看作代表一个整型量的符号。  



4。    在对话框类CBitmapButtonDlg(这里我们沿用上一节中的示例程 

序)中添加类型为CBitmapButton的新的成员变量m_bnClickhere。  



5。 在OnInitDialog成员函数

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的