}
调试要求:
在程序代码的main函数中设置断点,启动程序执行到断点处停止;
在函数narcissus调用处进入函数内部,跟踪函数执行的过程;
单步执行程序,观察各个变量值的变化情况;
单步执行若干步后,跳出函数体,回到main函数。
三、运行结果:
四、记录调试过程中变量值的变化情况:
五、在VisualC++6.0中如何进行程序的跟踪调试;
在VisualC++6.0中利用上述调试工具里的按钮以及设置断点,F11按钮进行程序的跟踪调试。
六、心得与体会:
本次实验是我严格意义上第一次做的VC++的程序,虽然上课时认真听讲,但还是对它有点陌生感。
但是在其他同学的积极帮助下,我最终还是完成率任务。
通过本次实验,我熟悉了VisualC++6.0的开发环境,知道了Win32ConsoleApplication、Win32Application和MFCAppWizard(exe)这三种项目类型对应的程序特点,知道如何调试程序,初步了解了各个项目类型程序的特点。
总之,不管以前基础如何,我一定要学好VC,为以后打下基础。
实验二熟悉Windows源程序基本结构
一、实验目的
(1)熟悉VisualC++6.0开发环境;
(2)熟悉Windows系统事件驱动的运行机制;
(3)熟悉Windows应用程序源程序基本结构;
二、实验内容
创建一个空白的Win32Application应用程序,建立相关文件,手工输入下列
代码,实现一个Windows窗口程序。
三、源程序
#include"windows.h"
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessgae,WPARAMwParam,LPARAMlParam);
//LRESULT处理消息产生的一个有符号值;
//WPARAM消息类型
//LPARAM传递参数
intWINAPIWinMain(HINSTANCEhThisInst,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow)
//WINAPI函数
//LPSTR字符串
{
WNDCLASSws;
//WNDCLASS窗口类
HWNDhWnd;
MSGmsg;
ws.style=0;
ws.lpfnWndProc=WndProc;
//WNDCLASSEX中最重要的成员。
前缀lpfn表示该成员是一个指向函数的长指针
ws.cbClsExtra=0;
ws.cbWndExtra=0;
ws.hInstance=hThisInst;
ws.hIcon=LoadIcon(NULL,IDI_HAND);
//Loadlcon图标
ws.hCursor=LoadCursor(NULL,IDC_CROSS);
//hCursor光标句柄
//IDC_CROSS十字光标
ws.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
//hbrBackground是主窗口背景色
ws.lpszMenuName=NULL;
ws.lpszClassName="DemoClass";
if(!
RegisterClass(&ws))
//RegisterClass注册窗口类
{
return-1;
}
hWnd=CreateWindow("DemoClass","MyFirstWindowsProgram",
WS_OVERLAPPEDWINDOW,100,200,640,480,
NULL,NULL,hThisInst,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
//该函数将虚拟键消息转换为字符消息
DispatchMessage(&msg);
//函数功能该函数分发一个消息给窗口程序。
}
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessgae,
WPARAMwParam,LPARAMlParam)
{
switch(messgae)
{
caseWM_DESTROY:
//发送WM_QUIT消息
PostQuitMessage(0);
//让消息循环退出
break;
default:
returnDefWindowProc(hwnd,messgae,wParam,lParam);
}
return0;
}
四、运行结果
1、该运行结果为鼠标不在对话框内的情况:
2、该图为鼠标在对话框内的情况:
五、Windows源程序的结构特点,及各个主要程序段的作用
1、事件驱动的程序设计
传统的MS-DOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。
而事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。
2、消息循环与输入
消息类似于DOS下的用户输入,但比DOS的输入来源要广,Windows应用程序的消息来源有以下四种:
(1)输入消息;
(2)控制消息;(3)系统消息;(4)用户消息。
3、图形输出
Windows程序不仅在输入上与DOS程序不同,而且在程序输出上也与DOS有着很大不同,主要表现为:
(1)、DOS程序独占整个显示屏幕,其他程序在后台等待。
(2)、Windows程序的所有输出都是图形。
(3)、Windows下的输出是设备无关的。
4、资源共享
对于DOS程序来说,它运行时独占系统的全部资源,包括显示器、内存等,在程序结束时才释放资源。
而Windows是一个多任务的操作系统,各个应用程序共享系统提供的资源,常见的资源包括:
设备上下文,画刷,画笔,字体,对话框控制,对话框,图标,定时器,插入符号,通信端口,电话线等。
5、Windows程序的组成
编写一个典型的Windows应用程序,一般需要:
(1)、C,CPP源程序文件;
(2)、H,HPP头文件;(3)、资源文件。
6Windows源程序的特点为:
图形界面,面向对象程序设计,事件驱动,高效的内存
管理,设备独立性动态连接。
六、实验总结
1、心得体会:
通过本次上机实验,受益匪浅。
虽然本次实验的源程序已给出,但是我们不能仅仅局限于以给定的程序,还应深入了解其所代表的意义,了解其功能,初步掌握其运行机理。
通过本次实验课,我又学到了许多新知识,扩展了眼界,并一定程度上对老师上课时所讲的内容进行了巩固。
实验三Windows图形绘制编程实验
一、实验目的
(1)熟悉VisualC++6.0开发环境;
(2)掌握Windows图形输出的方法;
(3)理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
二、实验内容
请编写程序,要求如下:
(1)定义一支黄色画笔,绘制一条线段;
(1)定义一支紫色画笔,绘制一条多段线;
(3)定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;
(4)定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;
(5)定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
三、源程序
//314.cpp:
Definestheentrypointfortheapplication.
//
#include"stdafx.h"
#include"resource.h"
#defineMAX_LOADSTRING100
//GlobalVariables:
HINSTANCEhInst;//currentinstance
TCHARszTitle[MAX_LOADSTRING];//Thetitlebartext
TCHARszWindowClass[MAX_LOADSTRING];//Thetitlebartext
//Fowarddeclarationsoffunctionsincludedinthiscodemodule:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
//TODO:
Placecodehere.
MSGmsg;
HACCELhAccelTable;
//Initializeglobalstrings
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDC_MY314,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//Performapplicationinitialization:
if(!
InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDC_MY314);
//Mainmessageloop:
while(GetMessage(&msg,NULL,0,0))
{
if(!
TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
returnmsg.wParam;
}
//
//FUNCTION:
MyRegisterClass()
//
//PURPOSE:
Registersthewindowclass.
//
//COMMENTS:
//
//Thisfunctionanditsusageisonlynecessaryifyouwantthiscode
//tobecompatiblewithWin32systemspriortothe'RegisterClassEx'
//functionthatwasaddedtoWindows95.Itisimportanttocallthisfunction
//sothattheapplicationwillget'wellformed'smalliconsassociated
//withit.
//
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_MY314);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=(LPCSTR)IDC_MY314;
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALL);
returnRegisterClassEx(&wcex);
}
//
//FUNCTION:
InitInstance(HANDLE,int)
//
//PURPOSE:
Savesinstancehandleandcreatesmainwindow
//
//COMMENTS:
//
//Inthisfunction,wesavetheinstancehandleinaglobalvariableand
//createanddisplaythemainprogramwindow.
//
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
HWNDhWnd;
hInst=hInstance;//Storeinstancehandleinourglobalvariable
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if(!
hWnd)
{
returnFALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
//
//FUNCTION:
WndProc(HWND,unsigned,WORD,LONG)
//
//PURPOSE:
Processesmessagesforthemainwindow.
//
//WM_COMMAND-processtheapplicationmenu
//WM_PAINT-Paintthemainwindow
//WM_DESTROY-postaquitmessageandreturn
//
//
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
intwmId,wmEvent;
PAINTSTRUCTps;
HDChdc;
HPENhP;
POINTpt[]={{70,200},{20,180},{20,100}};
POINTpm[]={{200,80},{300,80},{350,156},{300,237},{200,237},{150,156}};
HBRUSHhBr;
TCHARszHello[MAX_LOADSTRING];
LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);
switch(message)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//Parsethemenuselections:
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)About);
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
break;
caseWM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//TODO:
Addanydrawingcodehere...
RECTrt;
SetMapMode(hdc,MM_ANISOTROPIC);
hP=CreatePen(PS_SOLID,9,RGB(255,255,0));
//黄色画笔
SelectObject(hdc,hP);
MoveToEx(hdc,15,15,NULL);
LineTo(hdc,200,15);
//多线段
hP=CreatePen(PS_SOLID,4,RGB(200,0,200));
SelectObject(hdc,hP);
Polyline(hdc,pt,3);
//红色
hP=CreatePen(PS_SOLID,2,RGB(255,0,0));
SelectObject(hdc,hP);
hBr=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hdc,hBr);
Rectangle(hdc,300,300,400,400);
//绿色
hP=CreatePen(PS_SOLID,2,RGB(0,255,0));
SelectObject(hdc,hP);
hBr=(HBRUSH)GetStockObject(GRAY_BRUSH);
SelectObject(hdc,hBr);
Ellipse(hdc,30,30,100,100);
//蓝色
hP=CreatePen(PS_SOLID,2,RGB(0,0,255));
SelectObject(hdc,hP);
hBr=(HBRUSH)GetStockObject(GRAY_BRUSH);
SelectObject(hdc,hBr);
Polygon(hdc,pm,6);
GetClientRect(hWnd,&rt);
DrawText(hdc,szHello,strlen(szHello),&rt,DT_CENTER);
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
return0;
}
//Mesagehandlerforaboutbox.
LRESULTCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)
{
switch(message)
{
caseWM_INITDIALOG:
returnTRUE;
caseWM_COMMAND:
if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg,LOWORD(wParam));
returnTRUE;
}
break;
}
returnFALSE;}
四、运行结果:
五、在Windows程序中绘制图形的基本操作步骤
1、获取绘图的窗口句柄;
2、由绘图句柄得到设备环境句柄HDC;
3、图形绘制:
(1)、画笔:
CreatePen、SelectObject、DeleteObject、CreateSolidBrush、GetStockObject、CreateHatchBrush;
(2)、直线:
MoveToEx、LineTo、Rectangle、Ellipse。
六、实验心得与体会:
本次实验是对Windows图形绘制的编程,虽然在课堂上老师仔细讲过该如何编程,但是在轮到自己做实验时还是有点力不从心。
仔细思考一下,还是由于自己的基本知