windows API 开发飞机订票系统 图形化界面 (二)

2022-11-02,,,,

首先,用到的数据结构的定义、以及全局变量和函数的声明如下:

 // Flight.c : 定义应用程序的入口点。
//
#include "stdafx.h" //订单
typedef struct OrderForm{
TCHAR IdNum[]; //订单用户身份证号
int Order_Number; //订单号
int Tickets_Num; //订票数量
TCHAR Flight_Number[]; //航班号
TCHAR Departure[]; //出发地
TCHAR Destination[]; //目的地
TCHAR Date[]; //出发日期
TCHAR TakeOff_Time[]; //起飞时间
TCHAR Landing_Time[]; //降落时间
struct OrderForm *Next; //所有订单链表next
struct OrderForm *psgNext; //用户订单链表next
}OrderForm; //乘客订单链表
typedef struct PsgOrderLink{
int OrderNum; //订单数目
OrderForm *head; //头结点
OrderForm *tail; //尾结点
}PsgOrderLink; //所有订单列表
typedef struct AllOrderLink{
int AllOrderNum; //所有订单数目
OrderForm *head; //头结点
OrderForm *tail; //尾结点
}AllOrderLink; //乘客
typedef struct Passenger{
TCHAR Name[]; //姓名
TCHAR IdNum[]; //身份证号码
TCHAR PassWord[]; //密码
int TicketNum; //订单数目
PsgOrderLink OrderLink; //用户所有订单
struct Passenger *Next;
}Passenger; //乘客链表
typedef struct PsgLinkList{
int PsgNum; //账户数量
Passenger *head; //头结点
Passenger *tail; //尾结点
}PsgLinkList; //航班
typedef struct Flight{
double Fare; //票价
int Seat_Number; //座位数
int Vacant_Seat; //空余座位数
TCHAR Discount[]; //折扣
TCHAR Flight_Number[]; //航班号
TCHAR Departure[]; //出发地
TCHAR Destination[]; //目的地
TCHAR Date[]; //出发日期
TCHAR TakeOff_Time[]; //起飞时间
TCHAR Landing_Time[]; //降落时间
struct Flight *Next;
}Flight; //航班链表
typedef struct FlightLinkList{
Flight *head; //头结点
Flight *tail; //尾结点
int Flight_Number; //航班数目
}FilghtLinkList; // 全局变量:
HICON hIcon;
HINSTANCE hInst; //当前实例
static TCHAR szBuffer[]; //缓冲区
static PsgLinkList psglink; //所有账户_链表
static Passenger *passenger; //登陆账户信息
static AllOrderLink allorder; //所有订单_链表
static FilghtLinkList flightlink; //所有航班_链表 //函数声明
BOOL AccountLogIn(HWND); //账户登陆
BOOL AccountRegister(HWND); //注册账户
BOOL ReadFlightData(HWND); //读入航班信息
BOOL ReadAccountData(HWND); //读入账户资料
BOOL ReadAccountOrder(HWND,Passenger*); //读入所有订单、账户订单
BOOL SearchFlight(HWND); //查询航班
BOOL BookTickets(HWND); //订票
BOOL _Book_Tickets(HWND,Flight*,int); //订票
BOOL Recommend(HWND,Flight*,int); //航班建议
BOOL ReturnTickets(HWND); //退票
BOOL EntryFlight(HWND); //录入航班
BOOL ModifyFlight(HWND); //修改航班信息
BOOL PrintFlight(HWND, Flight*); //输出航班信息
BOOL WriteFlightData(HWND); //保存航班信息
BOOL WriteAccountData(HWND); //保存账户资料
BOOL WriteOrderData(HWND); //保存订单信息
BOOL CALLBACK LogInDlgProc(HWND, UINT, WPARAM, LPARAM); //登陆窗口窗口过程
BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM); //主界面窗口过程
BOOL CALLBACK NameDlgProc(HWND, UINT, WPARAM, LPARAM); //获取新注册用户姓名窗口过程
BOOL CALLBACK FlightNumDlgProc(HWND, UINT, WPARAM, LPARAM); //获取用户输入机票数量窗口过程
BOOL CALLBACK EntryFlightProc(HWND, UINT, WPARAM, LPARAM); //录入航班窗口过程
BOOL CALLBACK ModifyFlightProc(HWND, UINT, WPARAM, LPARAM); //修改航班信息窗口过程

数据结构定义

因为采用的是windows API,所以首先要了解windows程序的消息机制。

Windows是一个以消息为导向的系统,程序只能被动地等待用户操作的消息,不能主动地去读键盘、鼠标等的状态,也就是说,每当键盘上有个键被按下,或者鼠标在屏幕某个位置点击以后,系统就会发出一个消息(Message)给窗口,告诉它某个键被按下去了或是鼠标按键的点击状态。当鼠标点击了程序的某个按钮只要鼠标移动一下,系统也会发出相应的消息,并把鼠标的坐标信息传给窗口。

当我们鼠标点击了我们程序的某个按钮时,会向系统的消息队列发送一个消息(Mseeage),此消息包含了你鼠标点击的位置、该程序的句柄以及鼠标点击时的状态(如是否按住ctrl键等等)。程序中每个窗口在程序代码都有对应的一个窗口过程,即处理由该窗口所产生的消息的函数,而我们写代码的主要工作就在这里了。

我程序的主函数代码如下:

 //主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{ hInst = hInstance;
InitCommonControls();
hIcon=LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
return DialogBox(hInst, MAKEINTRESOURCE(IDD_LOGINDLG), NULL, (DLGPROC)LogInDlgProc);
}//WinMain

其中,下面这行代码用来加载程序图片:

hIcon=LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));

下面贴出各个窗口的窗口过程:

 //登陆窗口_窗口过程
BOOL CALLBACK LogInDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
//WM_INITDIALOG是当其对话框和子控件全部创建完毕,将要显示内容的时候发送的消息
//因此可以在WM_INITDIALOG消息响应函数中添加对编辑框控件的初始化和修改
case WM_INITDIALOG:
{
if (hIcon)
SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
ReadAccountData(hwndDlg); //登陆对话框初始化时读入账户资料
ReadFlightData(hwndDlg); //登陆对话框初始化时读入航班信息
}//WM_INITDIALOG
return TRUE; case WM_CLOSE:
{
EndDialog(hwndDlg, );
}//WM_CLOSE
return TRUE; case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_LOGIN:
AccountLogIn(hwndDlg); //登陆
break;
case IDC_REGISTER:
AccountRegister(hwndDlg); //注册
break;
}//switch
}//WM_COMMAND
return TRUE; }//switch
return FALSE;
}//LogInDlgProc()

其中,下面这行代码用来加载程序标题栏图标

if (hIcon) SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);

然后继续贴代码:

 //主界面_窗口过程
BOOL CALLBACK MainDlgProc(HWND hMainDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg)
{
case WM_INITDIALOG:
{
if (hIcon)
SendMessage(hMainDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
}//WM_INITDIALOG
return TRUE; case WM_CLOSE:
{
//关闭程序时将信息保存
if (WriteOrderData(hMainDlg) && WriteAccountData(hMainDlg) && WriteFlightData(hMainDlg))
EndDialog(hMainDlg, );
else
MessageBox(hMainDlg, TEXT("保存信息错误!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
}//WM_CLOSE
return TRUE; case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_SEARCH:
{
SearchFlight(hMainDlg); //查找航班
break;
}
case IDC_TICKET:
{
BookTickets(hMainDlg); //订票
break;
}
case IDC_RETURNTICKET:
{
ReturnTickets(hMainDlg); //退票
break;
}
case IDC_ENTRY:
{ //录入航班对话框
DialogBox(hInst, MAKEINTRESOURCE(IDD_ENTRY), NULL, (DLGPROC)EntryFlightProc);
break;
}
case IDC_MODIFYFLIGHT:
{ //修改航班信息对话框
DialogBox(hInst, MAKEINTRESOURCE(IDD_MODIFYFLT), NULL, (DLGPROC)ModifyFlightProc);
break;
}
}//switch
}//WM_COMMAND
return TRUE;
}//switch
return FALSE;
}//MainDlgProc()
 //获取用户输入机票数量_窗口过程
BOOL CALLBACK FlightNumDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg)
{ case WM_INITDIALOG:
{
if (hIcon)
SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
}//WM_INITDIALOG
return TRUE; case WM_CLOSE:
{
wsprintf(szBuffer, TEXT("\0"));
EndDialog(hwndDlg, FALSE);
}//WM_CLOSE
return TRUE; case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDOK:
wsprintf(szBuffer, TEXT("\0"));
GetDlgItemText(hwndDlg, IDC_TICKETNUM, szBuffer, );
EndDialog(hwndDlg, TRUE);
break;
}//switch
}//WM_COMMAND
return TRUE; }//switch
return FALSE;
}
 //录入航班_窗口过程
BOOL CALLBACK EntryFlightProc(HWND hEntryDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg)
{
case WM_INITDIALOG:
{
if (hIcon)
SendMessage(hEntryDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
}
return TRUE; case WM_CLOSE:
{
EndDialog(hEntryDlg, );
}//WM_CLOSE
return TRUE; case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_ADDFLT:
{
EntryFlight(hEntryDlg); //录入航班
break;
}//GETNAME
case IDC_QUIT:
{
EndDialog(hEntryDlg, FALSE);
break;
}//GETNAMECANCEL }//stitch }//WM_COMMAND
return TRUE; }//stitch return FALSE;
} //修改航班信息_窗口过程
BOOL CALLBACK ModifyFlightProc(HWND hModifyDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg)
{
case WM_INITDIALOG:
{
if (hIcon)
SendMessage(hModifyDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
}
return TRUE; case WM_CLOSE:
{
EndDialog(hModifyDlg, );
}//WM_CLOSE
return TRUE; case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_MODIFY:
{
ModifyFlight(hModifyDlg); //修改航班信息
break;
}//GETNAME
case IDC_QUIT:
{
EndDialog(hModifyDlg, FALSE);
break;
}//GETNAMECANCEL }//stitch }//WM_COMMAND
return TRUE;
}//stitch return FALSE;
}//ModifyFlightProc()

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

windows API 开发飞机订票系统 图形化界面 (二)的相关教程结束。

《windows API 开发飞机订票系统 图形化界面 (二).doc》

下载本文的Word格式文档,以方便收藏与打印。