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()

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