首先,用到的数据结构的定义、以及全局变量和函数的声明如下:
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("