专栏首页技术碎碎念windows API 开发飞机订票系统 图形化界面 (二)

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("\0"));
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("\0"));
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()

在此给出了几个窗口的窗口过程,其中所调用的函数的实现将在下一篇博文中给出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Git总结

    git在本地分为三个区域,工作区、暂存区和本地仓库,具体情况如下: ? git的一般操作就是本地代码的修改提交回滚,以及与远程仓库的拉取、合并、提交等。 git...

    欠扁的小篮子
  • sql server T-SQL 基础

    SQL语言按照用途可以分为如下3类: ①DDL(Data Definition Language)  数据定义语言:    定义修改和删除数据库、表、索引和视图...

    欠扁的小篮子
  • sql server 触发器

    触发器是一种特殊类型的存储过程。触发器可包含复杂的T-SQL语句。触发器不能通过名称被直接调用,也不允许设置参数。它是建立在触发事件上的。 触发器可以强制执行一...

    欠扁的小篮子
  • Mac OS安装PostgreSQL数据库

    因项目需要,在本地的Mac上安装PostgreSQL,本文记录一下安装的整个步骤。这里采用EnterpriseDB 来下载安装,EnterpriseDB是全球唯...

    程序新视界
  • Java工具集-对象(ObjectUtils)

    cwl_java
  • docker 镜像与容器的导入导出操作实践

    公司有一台测试服务器,网速比较慢,特别是下载一些国外站点镜像的时候,而我本机则比较快,还有梯子,所以在思考一个问题;是否能在我本地把镜像下载下来,然后复制到测试...

    汤青松
  • 安装ipython和虚拟环境

    先epel-release这个包, 通过epel源安装pip: yum install python-pip 然后pip install ipython==1...

    零月
  • Golang垃圾回收gc调优

    Clive
  • 再议-Golang语言MessageBox用法实例

    曾几何时,大多数人最先接触电脑的时候,windows是我们第一次的尝试遨游网络世界的媒介;作为IT民工加屌丝的我也是一样。现在从C++转换到GO语言,自己也同样...

    李海彬
  • 【项目实战】自监控-05-弹窗交互

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia

扫码关注云+社区

领取腾讯云代金券