通用对话框和自定义对话框的使用及图形绘制函数的使用和定时器的设置.doc
《通用对话框和自定义对话框的使用及图形绘制函数的使用和定时器的设置.doc》由会员分享,可在线阅读,更多相关《通用对话框和自定义对话框的使用及图形绘制函数的使用和定时器的设置.doc(36页珍藏版)》请在冰豆网上搜索。
山东大学威海分校电子系2007级
面向对象编程技术
实验四实验报告
班级:
学号:
姓名:
***
版本号:
1
时间:
2009-11-07
目录
1实验要求 ………..3
2实验过程及结果 ..3
A对话框部分 3
基本要求部分 3-5
刷新窗口显示 5-13
B图形绘制部分 13
基本要求部分 13
刷新窗口显示 13-20
C定时器部分 20-21
D问题及解决方案 21
3实验总结 21-22
附录关键代码 22
1.对话框,时钟程序代码:
22-29
2.图形绘制函数代码:
29-36
1.实验要求
掌握通用对话框和自定义对话框的使用;掌握图形绘制函数的使用;掌握定时器的设置和定时消息响应
2.实验过程及结果
A.对话框部分:
1.研究第五章示例程序,理解通用对话框、自定义对话框的使用方式。
2.在自己的工作目录中建立新工程,工程名称DuiHuaKuang,文件名称DuiHuaKuang.cpp。
从已有的示例程序中选取适当的代码,修改形成自己的框架。
3.增加对WM_PAINT消息的处理,在窗口客户区输出文本。
显示如下图:
4.增加菜单资源,要求至少包含“更改文本颜色”和“更改背景颜色”两个命令。
截图如下所示:
5.自定义一个简单的对话框,该对话框内至少有一个“选择背景色”按钮和一个静态文本框(或Edit框)以及确定、取消两个按钮。
截图如下所示:
6.编写上述自定义对话框的处理函数:
BOOLCALLBACKColorDlgProc(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)
7.增加响应菜单命令的代码
8.在“更改文本颜色”命令的响应中调用通用颜色对话框选择新的颜色。
新选定的文本颜色用全局变量或静态变量保存,在主窗口刷新消息(WM_PAINT)处理中用该颜色显示原来输出的文本。
9.更改背景颜色命令响应中激活自定义对话框,对话框结束后,根据选择的颜色,结合SetClassLong和CreateSolidBrush函数,创建新的画刷,并替换原来主窗口类使用的画刷。
( HBRUSHhbrBack=CreateSolidBrush(dwColor);
SetClassLong(hWnd,GCL_HBRBACKGROUND,(LONG)hbrBack); )
10.
11.刷新窗口看显示结果是否符合要求。
运行结果显示如下图:
单击鼠标左键,弹出自定义对话框,点击“请选择文字颜色”按钮,弹出通用对话框。
选择好文字颜色,点击“确定”按钮,文字颜色值显示在静态文本框中如下图所示:
点击确定后,文字颜色修改成功:
选择菜单中编辑下的”更改文字颜色”选项,弹出通用对话框:
选择好颜色后,选“确定”则文字颜色改变:
选择菜单中编辑下“更改背景颜色”选项,弹出自定义对话框:
输入颜色值:
按“确定”按钮后:
B.图形绘制函数的使用
1.研习EASYGDI示例程序。
查看各个GDI绘制函数的使用方法。
2.在自己的工作目录中建立新工程。
要求同2
3.增加对WM_PAINT消息的处理,在其中使用
a)Polyline
b)PolyPolyline
c)Polygon
d)PolyPolygon
等函数,注意在WM_PAINT消息中对HDC的获取和释放使用的函数是BeginPaint和EndPaint函数。
4.按与Polyline相同的函数格式编写自定义的折线绘制函数,新函数命名为MyPolyline(用MoveToEx和LineTo实现),用该函数替换上一步代码(11)中的Polyline,应该获得同样的运行结果。
5.编写MyPolyPolyline和MyPolyPolygon,替换11中的库函数,获得同样的运行结果,以此加深对函数编写、指针方式参数传递的理解。
6.刷新窗口看显示结果是否符合要求。
运行结果显示如下图:
在菜单下选择“编辑”下的Paint_polyline选项,则图形如下所示:
在菜单下选择“编辑”下的Paint_polygon选项,则图形如下所示
:
在菜单下选择“编辑”下的Paint_polypolygon选项,则图形如下所示:
在菜单“更改”中选择MyPolyline,调用自定义Polyline函数显示如下图所示:
在菜单“更改”中选择MyPolypolyline,调用自定义Polypolyline函数显示如下图所示:
在菜单“更改”中选择MyPolypolygon,调用自定义Polypolygon函数显示如下图所示:
该函数没有调用成功.
C.定时器使用
1.在WM_CREATE消息中增加设置定时器的代码(用SetTimer函数):
timerRet=SetTimer(hWnd,100,500,NULL);
2.在窗口过程的消息处理代码中增加WM_TIMER消息的处理,处理的内容包括:
a)用SYSTEMTIME结构定义一个时间结构变量:
SYSTEMTIMEsystemtime;
b)用GetSysteTime函数或GetLocalTime函数取出系统时间或本地时间
c)将时间值打印成字符串(可以使用wsprintf函数或sprintf函数)
d)使用GetDC函数获取HDC
e)用TextOut或DrawText函数输出文本
f)用ReleaseDC函数释放先前获取的HDC
3.在WM_DESTROY消息中增加删除已创建的定时器的代码(用KillTimer函数)
4.部分代码:
caseWM_TIMER:
/////时钟
GetLocalTime(&systemtime);
wsprintf(sz,"%04d-%02d-%02d%02d:
%02d:
%02d",systemtime.wYear,systemtime.wMonth,
systemtime.wDay,systemtime.wHour,systemtime.wMinute,systemtime.wSecond);
hdc=GetDC(hWnd);
TextOut(hdc,500,10,sz,strlen(sz));
ReleaseDC(hWnd,hdc);
return0;
caseWM_DESTROY:
KillTimer(hWnd,NULL);
PostQuitMessage(0);
return0;
D.问题及解决方案
1.一个工程多个.cpp文件的试验,没有思路,不知道该怎样做。
2.在做对话框实验时,怎样使菜单中更改文字颜色和自定义对话框中的更改文字颜色相对应,使两者的颜色值保持一致,是个问题,没有解决。
3.在批处理文件中增加对本次实验产生的工程的处理,还是不知道什么事批处理。
3.实验总结
这次试验和上次实验不同,实验步骤比较多,做起来也相当的费时间。
我花费的时间很多,效果并不是很理想。
编程有时候真的是需要天赋的,但是后天的努力也很重要。
只有多花时间,多尝试,多做才能理解得更加透彻,才能更好地理解Windows编程的过程。
这次试验在一定程度上提高了自己的动手能力,不过问题还是挺多的。
以后我会更加努力的学习,多花时间练习,一定要把编程练好。
只有多花时间,才能把编程学好。
附录:
程序代码
1对话框.时钟部分程序代码:
/*******************************************************************
程序:
DuiHuaKuang
文件:
DuiHuaKuang.c
功能:
Windows对话框应用程序
********************************************************************/
#include
#include
#include"resource.h"
#include"z.h"
BOOLInitWindow(HINSTANCEhInstance,intnCmdShow);
LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);
BOOLCALLBACKColorDlgProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);
BOOLCALLBACKColorDlgProc2(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);
HINSTANCEhInst;
HACCELhAccel;
HWNDhwnd;
HMENUhPopMenu;
COLORREFselectedcolor,crText;
//HBRUSHHBackground;
staticCHOOSECOLORcc;
/*******************************************************************
函数:
WinMain()
功能:
Win32应用程序入口函数。
创建主窗口,处理消息循环
********************************************************************/
intWINAPIWinMain(HINSTANCEhInstance,//当前实例句柄
HINSTANCEhPrevInstance,//前一个实例句柄
PSTRszCmdLine,//命令行字符
intiCmdShow)//窗口显示方式
{
MSGmsg;
if(!
InitWindow(hInstance,iCmdShow))
returnFALSE;
while(GetMessage(&msg,NULL,0,0))
{
if(!
TranslateAccelerator(hwnd,hAccel,&msg))//修改消息循环设置加速键
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
returnmsg.wParam;
}
/******