VC内部培训资料第9章修改框架程序的显示效果.docx

上传人:b****5 文档编号:3525290 上传时间:2022-11-23 格式:DOCX 页数:16 大小:612.51KB
下载 相关 举报
VC内部培训资料第9章修改框架程序的显示效果.docx_第1页
第1页 / 共16页
VC内部培训资料第9章修改框架程序的显示效果.docx_第2页
第2页 / 共16页
VC内部培训资料第9章修改框架程序的显示效果.docx_第3页
第3页 / 共16页
VC内部培训资料第9章修改框架程序的显示效果.docx_第4页
第4页 / 共16页
VC内部培训资料第9章修改框架程序的显示效果.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

VC内部培训资料第9章修改框架程序的显示效果.docx

《VC内部培训资料第9章修改框架程序的显示效果.docx》由会员分享,可在线阅读,更多相关《VC内部培训资料第9章修改框架程序的显示效果.docx(16页珍藏版)》请在冰豆网上搜索。

VC内部培训资料第9章修改框架程序的显示效果.docx

VC内部培训资料第9章修改框架程序的显示效果

第9章修改框架程序的显示效果

本章将讲述如何修改MFCAppWizard自动生成的应用程序的外观,在学习本章内容之前,读者有必要回头复习一下第二章中讲过的创建一个窗口的过程。

9.1修改Windows应用程序外观样式

我们可以通过不同的方法来修改应用程序的背景、标题、光标、图标以及框架是否具有最大、最小对话框等信息。

我们知道由于视图类覆盖在框架窗口上,因此,我们通常在MainFrame中修改图标、标题及是否具有最大、最小框的属性;而背景及光标等信息就需要在View类中修改。

9.1.1在框架类中修改程序外观

本节内容所讲的实例都包含在光盘例子代码EX09_00中。

新建一个MFC单文档应用程序,工程名为EX09_00或用户自定义。

1.在CMainFrame:

:

PreCreateWindow中修改。

在窗口产生之前,会调用它的成员函数PreCreateWindow,此时窗口还没有产生,相当于一栋大楼修建之前,在它的设计图纸上修改它的式样,然后按照修改后的图纸去修建大楼。

修改方法有以下几种:

●直接修改CREATESTRUCT结构,代码如下:

BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

{

if(!

CFrameWnd:

:

PreCreateWindow(cs))

returnFALSE;

//TODO:

ModifytheWindowclassorstylesherebymodifying

//theCREATESTRUCTcs

cs.style&=~WS_MAXIMIZEBOX;//去掉窗口的最大化按钮

cs.style&=~FWS_ADDTOTITLE;//允许添加自己的标题

cs.lpszName="VisualC++教学";

returnTRUE;

}

其中style和lpszName是结构CREATESTRUCT的数据成员,分别表示框架窗口的样式和标题。

需要注意的是,要想将窗口框架显示标题改为我们的标题,必须要将style的FWS_ADDTOTITLE属性去掉。

运行程序,会发现窗口的最大化按钮不见了,并且标题再不是以前的那种很枯燥的“无标题”,而是换成了我们自己添加的"VisualC++教学",结果如图9-00所示。

图9-00去掉了最大化按钮及添加新标题

●重新设计、填写WNDCLASS,代码如清单9-00所示:

清单9-00CMainFrame:

:

PreCreateWindow函数代码

-------------------------------------------------------------------------------

1BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

2{

3if(!

CFrameWnd:

:

PreCreateWindow(cs))

4returnFALSE;

5//TODO:

ModifytheWindowclassorstylesherebymodifying

6//theCREATESTRUCTcs

7WNDCLASSwndClass;

8wndClass.style=CS_HREDRAW;

9wndClass.lpfnWndProc=(WNDPROC):

:

DefWindowProc;

10wndClass.cbClsExtra=0;

11wndClass.cbWndExtra=0;

12wndClass.hInstance=:

:

AfxGetInstanceHandle();

13wndClass.hIcon=LoadIcon(:

:

AfxGetInstanceHandle(),

14MAKEINTRESOURCE(IDI_ICON1));

15wndClass.hCursor=LoadCursor(NULL,IDC_NO);

16LOGBRUSHlgbr;

17lgbr.lbStyle=BS_SOLID;

18lgbr.lbColor=RGB(255,255,0);

19lgbr.lbHatch=HS_CROSS;

20wndClass.hbrBackground=CreateBrushIndirect(&lgbr);

21wndClass.lpszMenuName=NULL;

22wndClass.lpszClassName="hello";

23RegisterClass(&wndClass);

24cs.lpszClass="hello";

25returnTRUE;

26}

第7~22行代码定义了一个新的窗体类wndClass并设计该类;,

第16~19行部分代码中自定义了一个LOGBRUSH结构类型的画刷lgbr,其中lbStyle、lbColor和lbHatch是该结构体的三个数据成员,分别表示所定义的画刷的样式等属性,设置该画刷的属性为实心的黄色,新设计的窗口类的背景就采用这个画刷。

其中IDI_ICON1是我们在资源面板中新添加的一个图标资源的ID。

代码中的大部分内容在第二章都接触过,可能最后一句cs.lpszClass="hello";有的读者大概不理解该句代码的用意。

我们知道,在CMainFrame:

:

PreCreateWindow中,应用程序根据该函数传来的cs进行框架的显示,这个cs结构中的数据成员lpszClass包含框架生成时采用的窗口类的名称,如果我们不添加最后一句代码将我们的窗口类赋给lpszClass数据成员,那么它还会采用原来系统默认的窗口类。

运行程序,读者会发现,框架的图标变了,但是背景和光标没有变,如图9-01所示,那是由于视图类覆盖在框架类上了,应将此段代码拷入CEX09_00View:

:

PreCreateWindow函数中,就可以看到效果了。

图9-01修改了显示的图标

●利用GetClassInfo函数,代码如清单9-01所示:

清单9-01CMainFrame:

:

PreCreateWindow函数代码

1BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

2{

3if(!

CFrameWnd:

:

PreCreateWindow(cs))

4returnFALSE;

5//TODO:

ModifytheWindowclassorstylesherebymodifying

6//theCREATESTRUCTcs

7WNDCLASSwndclass;

8:

:

GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);

9wndclass.hIcon=:

:

LoadIcon(:

:

AfxGetInstanceHandle(),

10MAKEINTRESOURCE(IDI_ICON1));

11wndclass.lpszClassName="hello";

12:

:

RegisterClass(&wndclass);

13cs.lpszClass="hello";

14returnTRUE;

15}

第7行首先定义一个窗口类对象wndclass,然后在第8行调用GetClassInfo函数将取得的当前使用的窗口类信息赋给对象wndclass,最后,通过9~11行修改wndclass,再由12、13行代码重新注册及加载修改后的窗口对象来实现,程序运行结果同图9-01一样。

函数GetClassInfo用于取得某一窗口类的信息,原形如下:

BOOLGetClassInfo(HINSTANCEhInstance,LPCTSTRlpClassName,LPWNDCLASSlpWndClass);

第一个参数hInstance,表示创建窗口类的当前运行的应用程序实例。

第二个参数lpClassName,要获取的窗口类的类名。

第三个参数lpWndClass,指向WNDCLASS结构类型的对象,函数调用后获取的窗口类的信息存放到该参数中。

2.在CMainFrame:

:

OnCreate中修改。

●利用SetWindowLong函数,如下:

intCMainFrame:

:

OnCreate(LPCREATESTRUCTlpCreateStruct)

{……

SetWindowLong(m_hWnd,GWL_STYLE,

:

:

GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);

return0;

}

其中,GetWindowLong函数用于取得指定窗口的信息,函数原形如下:

LONGGetWindowLong(HWNDhWnd,intnIndex);

第一个参数hWnd,表示要获取信息的窗口句柄,或窗口类所在的窗口.

第二个参数nIndex,要获取的信息索引,此参数可取下列值:

GWL_EXSTYLE获取窗口的扩展风格

GWL_STYLE获取窗口的样式

GWL_WNDPROC获取窗口过程的回调函数

函数SetWindowLong,用于改变指定窗口的属性风格,该函数原形如下:

LONGSetWindowLong(HWNDhWnd,intnIndex,LONGdwNewLong);

第一个参数hWnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口.

第二个参数nIndex,要设置的属性的索引,此参数可取下列值:

GWL_EXSTYLE设置新的窗口扩展风格

GWL_STYLE设置新的窗口样式

GWL_ID分配一个新的窗口标识

第三个参数dwNewLong,表示要设置的新的属性值。

上段代码的实现过程是首先调用GetWindowLong获取当前窗口的信息,然后去掉最大化按钮,最后调用SetWindowLong,给窗口设置新的属性。

●利用SetClassLong函数,如下:

intCMainFrame:

:

OnCreate(LPCREATESTRUCTlpCreateStruct)

{……

SetClassLong(m_hWnd,GCL_HICON,

(long)AfxGetApp()->LoadIcon(IDI_ICON1));

return0;

}

其中,函数SetClassLong用于重置当前窗口所包含的窗口类的WNDCLASS结构中的指定数据成员的属性,函数原形如下:

DWORDSetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong);

第一个参数hWnd,表示要设置新属性的窗口句柄,或窗口类所在的窗口.

第二个参数nIndex,要设置的属性的索引,此参数可取下列值:

GCL_HBRBACKGROUND设置新的背景画刷

GCL_HCURSOR设置新的光标

GCL_HICON设置新的图标

GCL_STYLE设置新的窗口样式

第三个参数dwNewLong,表示要设置的新的属性值。

9.1.2在视图类中修改程序外观

1.在EX09_00View:

:

PreCreateWindow中修改

●重新设计、填写WNDCLASS,代码如下:

BOOLCEX09_00View:

:

PreCreateWindow(CREATESTRUCT&cs)

{

//TODO:

ModifytheWindowclassorstylesherebymodifying

//theCREATESTRUCTcs

//定义并设计新的窗口类wndClass

WNDCLASSwndClass;

wndClass.style=CS_HREDRAW;

wndClass.lpfnWndProc=(WNDPROC):

:

DefWindowProc;

wndClass.cbClsExtra=0;

wndClass.cbWndExtra=0;

wndClass.hInstance=:

:

AfxGetInstanceHandle();

wndClass.hIcon=LoadIcon(:

:

AfxGetInstanceHandle(),

MAKEINTRESOURCE(IDI_ICON1));

wndClass.hCursor=LoadCursor(NULL,IDC_NO);

//定义新的画刷来修改窗体类的背景色

LOGBRUSHlgbr;

lgbr.lbStyle=BS_SOLID;

lgbr.lbColor=RGB(255,255,0);

lgbr.lbHatch=HS_CROSS;

wndClass.hbrBackground=CreateBrushIndirect(&lgbr);

wndClass.lpszMenuName=NULL;

wndClass.lpszClassName="hello";

//注册窗口类

RegisterClass(&wndClass);

cs.lpszClass="hello";

returnCView:

:

PreCreateWindow(cs);

}

该段代码放在框架窗口类中时,光标及背景并没有改变,将代码移到视图类中,就会看到如图9-02所示的效果。

图9-02修改了显示的光标及背景

●利用AfxRegisterWndClass函数,代码如下:

BOOLCEX09_00View:

:

PreCreateWindow(CREATESTRUCT&cs)

{

cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,

LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);

returnCView:

:

PreCreateWindow(cs);

}

运行程序结果如图9-03所示。

图9-03修改成十字光标和黑色背景

2.在CEX09_00View:

:

OnCreate中修改。

●利用SetClassLong函数,如下:

intCEX09_00View:

:

OnCreate(LPCREATESTRUCTlpCreateStruct)

{

if(CView:

:

OnCreate(lpCreateStruct)==-1)

return-1;

//TODO:

Addyourspecializedcreationcodehere

SetClassLong(m_hWnd,GCL_HCURSOR,

(LONG)LoadCursor(NULL,IDC_UPARROW));

return0;

}

运行结果如图9-04所示。

图9-04改回正常的光标

9.2制作动画图标

本节将通过一个实例来讲述如何给自己的应用程序添加一组不断的动态显示的图标。

本实例将使应用程序框架上的图标不断的变化,显示为一组脸部表情,当然,用到的图标是事先拷贝到文件夹EX09_01\res下面的,我们在本工程的资源面板中只要导入这些图标就可以了,不需要自己再动手画一些图标了。

完整例程请参见光盘中例子代码EX09_01,具体操作步骤如下:

●步骤1:

新建一个MFC单文档应用程序,工程名为EX09_01或用户自定义。

●步骤2:

在资源面板中导入五个图标。

五个图标的名称分别为FACE01.ICO、FACE02.ICO、FACE03.ICO、FACE04.ICO、FACE05.ICO(包含在EX09_01\res文件夹下)。

打开工作台的ResourceView页面,右击Icon文件夹,在弹出的快捷方式菜单中选择Import菜单项,弹出如图9-05所示的ImportResource导入资源对话框,打开EX09_01\res文件夹,将该文件夹下的五个脸部图标一一导入到工程中。

五个图标的ID均采用默认的IDI_ICON1、IDI_ICON2、IDI_ICON3、IDI_ICON4、IDI_ICON5。

●步骤3:

在框架窗口类中添加成员变量m_hIcon[5]。

我们知道,通常改变图标的操作是在框架窗口类中,因此,在CMainFrame类中添加HICON类型的成员变量m_hIcon[5],用来加载并保存图标资源。

图9-05导入图标资源

●步骤4:

在框架窗口类的OnCreate函数中中加载图标并设置计时器,代码如下:

intCMainFrame:

:

OnCreate(LPCREATESTRUCTlpCreateStruct)

{……

//加载图标资源

m_hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON1);

m_hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON2);

m_hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON3);

m_hIcon[3]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON4));

m_hIcon[4]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON5));

//改变框架的图标

SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[0]);

SetTimer(1,500,NULL);

return0;

}

上段代码中,在加载五个图标时采用了三种方法,然而三种方法的原理是相同的,然后调用SetClassLong函数将框架的图标替换成第一个我们自己加载的图标,最后,设置计时器。

那么接下来的工作就是在计时器事件中使图标不断的变化。

●步骤5:

在CMainFrame类中添加OnTimer函数,代码如下:

voidCMainFrame:

:

OnTimer(UINTnIDEvent)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

staticintiIndex=0;

iIndex=++iIndex%5;

SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[iIndex]);

CFrameWnd:

:

OnTimer(nIDEvent);

}

其中,定义了一个静态整型变量iIndex,用来标识图标数组变量的下标,静态变量在函数执行完毕时,内存空间不释放,并且变量的值仍然保留。

第二句代码iIndex=++iIndex%5;的作用是将iIndex控制在0到4范围内,因为m_hIcon数组变量的下标为0到4。

最后调用函数SetClassLong,在计时器触发时改变图标的显示。

9.3将图片作为窗体背景

上一节中,我们介绍了如何修改MFCAppWizard生成的应用程序框架,包括窗口背景等属性,但是,上一节中修改后的窗口背景最对也只是改变了颜色,本节将向读者介绍如何将一幅图片作为窗口显示的背景。

通常情况下,将一幅位图选做窗口背景都经过以下几个步骤:

1.创建一个兼容设备描述表

2.创建及装入位图资源

3.将位图选入兼容设备描述表

4.将兼容设备描述表上的内容拷贝到当前设备描述表上

读者大概不能够很好的理解以上所说的几个步骤,不要紧,下面我们将通过一个实例来解释以上几个步骤,完整例程请参见光盘中例子代码EX09_02,具体操作步骤如下:

●步骤1:

新建一个MFC单文档应用程序,工程名为EX09_02或用户自定义。

●步骤2:

在资源面板中添加一幅位图资源。

图9-06插入资源对话框

可以找一幅自己喜欢的比较漂亮的位图,拷贝到本工程文件夹下的res文件夹里,命名为bitmap.bmp,然后打开工作台的ResourceView页面,选择菜单Insert|Resource,弹出如图9-06所示插入资源InsertResource对话框,在该对话框上选中Bitmap,然后单击对话框右边的Import按钮。

单击Import按钮后,弹出如图9-07所示的导入资源对话框,打开EX09_02\res文件夹,选中该文件夹下的bitmap.bmp文件,单击Import按钮将该位图导入到工程中。

图9-07导入bitmap.bmp位图资源

将位图导入到工程中时,会弹出如图9-08所示的消息框,该消息框提示用户位图已经正确的导入到工程中了,但是由于位图的颜色大于256位色,因此不能加载到VisualC++的位图编辑器中,并且不能编辑该位图,我们可以不必去理会它,因为我们并不想修改这个位图。

但是,如果读者在加载位图之后,希望能够修改这个位图,那么你加导入到工程中的位图就应该至少是256位颜色以下的位图。

图9-08消息提示框

位图加载之后,就采用缺省的ID号IDB_BITMAP1。

●步骤3:

在CEX09_02View:

:

OnDraw函数中贴图。

1.产生一个兼容DC:

CDCdcCompatible;

dcCompatible.CreateCompatibleDC(pDC);

调用CDC类的成员函数CreateCompatibleDC用于创建兼容某一设备描述表的一个兼容DC,函数原形如下:

BOOLCreateCompatibleDC(CDC*pDC);

该函数只有一个参数pDC,指向要兼容的设备描述表,如果该参数为NULL,那么创建的兼容DC是兼容系统显示屏幕的。

本例中兼容的DC就是CEX09_02View:

:

OnDraw函数中由系统传来的pDC。

2.创建及装入位图资源:

CBitmapbmp;

bmp.LoadBitmap(IDB_BITMAP1);

代码中首先创建一个CBitmap类的对象bmp,然后调用CBitmap类的成员函数LoadBitmap,将位图资源载入对象bmp中。

3.将位图选入兼容DC

dcCompatible.SelectObject(&bmp);

4.将兼容DC上的内容拷入当前DC上

CRectrect;

GetClientRect(&rect);

pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);

函数GetClientRect用于获取客户区的矩形大小,该函数只有一个参数为CRect类或RECT结构的对象引用,调用该函数之后返回的矩形大小就存放在此参数中。

函数BitBlt,用于将源DC上的位图拷贝到目的DC,函数原形如下:

BOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,inty

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

当前位置:首页 > 初中教育 > 数学

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

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