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()?
在此給出了幾個窗口的窗口過程,其中所調用的函數的實現將在下一篇博文中給出。
?
轉載于:https://www.cnblogs.com/z941030/p/4495711.html
總結
以上是生活随笔為你收集整理的windows API 开发飞机订票系统 图形化界面 (二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keychron Q12 客制化机械键盘
- 下一篇: 怎么隐藏微信号不显示