zoukankan      html  css  js  c++  java
  • 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()

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

  • 相关阅读:
    javaweb快速入门-学习笔记
    初学者如何学习JAVA(本文网摘收藏)
    实施职业发展路线-三界之外无量天
    GUI(图形界面编程)
    selenium IE自动化问题汇总
    python 读取excel数据插入到另外一个excel
    一个简单的查询功能的测试思路
    python os用法笔记
    Python学习笔记(基本功能的使用)
    python 调用封装好的模块
  • 原文地址:https://www.cnblogs.com/z941030/p/4495711.html
Copyright © 2011-2022 走看看