windows API 开发飞机订票系统 图形化界面 (二)
时间:2022-05-07
本文章向大家介绍windows API 开发飞机订票系统 图形化界面 (二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先,用到的数据结构的定义、以及全局变量和函数的声明如下:
1 // Flight.c : 定义应用程序的入口点。
2 //
3 #include "stdafx.h"
4
5 //订单
6 typedef struct OrderForm{
7 TCHAR IdNum[32]; //订单用户身份证号
8 int Order_Number; //订单号
9 int Tickets_Num; //订票数量
10 TCHAR Flight_Number[16]; //航班号
11 TCHAR Departure[16]; //出发地
12 TCHAR Destination[16]; //目的地
13 TCHAR Date[16]; //出发日期
14 TCHAR TakeOff_Time[16]; //起飞时间
15 TCHAR Landing_Time[16]; //降落时间
16 struct OrderForm *Next; //所有订单链表next
17 struct OrderForm *psgNext; //用户订单链表next
18 }OrderForm;
19
20 //乘客订单链表
21 typedef struct PsgOrderLink{
22 int OrderNum; //订单数目
23 OrderForm *head; //头结点
24 OrderForm *tail; //尾结点
25 }PsgOrderLink;
26
27 //所有订单列表
28 typedef struct AllOrderLink{
29 int AllOrderNum; //所有订单数目
30 OrderForm *head; //头结点
31 OrderForm *tail; //尾结点
32 }AllOrderLink;
33
34 //乘客
35 typedef struct Passenger{
36 TCHAR Name[16]; //姓名
37 TCHAR IdNum[32]; //身份证号码
38 TCHAR PassWord[32]; //密码
39 int TicketNum; //订单数目
40 PsgOrderLink OrderLink; //用户所有订单
41 struct Passenger *Next;
42 }Passenger;
43
44 //乘客链表
45 typedef struct PsgLinkList{
46 int PsgNum; //账户数量
47 Passenger *head; //头结点
48 Passenger *tail; //尾结点
49 }PsgLinkList;
50
51 //航班
52 typedef struct Flight{
53 double Fare; //票价
54 int Seat_Number; //座位数
55 int Vacant_Seat; //空余座位数
56 TCHAR Discount[16]; //折扣
57 TCHAR Flight_Number[16]; //航班号
58 TCHAR Departure[16]; //出发地
59 TCHAR Destination[16]; //目的地
60 TCHAR Date[16]; //出发日期
61 TCHAR TakeOff_Time[16]; //起飞时间
62 TCHAR Landing_Time[16]; //降落时间
63 struct Flight *Next;
64 }Flight;
65
66 //航班链表
67 typedef struct FlightLinkList{
68 Flight *head; //头结点
69 Flight *tail; //尾结点
70 int Flight_Number; //航班数目
71 }FilghtLinkList;
72
73
74 // 全局变量:
75 HICON hIcon;
76 HINSTANCE hInst; //当前实例
77 static TCHAR szBuffer[256]; //缓冲区
78 static PsgLinkList psglink; //所有账户_链表
79 static Passenger *passenger; //登陆账户信息
80 static AllOrderLink allorder; //所有订单_链表
81 static FilghtLinkList flightlink; //所有航班_链表
82
83
84
85 //函数声明
86 BOOL AccountLogIn(HWND); //账户登陆
87 BOOL AccountRegister(HWND); //注册账户
88 BOOL ReadFlightData(HWND); //读入航班信息
89 BOOL ReadAccountData(HWND); //读入账户资料
90 BOOL ReadAccountOrder(HWND,Passenger*); //读入所有订单、账户订单
91 BOOL SearchFlight(HWND); //查询航班
92 BOOL BookTickets(HWND); //订票
93 BOOL _Book_Tickets(HWND,Flight*,int); //订票
94 BOOL Recommend(HWND,Flight*,int); //航班建议
95 BOOL ReturnTickets(HWND); //退票
96 BOOL EntryFlight(HWND); //录入航班
97 BOOL ModifyFlight(HWND); //修改航班信息
98 BOOL PrintFlight(HWND, Flight*); //输出航班信息
99 BOOL WriteFlightData(HWND); //保存航班信息
100 BOOL WriteAccountData(HWND); //保存账户资料
101 BOOL WriteOrderData(HWND); //保存订单信息
102 BOOL CALLBACK LogInDlgProc(HWND, UINT, WPARAM, LPARAM); //登陆窗口窗口过程
103 BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM); //主界面窗口过程
104 BOOL CALLBACK NameDlgProc(HWND, UINT, WPARAM, LPARAM); //获取新注册用户姓名窗口过程
105 BOOL CALLBACK FlightNumDlgProc(HWND, UINT, WPARAM, LPARAM); //获取用户输入机票数量窗口过程
106 BOOL CALLBACK EntryFlightProc(HWND, UINT, WPARAM, LPARAM); //录入航班窗口过程
107 BOOL CALLBACK ModifyFlightProc(HWND, UINT, WPARAM, LPARAM); //修改航班信息窗口过程
因为采用的是windows API,所以首先要了解windows程序的消息机制。
Windows是一个以消息为导向的系统,程序只能被动地等待用户操作的消息,不能主动地去读键盘、鼠标等的状态,也就是说,每当键盘上有个键被按下,或者鼠标在屏幕某个位置点击以后,系统就会发出一个消息(Message)给窗口,告诉它某个键被按下去了或是鼠标按键的点击状态。当鼠标点击了程序的某个按钮只要鼠标移动一下,系统也会发出相应的消息,并把鼠标的坐标信息传给窗口。
当我们鼠标点击了我们程序的某个按钮时,会向系统的消息队列发送一个消息(Mseeage),此消息包含了你鼠标点击的位置、该程序的句柄以及鼠标点击时的状态(如是否按住ctrl键等等)。程序中每个窗口在程序代码都有对应的一个窗口过程,即处理由该窗口所产生的消息的函数,而我们写代码的主要工作就在这里了。
我程序的主函数代码如下:
1 //主函数
2 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
3 {
4
5 hInst = hInstance;
6 InitCommonControls();
7 hIcon=LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
8 return DialogBox(hInst, MAKEINTRESOURCE(IDD_LOGINDLG), NULL, (DLGPROC)LogInDlgProc);
9 }//WinMain
其中,下面这行代码用来加载程序图片:
hIcon=LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
下面贴出各个窗口的窗口过程:
1 //登陆窗口_窗口过程
2 BOOL CALLBACK LogInDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
3 {
4 switch (uMsg)
5 {
6 //WM_INITDIALOG是当其对话框和子控件全部创建完毕,将要显示内容的时候发送的消息
7 //因此可以在WM_INITDIALOG消息响应函数中添加对编辑框控件的初始化和修改
8 case WM_INITDIALOG:
9 {
10 if (hIcon)
11 SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
12 ReadAccountData(hwndDlg); //登陆对话框初始化时读入账户资料
13 ReadFlightData(hwndDlg); //登陆对话框初始化时读入航班信息
14 }//WM_INITDIALOG
15 return TRUE;
16
17 case WM_CLOSE:
18 {
19 EndDialog(hwndDlg, 0);
20 }//WM_CLOSE
21 return TRUE;
22
23 case WM_COMMAND:
24 {
25 switch (LOWORD(wParam))
26 {
27 case IDC_LOGIN:
28 AccountLogIn(hwndDlg); //登陆
29 break;
30 case IDC_REGISTER:
31 AccountRegister(hwndDlg); //注册
32 break;
33 }//switch
34 }//WM_COMMAND
35 return TRUE;
36
37 }//switch
38 return FALSE;
39 }//LogInDlgProc()
其中,下面这行代码用来加载程序标题栏图标
if (hIcon) SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
然后继续贴代码:
1 //主界面_窗口过程
2 BOOL CALLBACK MainDlgProc(HWND hMainDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
3 switch (uMsg)
4 {
5 case WM_INITDIALOG:
6 {
7 if (hIcon)
8 SendMessage(hMainDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
9 }//WM_INITDIALOG
10 return TRUE;
11
12 case WM_CLOSE:
13 {
14 //关闭程序时将信息保存
15 if (WriteOrderData(hMainDlg) && WriteAccountData(hMainDlg) && WriteFlightData(hMainDlg))
16 EndDialog(hMainDlg, 0);
17 else
18 MessageBox(hMainDlg, TEXT("保存信息错误!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
19 }//WM_CLOSE
20 return TRUE;
21
22 case WM_COMMAND:
23 {
24 switch (LOWORD(wParam))
25 {
26 case IDC_SEARCH:
27 {
28 SearchFlight(hMainDlg); //查找航班
29 break;
30 }
31 case IDC_TICKET:
32 {
33 BookTickets(hMainDlg); //订票
34 break;
35 }
36 case IDC_RETURNTICKET:
37 {
38 ReturnTickets(hMainDlg); //退票
39 break;
40 }
41 case IDC_ENTRY:
42 { //录入航班对话框
43 DialogBox(hInst, MAKEINTRESOURCE(IDD_ENTRY), NULL, (DLGPROC)EntryFlightProc);
44 break;
45 }
46 case IDC_MODIFYFLIGHT:
47 { //修改航班信息对话框
48 DialogBox(hInst, MAKEINTRESOURCE(IDD_MODIFYFLT), NULL, (DLGPROC)ModifyFlightProc);
49 break;
50 }
51 }//switch
52 }//WM_COMMAND
53 return TRUE;
54 }//switch
55 return FALSE;
56 }//MainDlgProc()
1 //获取用户输入机票数量_窗口过程
2 BOOL CALLBACK FlightNumDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
3 switch (uMsg)
4 {
5
6 case WM_INITDIALOG:
7 {
8 if (hIcon)
9 SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
10 }//WM_INITDIALOG
11 return TRUE;
12
13 case WM_CLOSE:
14 {
15 wsprintf(szBuffer, TEXT(" "));
16 EndDialog(hwndDlg, FALSE);
17 }//WM_CLOSE
18 return TRUE;
19
20 case WM_COMMAND:
21 {
22 switch (LOWORD(wParam))
23 {
24 case IDOK:
25 wsprintf(szBuffer, TEXT(" "));
26 GetDlgItemText(hwndDlg, IDC_TICKETNUM, szBuffer, 256);
27 EndDialog(hwndDlg, TRUE);
28 break;
29 }//switch
30 }//WM_COMMAND
31 return TRUE;
32
33 }//switch
34 return FALSE;
35 }
1 //录入航班_窗口过程
2 BOOL CALLBACK EntryFlightProc(HWND hEntryDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
3 switch (uMsg)
4 {
5 case WM_INITDIALOG:
6 {
7 if (hIcon)
8 SendMessage(hEntryDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
9 }
10 return TRUE;
11
12 case WM_CLOSE:
13 {
14 EndDialog(hEntryDlg, 0);
15 }//WM_CLOSE
16 return TRUE;
17
18 case WM_COMMAND:
19 {
20 switch (LOWORD(wParam))
21 {
22 case IDC_ADDFLT:
23 {
24 EntryFlight(hEntryDlg); //录入航班
25 break;
26 }//GETNAME
27 case IDC_QUIT:
28 {
29 EndDialog(hEntryDlg, FALSE);
30 break;
31 }//GETNAMECANCEL
32
33 }//stitch
34
35 }//WM_COMMAND
36 return TRUE;
37
38 }//stitch
39
40 return FALSE;
41 }
42
43
44 //修改航班信息_窗口过程
45 BOOL CALLBACK ModifyFlightProc(HWND hModifyDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
46 switch (uMsg)
47 {
48 case WM_INITDIALOG:
49 {
50 if (hIcon)
51 SendMessage(hModifyDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
52 }
53 return TRUE;
54
55 case WM_CLOSE:
56 {
57 EndDialog(hModifyDlg, 0);
58 }//WM_CLOSE
59 return TRUE;
60
61 case WM_COMMAND:
62 {
63 switch (LOWORD(wParam))
64 {
65 case IDC_MODIFY:
66 {
67 ModifyFlight(hModifyDlg); //修改航班信息
68 break;
69 }//GETNAME
70 case IDC_QUIT:
71 {
72 EndDialog(hModifyDlg, FALSE);
73 break;
74 }//GETNAMECANCEL
75
76 }//stitch
77
78 }//WM_COMMAND
79 return TRUE;
80 }//stitch
81
82 return FALSE;
83 }//ModifyFlightProc()
在此给出了几个窗口的窗口过程,其中所调用的函数的实现将在下一篇博文中给出。
- 巧用shell脚本生成快捷脚本(r2第12天)
- asp.net动态增加服务器端控件并提交表单
- c# asp.net 实现分页(pager)功能
- 一次数据库无法登陆的"问题"及排查(r2第11天)
- popcorn-js视频Video框架简单用法
- 一次数据库响应缓慢的问题排查(r2第9天)
- 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
- C# 读取指定文件夹下所有文件
- ASP.NET 实现Base64文件流下载PDF
- MVC自定义视图引擎地址
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
- impdp异常中断导致的问题(r2第8天)
- 利用autocomplete.js实现仿搜索效果(ajax动态获取后端[C#]数据)
- sql语句的简化(r2第7天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 首次在手机端不牺牲准确率实现BERT实时推理,比TensorFlow-Lite快近8倍,每帧只需45ms
- 【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解
- 【SOT】siameseFC论文和代码解析
- 基于OpenCV创建视频会议虚拟背景
- 【算法】图文并茂,一文了解 8 种常见的数据结构
- 深度了解特征工程
- Nginx应用场景之虚拟主机
- shell tcping 端口,ping网段所有ip端口或tcping指定IP端口
- Redis | 源码阅读 —— 链表
- Python从入门到熟练(4):基础数据类型
- 【MaskTheFace】给人脸图片戴口罩!
- Python从入门到熟练(5): 数据类型进阶
- Python从入门到熟练(6): 流程控制
- Python包:json扩展包demjson使用
- 【论文解读】无需额外数据、Tricks、架构调整,CMU开源首个将ResNet50精度提升至80%+新方法