Windows程序设计C语言实训报告文档格式.docx

上传人:b****5 文档编号:16895763 上传时间:2022-11-26 格式:DOCX 页数:32 大小:484.54KB
下载 相关 举报
Windows程序设计C语言实训报告文档格式.docx_第1页
第1页 / 共32页
Windows程序设计C语言实训报告文档格式.docx_第2页
第2页 / 共32页
Windows程序设计C语言实训报告文档格式.docx_第3页
第3页 / 共32页
Windows程序设计C语言实训报告文档格式.docx_第4页
第4页 / 共32页
Windows程序设计C语言实训报告文档格式.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

Windows程序设计C语言实训报告文档格式.docx

《Windows程序设计C语言实训报告文档格式.docx》由会员分享,可在线阅读,更多相关《Windows程序设计C语言实训报告文档格式.docx(32页珍藏版)》请在冰豆网上搜索。

Windows程序设计C语言实训报告文档格式.docx

输入要求:

(1)用户可以根据需求,选定相应的操作项目。

进入每个操作后,通过窗口的文本框,从键盘输入相应的信息。

程序根据用户输入的信息完成相应的处理,实现要求的功能。

(2)能对输入的数据进行简单的校验,例如,采购日期必须是一个合法的日期格式,采购编号是唯一的(一次采购对应一个采购编号)。

输出要求:

(1)应用程序运行后,要在屏幕上显示一个按钮形式的“菜单”。

(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。

(3)在程序完成处理后,要清楚地给出程序的处理结果。

例如,在给定采购编号删除采购信息时,如果该采购编号不存在,要提示没能删除,如果删除成功要提示删除成功。

实现要求:

(1)在程序中使用链表存储采购信息。

(2)采用模块化程序设计的方法,将程序中的各项功能用函数实现。

提示:

(1)使用结构体表示采购信息,一个结点保存一条采购信息

扩展功能:

(1)提供一些统计功能。

例如根据零部件名称统计采购数量,根据采购员统计采购的次数。

(2)采购信息从文件读入。

(3)将采购信息保存到文件中。

2.系统设计

本系统主要实现管理员对汽车零部件采购的管理。

在运行界面上,管理员可以实现如下功能:

系统的总体结构设计遵循如下原则:

(1)系统应具有良好的适应性。

能适应用户对系统的软件环境、管理内容、模块和界面的要求‘

(2)系统应具有可靠性。

采用成熟的技术方法以保证在以后的实际运用中安全可靠。

(3)系统应具有良好的安全性。

(4)系统的设计开发应符合信息安全化建设的要求。

界面设计

用户界面。

包括

按钮,以及零部件名称、编号、采购信息等文本框。

采购功能图如下:

系统分析

(1)主函数的流程分析与设计

Windows应用程序的执行过程

Windows应用程序中基本构成元素是“窗口”,在窗口上放置了许多的其他元素,例如按钮、文本框。

当程序运行时,首先执行主函数。

在主函数中需要创建窗口,每个窗口都需要有一个窗口函数来处理在该窗口上产生的事件的消息。

然后循环等待接受从Windows操作系统传递来消息。

当在窗口上产生一个事件时,Windows操作系统会将这事件转换为一个消息。

例如,用户按下了鼠标按钮,就产生一个鼠标事件,这个鼠标事件会转换为一个按下鼠标的消息。

这些消息首先被送给Windows操作系统的,Windows操作系统将消息放在一个称为消息队列中,由Windows的消息发送程序转发给对应的窗口(Windows操作系统自动完成)。

消息一般用一个32位的整数来标识,这个整数唯一地标识这个消息。

对于窗口接收到的每条消息,会被传送到一个被称为窗口函数的函数中(通常是WndProc函数),并使用一个参数message来标识这些消息。

在该函数中根据消息判断已经发生了哪个具体事件,从而执行相应的处理。

Windows的消息可分为四种类型:

输入消息:

对键盘和鼠标输入作反应。

控制消息:

用来与Windows的控件,例如,对话框、列表框、按钮等进行双向通信。

系统消息:

对程式化的事件或系统时钟中断作出反应。

用户消息:

由程序员创建的,这些消息只从应用程序的某一部分进入到该应用程序的另一部分而被处理,不会离开应用程序。

因此,在Windows应用程序中,其核心事件驱动方式都是围绕着消息的产生与处理展开,事件驱动是靠消息循环机制来实现的。

如下图。

图5消息循环

Windows程序的结构

Windows程序具有较独特的结构,即Windows程序是有一定的框架的,在编写基于C语言的Windows应用程序时必须要了解构成Windows应用程序的构成结构,然后就是用特定的内容(代码)来填充这个框架,实现程序功能。

典型的Windows程序的应该具有如下的结构:

(1)主函数

主函数WinMain是Windows应用程序的入口,同时也是Windows应用程序的“容器”。

Windows应用程序中的窗口需要在主函数建立;

程序的消息循环也要在其中设置。

因此在主函数中我们要做的就是三件事:

①注册窗口类

Windows应用程序中一个基本的组成就是窗口,每一个窗口都有一些共同的特征,是属于某个类型的。

在主函数中必须注册一个窗口类,在该窗口类中指定这类型的窗口的一些公共的特征。

以便在Windows应用程序中建立窗口时,可以该窗口所属的类型。

窗口类不是C++语言中“类”的概念,它是表示一种类型的窗口,在Windows系统中,使用WNDCLASS结构体类型表示“窗口类”。

在该结构体中定义了许多的成员,用于描述窗口的特征。

在主函数中注册窗口类的过程如下:

首先,必须定义一个WNDCLASS类型的结构体变量,一个窗口类变量表示Windows程序中的“一种类型的窗口”,定义的方法如下:

WNDCLASSwndclass;

其次,在定义了WNDCLASS结构体变量后必须给该变量的成员赋值,用以指定该窗口类的具体特征。

例如:

wndclass.style=CS_VREDRAW|CS_HREDRAW;

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

说明:

WNDCLASS结构体有一个属性:

lpszClassName,它表示该窗口类变量的“名称”,它是一个字符串类型的,通过给该属性赋值一个字符串,可以通过该名称使用该窗口类。

再次使用API函数:

RegisterClass函数注册窗口类,使用方式就是将定义的WNDCLASS的变量地址作为该函数的实参。

RegisterClass(&

wndclass);

②建立窗口

Windows应用程序中最重要就是“窗口”,在主函数中必须要建立窗口,使程序运行时能显示一个“窗口”供用户使用。

Windows系统中使用HWND结构体类型表示,窗口建立窗口的过程如下:

首先,定义HWND类型的窗口变量,一个窗口变量对应着Windows应用程序中的一个具体的“窗口”,定义方法如下:

HWNDhwnd;

其次,创建窗口,创建窗口的方法就是API函数:

CreateWindow函数。

注意:

窗口类中已经预先定义了窗口的一般属性,而创建一个具体的窗口时,通过CreateWindow函数中的参数中是进一步指定窗口更具体的属性。

窗口所属的窗口类,窗口中的标题,窗口显示的位置和窗口的大小等。

CreateWindow函数的调用方式如下:

hwnd=CreateWindow(szAppName,TEXT("

新窗口"

),WS_OVERLAPPEDWINDOW,

800,600,NULL,NULL,hInstance,NULL);

说明,这个函数的参数非常重要,用于指定窗口的特征:

第一个参数:

表示的是窗口属于的窗口类型(窗口类),它的值必须是在设置窗口类属性为lpszClassName属性指定的字符串。

第二个参数:

一个字符串,当窗口显示时,将该参数中的字符串显示在窗口的标题位置。

第三个参数:

表示该窗口的显示风格,例如该窗口是否是一个带边框的窗口,是否有标题框的窗口等。

第四、五个参数:

表示窗口显示的位置(x坐标、y坐标)

第六、七个参数:

表示窗口显示的大小(宽、高)

第八个参数:

表示打开窗口的父窗口。

第九个参数:

有没有菜单

第十个参数:

打开该窗口的应用程序的句柄

第十一个参数:

表示传递给窗口的WM_CREATE消息(创建消息)

再次,显示窗口,创建了窗口后,该窗口并没有显示,需要使用API函数:

ShowWindow函数将已经创建的窗口在屏幕上显示。

调用方式如下:

ShowWindow(hWnd,nShowCmd);

表示需要显示的、已经创建的窗口变量。

表示显示窗口时窗口显示的状态,即是最大化、最小化等。

在调用函数ShowWindow后,一般会再调用函数UpdateWindow,通过该函数,向操作系统发送一个WM_PAINT消息来更新指定窗口的客户区。

③消息循环处理

在主函数必须构建一个循环以实现对消息循环处理,它使用循环语句实现。

循环语句的实现方法是:

在该循环中不断的从应用程序消息队列中检索一条消息,并将其存放一个变量中,这个消息需要翻译,即转换成程序可以识别的表示,然后再将消息派发到窗口函数中,以便应用程序对消息进行判断,执行相应的处理。

(即实现事件驱动方式的对事件响应)。

也就是说我们在窗口的过程函数中处理消息。

当消息传递给窗口函数后,Windows操作系统会调用该函数,从而执行函数中代码,达到处理消息的目的。

消息循环的步骤如下:

首先,定义一个能保存从应用程序消息队列中检索的一条消息

Windows系统中,使用MSG结构体类型来表示一个Windows消息。

在主函数中必须定义一个MSG结构体类型的变量,以便可以保存消息。

定义的方法如下:

MSG msg;

其次,从应用程序消息队列中检索的消息

在主函数中的消息循环中必须要能从应用程序消息队列中检索消息,并能将其保存,这是通过调用API函数:

GetMessage函数实现的。

GetMessage函数只会检索只属于本应用程序的消息,并且会一直等待有消息到来才有返回值。

(类似于scanf等待用户从键盘输入)。

调用方法如下:

GetMessage(&

Msg,NULL,0,0);

用于存放消息的MSG结构体类型的变量的地址。

(回想在函数中通过指针型参数修改函数外的变量)

取得其消息的窗口的句柄。

当其值取NULL时,GetMessage函数为属于应用程序的所有窗口检索消息。

(即指定只检索在某个窗口上产生的消息,在主函数中调用时一般为NULL)

第三、四个参数一般为0。

再次,翻译消息:

在获取到属于本应用程序中的消息后,需要将其转换成程序可识别的方式,这个过程可以通过调用API函数:

TranslateMessage函数完成,调用方式如下:

TranslateMessage(&

msg);

参数是保存消息的MSG类型的变量的地址。

最后,将消息分发到窗口函数:

在翻译了消息后,需要将该消息分发到窗口函数,以便使Windwos调用窗口函数。

可以调用API函数:

DispatchMessage函数实现。

调用过程如下:

DispatchMessage(&

总结:

上述的消息循环实现的代码一般如下:

(要求msg变量已经定义)

while(GetMessage(&

msg,NULL,0,0L))

{

}

GetMessage的返回值作为while循环的条件,当GetMessage函数返回“假”时结束循环,从而也就结束程序。

(2)系统模块划分

整个系统依据其功能主要分为以下几个模块:

(1)导入:

选择文件,将零部件的信息显示在相应的位置。

(2)从键盘输入采购信息:

从键盘写入采购信息到链表。

(3)指定采购编号,显示采购的零部件信息:

从键盘输入编号,在链表中找到该结构体,显示信息。

(4指定零部件名称,显示该零部件的所有采购信息:

从键盘输入零部件名称,在链表中找到该结构体,显示信息。

(5)给定采购编号,修改采购信息:

从键盘输入编号,在链表中找到该结构体,修改信息并保存。

(6)给定采购编号,删除采购信息:

从键盘输入编号,在链表中找到该结构体,删除信息。

3.程序测试与运行结果

VC6.0运行环境窗口

运行界面

导入

编号查找

名称查找

修改

增加

删除

4.实训总结

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

windows程序设计也就是基于微软的windows操作系统而进行的程序设计。

你有没有想过,为什么是基于windows操作系统呢?

下面就来解答:

windows应用程序需要利用由windows操作系统开放出来公用用程序使用的应用程序接口“API”windows提供了上千种API函数供应用程序使用。

上面说了,windows程序其实就是在非逻辑的使用这些API函数,我这里

提到了“非逻辑”三个字(这是本人的看法),这正是windows程序的精髓,这是一切windows程序运行的方式。

非逻辑也就是指程序不是按照事先安排好的顺序来进行的,是根据用户的不同操作或者是其他某些原因一步一步进行的。

这种运行方式就叫做“消息驱动”

简单一点来解释一下何谓消息驱动,就是指应用程序始终在等待,它绝对不是在等待谁会给它爱它是在等待用户或者是系统的消息(也就是命令),当接到消息后呢,它会把消息通过DispatchMessage(&

msg)传递给窗口函数(窗口函数就是一个应用程序的核心)窗口函数就会对照事先由程序编写好的消息对照表调用对应的方法来处理消息。

这样就完成一个消息的处理,接下来准备处理下一个消息。

你也许会问那不是无休止的运行下去了吗?

当然不会,下面我用程序

本身来说明这个问题:

//消息循环,通过此处来不断的取得消息。

while(GetMessage(&

msg,NULL,0,0))

//消息进行一些转换

TranslateMessage(&

//把消息传向窗口函数

DispatchMessage(&

}

returnmsg.wParam;

就是这样了:

当我们点击窗口右上角的小叉或者点击退出按钮时,

windows就会自动在我们的消息队列中加入一条消息“WM_DESTROY”,这

时呢窗口程序有这么一部分:

switch(message)

//其它代码

.........

//

caseWM_DESTROY:

PostQuitMessage(0);

return0;

相信一般的朋友都会明白吧,它的作用的就是在接收到WM_DESTROY时呢,

通过调用PostQuitMessage(0)让windows在消息列表中呢在加入另一条消

息“WM_QUIT"

.

当GetMessage函数抓取到WM_QUIT时返回0,其余返回非0值,懂了吧,

这下可以退出消息循环了。

这就是windows程序设计最基础的部分了,可以说是核心。

我认为学习windows程序设计不要基于某一部分,而要把握住其大局,要有整体观,有了整体观对windows程序设计有了一定的了解后在对其各部分下功夫,这样才不会走火入魔

5.程序源代码

#include<

windows.h>

stdio.h>

LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

voidcreate(HWNDhwnd,LPARAMlParam);

voidprint();

voidcommand();

voidreadData();

voidname_serach();

voidnum_serach();

voiddaleteData();

voidadd();

num_mend();

voidsave();

RECTrect11;

RECTrect12;

RECTrect13;

RECTrect14;

RECTrect15;

RECTrect16;

RECTrect17;

RECTrect18;

RECTrect19;

RECTrect20;

HDChDC;

PAINTSTRUCTpaint;

structbuy{

intnum;

charpname[20];

longdate;

charname[20];

intamount;

intprice;

charplace[20];

structbuy*next;

};

structbuyhead={0,"

"

0,"

0,0,"

};

//初始化

intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)

staticTCHARszAppName[]=TEXT("

wj"

);

MSGmsg;

WNDCLASSwndclass;

wndclass.lpfnWndProc=WndProc;

wndclass.style=CS_HREDRAW|CS_VREDRAW;

wndclass.hInstance=hInstance;

wndclass.cbClsExtra=0;

wndclass.cbWndExtra=0;

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wndclass.lpszClassName=szAppName;

wndclass.lpszMenuName=NULL;

if(!

wndclass))

{

MessageBox(NULL,TEXT("

错误?

"

),TEXT("

错误"

),MB_OK|MB_ICONERROR);

return0;

hwnd=CreateWindow(szAppName,TEXT("

汽车零部件采购管理程序----王俊"

),WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&

msg,NULL,0,0))

TranslateMessage(&

msg);

DispatchMessage(&

returnmsg.wParam;

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

switch(message)

caseWM_PAINT:

print();

caseWM_CREATE:

create(hwnd,lParam);

caseWM_COMMAND:

command(hwnd,wParam);

caseWM_DESTROY:

PostQuitMessage(0);

returnDefWindowProc(hwnd,message,wParam,lParam);

voidprint(){

hDC=BeginPaint(hwnd,&

paint);

rect11.top=20;

rect11.right=120;

rect11.bottom=40;

rect11.left=30;

rect12.top=80;

rect12.right=120;

rect12.bottom=40;

rect12.left=30;

rect13.top=140;

rect13.right=120;

rect13.bottom=40;

rect13.left=30;

rect14.top=200;

rect14.right=120;

rect14.bottom=40;

rect14.left=30;

rect15.top=260;

rect15.right=120;

rect15.bottom=40;

rect15.left=30;

rect18.top=320;

rect18.right=120;

rect18.bottom=40;

rect18.left=30;

rect16.top=20;

rect16.right=700;

rect16.bottom=40;

rect16.left=30;

//大框

rect17.top=320;

rect17.right=120;

rect17.bottom=40;

rect17.left=30;

rect19.top=380;

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

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

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

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