第09章 基本控件使用.docx

上传人:b****7 文档编号:10557431 上传时间:2023-02-21 格式:DOCX 页数:33 大小:699.06KB
下载 相关 举报
第09章 基本控件使用.docx_第1页
第1页 / 共33页
第09章 基本控件使用.docx_第2页
第2页 / 共33页
第09章 基本控件使用.docx_第3页
第3页 / 共33页
第09章 基本控件使用.docx_第4页
第4页 / 共33页
第09章 基本控件使用.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

第09章 基本控件使用.docx

《第09章 基本控件使用.docx》由会员分享,可在线阅读,更多相关《第09章 基本控件使用.docx(33页珍藏版)》请在冰豆网上搜索。

第09章 基本控件使用.docx

第09章基本控件使用

第9章基本控件使用

9.1编辑框类

9.1.1编辑框类的结构及方法

编辑框控件看起来是个非常简单的矩形窗口,但它具有许多功能。

编辑框控件有两种形式:

单行编辑框控件和多行编辑框控件。

MFC在类Cedit中提供标准的Windows编辑框控件服务,Cedit是CWnd类直接派生来的,它具有CWnd的所有功能,其在MFC类库中的层次位置如下图:

象大多数包含标准Windows控件的MFC类一样,Cedit类的结构比较复杂。

当创建Cedit类的对象时,MFC自动赋予该对象一个标准的Windows编辑框控件,它定义了CEdit对象,其中包括方法原型。

CEdit类的定义源代码如P206所示。

9.1.2编辑框类的应用实例

例题:

使用MFCAppWizard创建如下图所示的基于对话窗的应用程序,实现算术运算的计算器功能。

1.使用AppWizard建立应用程序框架

 

2.使用资源编辑器建立对话框

voidCCalculatorDlg:

:

OnButton1()

{

charaa[10],bb[10];

doublea,b,c;

charcBuffer[50];

m_a.GetWindowText(aa,10);

m_b.GetWindowText(bb,10);

a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中

b=atof((LPCTSTR)bb);//L表示long指针,P表示指针,C表示常量,T表示Win32宏

c=a+b;

_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中

m_c.SetWindowText(cBuffer);

//UpdateData(FALSE);

}

voidCCalculatorDlg:

:

OnButton2()

{

charaa[10],bb[10];

doublea,b,c;

charcBuffer[50];

m_a.GetWindowText(aa,10);

m_b.GetWindowText(bb,10);

a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中

b=atof((LPCTSTR)bb);//L表示long指针,P表示指针,C表示常量,T表示Win32宏

c=a-b;

_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中

m_c.SetWindowText(cBuffer);

//UpdateData(FALSE);

}

voidCCalculatorDlg:

:

OnButton3()

{

charaa[10],bb[10];

doublea,b,c;

charcBuffer[50];

m_a.GetWindowText(aa,10);

m_b.GetWindowText(bb,10);

a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中

b=atof((LPCTSTR)bb);//L表示long指针,P表示指针,C表示常量,T表示Win32宏

c=a*b;

_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中

m_c.SetWindowText(cBuffer);

//UpdateData(FALSE);

}

voidCCalculatorDlg:

:

OnButton4()

{

charaa[10],bb[10];

doublea,b,c;

charcBuffer[50];

m_a.GetWindowText(aa,10);

m_b.GetWindowText(bb,10);

a=atof((LPCTSTR)aa);//将字符串aa转化成数值存入a中

b=atof((LPCTSTR)bb);//L表示long指针,P表示指针,C表示常量,T表示Win32宏

c=a/b;

_gcvt(c,10,cBuffer);//将浮点数据c转换成字符串存入cBuffer数组中

m_c.SetWindowText(cBuffer);

//UpdateData(FALSE);

}

voidCCalculatorDlg:

:

OnButton5()

{

m_a.SetSel(0,-1);

m_a.ReplaceSel("");

m_b.SetSel(0,-1);

m_b.ReplaceSel("");

m_c.SetSel(0,-1);

m_c.ReplaceSel("");

//UpdateData(FALSE);

}

voidCCalculatorDlg:

:

OnButton6()

{

OnOK();

}

 

9.2菜单类

9.2.1菜单

菜单允许用户用一种标准的方法与Windows应用程序进行交互:

一个样式一致的用户界面对象——菜单栏。

菜单一般存放在资源脚本之中,在程序运行时才调用。

一个菜单项一般有两个必要的部分:

字符串名和整数标识符。

一般而言,菜单的标识符ID在资源的头文件(Resource.h)中定义,如:

#defineIDM_MENU1129

其中,前缀IDM指明是菜单项。

在菜单资源创建后,必须将它链接到类中,通过提供类方法来处理每一个菜单项,从而实现菜单的功能。

9.2.2菜单类的结构及方法

菜单类(CMenu)是从Cobject类派生的,它在MFC类库中的层次位置如下图:

CMenu类定义的源码如P217所示。

9.2.3菜单类的应用实例

例题:

给计算器应用程序加上菜单功能。

1.菜单的设计

2.给菜单连接一个类

菜单实际上是一个对象,在具体的编程中必须给它连接一个类。

因为这个菜单的对话框中的一个资源,它将调用对话框中的一些成员,所以需要将这个菜单与对话框的派生类CCalculatorDlg相连接。

步骤如下:

将鼠标移至编辑状态的菜单上,单击右键,在弹出的快捷菜单中选中ClassWizard命令。

在显示的对话框同时,将显示AddingaClass对话框,如下图:

3.连接菜单和应用程序的主窗口

菜单IDR_MENU1连接了一个类,这只是表示该菜单可以调用程序中这个类的成员函数和成员变量,此时在应用程序的主窗口中仍然没有显示菜单,这是因为菜单还没有和应用程序的主窗口连接起来。

下面介绍菜单与应用程序的主窗口对话框(IDD_Calculator_DIALOG)的连接。

这样,菜单IDR_MENU1就与应用程序的主窗口IDD_CALCULATOR_DIALOG建立了连接。

4.给菜单编写代码

给菜单编写代码类似于给按钮编写代码,步骤如下:

在菜单IDR_MENU1上单击鼠标右键,在弹出的快捷菜单中选择ClassWizard命令,将出现如下对话框:

 

voidCCalculatorDlg:

:

OnAddMenu()

{

OnButton1();

}

voidCCalculatorDlg:

:

OnDifMenu()

{

OnButton2();

}

voidCCalculatorDlg:

:

OnMulMenu()

{

OnButton3();

}

voidCCalculatorDlg:

:

OnDevMenu()

{

OnButton4();

}

voidCCalculatorDlg:

:

OnClearMenu()

{

OnButton5();

}

voidCCalculatorDlg:

:

OnExitMenu()

{

OnButton6();

}

voidCCalculatorDlg:

:

OnAboutMenu()

{

MessageBox("Thisisacalculator");

}

运行的结果如下:

 

9.3滚动条类

 

9.3.1滚动条类的结构及方法

滚动条类(CScrollBar)是CWnd类直接派生而来的,它继承了CWnd的所有功能。

它在MFC类库中的层次位置如下图:

CScrollBar类定义的源码在VC++的Afxwin.h文件中,如P217所示。

9.3.2滚动条类实例

例题:

在计算器应用程序中加入滚动条,使用两个数据框不仅可以通过键盘输出,而且可以通过滚动条进行数据设置。

1.添加滚动条

2.给滚动条连接变量

3.初始化滚动条

滚动条的最小值和最大值设置为-100和100,初始值为0,编辑框中显示的值是滚动条当前的位置的值。

BOOLCCalculatorDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//Setbigicon

SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:

Addextrainitializationhere

charsPos[10];

m_aa.SetScrollRange(-100,100);

m_aa.SetScrollPos(0);

itoa(m_aa.GetScrollPos(),sPos,10);

m_a.SetSel(0,-1);

m_a.ReplaceSel(sPos);

m_bb.SetScrollRange(-100,100);

m_bb.SetScrollPos(0);

itoa(m_bb.GetScrollPos(),sPos,10);

m_b.SetSel(0,-1);

m_b.ReplaceSel(sPos);

UpdateData(FALSE);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

4.添加滚动条消息代码

在MFCClassWizard对话框的MessageMaps页的ObjectIDs列表中选中CMyDlg对象,在Messages列表框中有一个WM_HSCROLL选项,此即为水平滚动条的消息,为此消息加上一个成员函数OnHScroll()。

函数代码如下:

voidCCalculatorDlg:

:

OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

charsPos[10];

intiNowPos;

if(pScrollBar==&m_aa)

{

switch(nSBCode)

{

caseSB_THUMBTRACK:

//拖移

m_aa.SetScrollPos(nPos);

itoa(nPos,sPos,10);

m_a.SetSel(0,-1);

m_a.ReplaceSel(sPos);

break;

caseSB_LINEDOWN:

//右移

iNowPos=m_aa.GetScrollPos();

iNowPos+=1;

if(iNowPos>1000)iNowPos=1000;

m_aa.SetScrollPos(iNowPos);

itoa(m_aa.GetScrollPos(),sPos,10);

m_a.SetSel(0,-1);

m_a.ReplaceSel(sPos);

break;

caseSB_LINEUP:

//左移

iNowPos=m_aa.GetScrollPos();

iNowPos-=1;

if(iNowPos<-1000)iNowPos=-1000;

m_aa.SetScrollPos(iNowPos);

itoa(m_aa.GetScrollPos(),sPos,10);

m_a.SetSel(0,-1);

m_a.ReplaceSel(sPos);

break;

caseSB_PAGEDOWN:

//右跳移

iNowPos=m_aa.GetScrollPos();

iNowPos+=20;

if(iNowPos>1000)iNowPos=1000;

m_aa.SetScrollPos(iNowPos);

itoa(m_aa.GetScrollPos(),sPos,10);

m_a.SetSel(0,-1);

m_a.ReplaceSel(sPos);

break;

caseSB_PAGEUP:

//左跳移

iNowPos=m_aa.GetScrollPos();

iNowPos-=20;

if(iNowPos<-1000)iNowPos=-1000;

m_aa.SetScrollPos(iNowPos);

itoa(m_aa.GetScrollPos(),sPos,10);

m_a.SetSel(0,-1);

m_a.ReplaceSel(sPos);

break;

}

}

if(pScrollBar==&m_bb)

{

switch(nSBCode)

{

caseSB_THUMBTRACK:

//拖移

m_bb.SetScrollPos(nPos);

itoa(nPos,sPos,10);

m_b.SetSel(0,-1);

m_b.ReplaceSel(sPos);

break;

caseSB_LINEDOWN:

//右移

iNowPos=m_bb.GetScrollPos();

iNowPos+=1;

if(iNowPos>1000)iNowPos=1000;

m_bb.SetScrollPos(iNowPos);

itoa(m_bb.GetScrollPos(),sPos,10);

m_b.SetSel(0,-1);

m_b.ReplaceSel(sPos);

break;

caseSB_LINEUP:

//左移

iNowPos=m_bb.GetScrollPos();

iNowPos-=1;

if(iNowPos<-1000)iNowPos=-1000;

m_bb.SetScrollPos(iNowPos);

itoa(m_bb.GetScrollPos(),sPos,10);

m_b.SetSel(0,-1);

m_b.ReplaceSel(sPos);

break;

caseSB_PAGEDOWN:

//右跳移

iNowPos=m_bb.GetScrollPos();

iNowPos+=20;

if(iNowPos>1000)iNowPos=1000;

m_bb.SetScrollPos(iNowPos);

itoa(m_bb.GetScrollPos(),sPos,10);

m_b.SetSel(0,-1);

m_b.ReplaceSel(sPos);

break;

caseSB_PAGEUP:

//左跳移

iNowPos=m_bb.GetScrollPos();

iNowPos-=20;

if(iNowPos<-1000)iNowPos=-1000;

m_bb.SetScrollPos(iNowPos);

itoa(m_bb.GetScrollPos(),sPos,10);

m_b.SetSel(0,-1);

m_b.ReplaceSel(sPos);

break;

}

}

CDialog:

:

OnHScroll(nSBCode,nPos,pScrollBar);

}

在Clear按钮的响应函数中,加入如下函数的执行,可使用滚动条复位。

OnInitDialog();

资料:

Windows系统中有关实现对鼠标和光标进行操作的API函数,下面给出在VisualC6.0++中利用所介绍的API函数实现对鼠标和光标的操作的代码。

1.隐藏和显示光标

函数:

intShowCursor(BOOLbShow);

参数bshow,为布尔型,bShow的值为False时隐藏光标,为True时显示光标;该函数的返回值为整型,为鼠标隐藏或显示的指数器;返回值大于等于0时显示光标,否则隐藏鼠标;如果安装了鼠标初值为0。

实例:

在基于对话框的应用程序中放置两个Button,名称分别为HideCursor和ShowCursor;再放置一个CStatic控件,名称为Label1,用于显示光标计数器。

源程序为:

//使光标计数器的值减一,如果小于零,隐藏光标

voidCMyTestDlg:

:

OnHideCursor()

{

inti;

i=ShowCursor(FALSE);

Cstringstring;

string.Format(_T("%d"),i);

Label1.SetWindowText(&string);

}

//使光标计数器的值加一,如果大于等于零,显示光标

voidCMyTestDlg:

:

OnShowCursor()

{

intj;

j=ShowCursor(TRUE);

Cstringstring;

string.Format(_T("%d"),j);

Label1.SetWindowText(&string);

}

运行程序,连续单击ShowCursor按钮,你会见到计数器从1(光标显示时初值为0)开始不断加1;再连续单击HideCursor按钮,又会见到计数器不断减1,当计数器为-1时开始隐藏光标。

2.交换鼠标左右键和恢复

函数:

BOOLSwapMouseButton(BOOLfSwap);

参数fSwap,为布尔型,TRUE表示交换鼠标左右键,FALSE表示恢复系统默认左右手习惯;返回值亦为布尔型,交换后,返回值TRUE,恢复正常值为FALSE。

实例:

在应用程序中放置两个Button,名称分别为ReverseMouse和RestoreMouse。

源程序为:

//交换鼠标左右键

voidCMyTestDlg:

:

OnReverseMouse()

{

BOOLT;

T=SwapMouseButton(True);

If(T)

MessageBox("鼠标左右键交换成功!

");

}

//恢复鼠标左右键交换

voidCMyTestDlg:

:

OnRestoreMouse()

{

BOOLT;

T=SwapMouseButton(FALSE);

If(!

T)

MessageBox("鼠标左右键恢复为默认状态!

");

}

运行程序,左键单击ReverseMouse按钮,此时实现鼠标左右键功能切换;再右键单击RestoreMouse按钮,此时实现鼠标左右键功能恢复。

3.得到鼠标双击时间

函数:

UINTGetDoubleClickTime(VOID);

该函数无参数;它的返回值为毫秒,为双击鼠标双击有效的时间间隔。

实例:

在窗口中放置一个Button,名称为GetDoubleClickTime;再放置一个名为Label1的CStatic控件,用于显示双击时间。

源程序为:

//得到并显示鼠标的双击的时间

voidCMyTestDlg:

:

OnGetDoubleClickTime()

{

intDTime;

Cstringstring;

DTime:

=GetDoubleClickTime();

string.Format(_T("%d"),Dtime);

Label1.SetWindowText(&string);

}

运行程序,单击GetDoubleClickTime,在Label1中显示双击的时间,为毫秒级。

4.设置鼠标双击时间

函数:

BOOLSetDoubleClickTime(UINTuInterval);

参数uInterval,表示鼠标双击时间,为毫秒级,系统默认时间为500;

返回值为布尔值。

实例:

在窗口中放置一个Button,名称为SetDoubleClickTime。

源程序为:

//设置鼠标的双击的时间

voidCmyTestDlg:

:

OnSetDoubleClickTime()

{

BoolT;

T=SetDoubleClickTime(500);

If(T)

MessageBox("成功的设置了鼠标双击时间!

");

}

运行程序,单击BtnSetDoubleClickTime,鼠标双击时间已改变。

5.将鼠标锁定在一定范围

函数:

BOOLClipCursor(CONSTRECT*lpRect);

参数*lpRect,指向鼠标活动矩形区域的指针;返回值为布尔型,表示锁定成功与否。

实例:

在窗口中放置两个Button,名称为LockMouse和UnLockMouse。

源程序为:

//将鼠标锁定在固定区域

void

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1