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

  1. // Flight.c : 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4.  
  5. //订单
  6. typedef struct OrderForm{
  7. TCHAR IdNum[]; //订单用户身份证号
  8. int Order_Number; //订单号
  9. int Tickets_Num; //订票数量
  10. TCHAR Flight_Number[]; //航班号
  11. TCHAR Departure[]; //出发地
  12. TCHAR Destination[]; //目的地
  13. TCHAR Date[]; //出发日期
  14. TCHAR TakeOff_Time[]; //起飞时间
  15. TCHAR Landing_Time[]; //降落时间
  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[]; //姓名
  37. TCHAR IdNum[]; //身份证号码
  38. TCHAR PassWord[]; //密码
  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[]; //折扣
  57. TCHAR Flight_Number[]; //航班号
  58. TCHAR Departure[]; //出发地
  59. TCHAR Destination[]; //目的地
  60. TCHAR Date[]; //出发日期
  61. TCHAR TakeOff_Time[]; //起飞时间
  62. TCHAR Landing_Time[]; //降落时间
  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. HICON hIcon;
  75. HINSTANCE hInst; //当前实例
  76. static TCHAR szBuffer[]; //缓冲区
  77. static PsgLinkList psglink; //所有账户_链表
  78. static Passenger *passenger; //登陆账户信息
  79. static AllOrderLink allorder; //所有订单_链表
  80. static FilghtLinkList flightlink; //所有航班_链表
  81.  
  82. //函数声明
  83. BOOL AccountLogIn(HWND); //账户登陆
  84. BOOL AccountRegister(HWND); //注册账户
  85. BOOL ReadFlightData(HWND); //读入航班信息
  86. BOOL ReadAccountData(HWND); //读入账户资料
  87. BOOL ReadAccountOrder(HWND,Passenger*); //读入所有订单、账户订单
  88. BOOL SearchFlight(HWND); //查询航班
  89. BOOL BookTickets(HWND); //订票
  90. BOOL _Book_Tickets(HWND,Flight*,int); //订票
  91. BOOL Recommend(HWND,Flight*,int); //航班建议
  92. BOOL ReturnTickets(HWND); //退票
  93. BOOL EntryFlight(HWND); //录入航班
  94. BOOL ModifyFlight(HWND); //修改航班信息
  95. BOOL PrintFlight(HWND, Flight*); //输出航班信息
  96. BOOL WriteFlightData(HWND); //保存航班信息
  97. BOOL WriteAccountData(HWND); //保存账户资料
  98. BOOL WriteOrderData(HWND); //保存订单信息
  99. BOOL CALLBACK LogInDlgProc(HWND, UINT, WPARAM, LPARAM); //登陆窗口窗口过程
  100. BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM); //主界面窗口过程
  101. BOOL CALLBACK NameDlgProc(HWND, UINT, WPARAM, LPARAM); //获取新注册用户姓名窗口过程
  102. BOOL CALLBACK FlightNumDlgProc(HWND, UINT, WPARAM, LPARAM); //获取用户输入机票数量窗口过程
  103. BOOL CALLBACK EntryFlightProc(HWND, UINT, WPARAM, LPARAM); //录入航班窗口过程
  104. 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, );
  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, );
  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, );
  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, );
  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. BOOL CALLBACK ModifyFlightProc(HWND hModifyDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
  45. switch (uMsg)
  46. {
  47. case WM_INITDIALOG:
  48. {
  49. if (hIcon)
  50. SendMessage(hModifyDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
  51. }
  52. return TRUE;
  53.  
  54. case WM_CLOSE:
  55. {
  56. EndDialog(hModifyDlg, );
  57. }//WM_CLOSE
  58. return TRUE;
  59.  
  60. case WM_COMMAND:
  61. {
  62. switch (LOWORD(wParam))
  63. {
  64. case IDC_MODIFY:
  65. {
  66. ModifyFlight(hModifyDlg); //修改航班信息
  67. break;
  68. }//GETNAME
  69. case IDC_QUIT:
  70. {
  71. EndDialog(hModifyDlg, FALSE);
  72. break;
  73. }//GETNAMECANCEL
  74.  
  75. }//stitch
  76.  
  77. }//WM_COMMAND
  78. return TRUE;
  79. }//stitch
  80.  
  81. return FALSE;
  82. }//ModifyFlightProc()

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

windows API 开发飞机订票系统 图形化界面 (二)的更多相关文章

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

    接下来的是录入航班.修改航班信息功能的实现: //录入航班 BOOL EntryFlight(HWND hEntryDlg){ TCHAR szDiscount[]; TCHAR szFare[],s ...

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

    去年数据结构课程设计的作品,c语言实现,图形化界面使用windows API实现. 首发在我csdn博客:http://blog.csdn.net/u013805360/article/details ...

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

    来吧,接下来是各个功能的函数的实现代码. 首先,程序运行时加载读入账户信息和航班信息.接下来就该读取文件了. 我把账户资料和航班信息储存在了.txt文件里 那么问题就来了,挖掘机...额,不对,应该怎 ...

  4. 【性能测试】Loadrunner12.55(二)-飞机订票系统-脚本录制

    1.1 飞机订票系统 Loadrunner 12.55不会自动安装飞机订票系统,要自己手动安装. 我们需要下载Web Tools以及一个小插件strawberry https://marketplac ...

  5. Java版飞机订票系统

    关注微信公众号:Worldhello 回复 飞机订票系统 可获得系统源代码并可加群讨论交流 数据结构课程设计题目:          [飞机订票系统]            通过此系统可以实现如下功能 ...

  6. web类协议脚本-飞机订票系统示例

    以下是LR自带的飞机订票系统的Demo,希望能帮助大家. Action() { int iRand; int iTmp; char *strTmpA; char *strTmpB; char *str ...

  7. loadrunner飞机订票系统从登陆订票退票登出的脚本实现代码调试通过

    在LR自带的飞机订票系统中,完整模拟一个用户从登陆->订票->退票->登出这样一个业务流程,分解每个事务为一个Action: 进入首页->登陆->进入订票页面->选 ...

  8. loadrunner笔记(二):飞机订票系统--客户信息注册

    (一)  几个重要概念说明 集合点:同步虚拟用户,以便同一时间执行任务. 事务:事务是指服务器响应用户请求所用的时间,当然它可以衡量某个操作,如登录所需要的时间,也可以衡量一系列的操作所用的时间,如从 ...

  9. LR自带网站飞机订票系统 启动

    LR自带的网站:飞机订票系统 可是如何启动自带的网站呢?? 一.启动服务:开始-所有程序--HP Software-HP LoadRunner-Samples-Web-Start Web Server ...

随机推荐

  1. CentOS 7 安装Docker

    1.安装前检查: a.内核版本 uname -a b.检查Device Mapper ls -l /sys/class/misc/device-mapper 2.安装Docker: a.更新系统包到最 ...

  2. 修改Tomcat服务器的端口号

    关键技术: Connector子元素下的port是设置服务器端口,而connection Timeout则是服务器连接超时单位为毫秒. 操作过程: (1)采用记事本打开Tomcat安装目录下的conf ...

  3. 怎么通过 Microsof Office Project 2010 来写功能开发计划

    新建一个Microsof Office Project 2010 功能, 直接填写,可以通过快捷键来改变目录分级情况.(shift+alt+ —> 或者 <—) 也可以通过导航栏上面的摘要 ...

  4. which,whereis, locate, find

    which 在PATH环境变量中的路径中查找目标文件,所以用来查找都是可执行文件,Linux下的各种命令本质上就是一个可执行的文件,所以我们安装新的软件之后通常都会有相应的命令将其打开,就是因为安装的 ...

  5. nyoj 170 网络的可靠性

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=170 思路:统计每个节点的度,将度为1的节点消去所需要的最少的边即为答案. 代码: #in ...

  6. HttpClient如何解决302重定向问题

    最近的接口测试,发现接口地址报302错误,通过上网搜索,发现问题所在,解决办法是需要请求重定向后的URI. package com.btv; import org.apache.http.Header ...

  7. 【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)

    3.1 Button Button这控件不用多说,就是一个按钮,主要是点击后进行相应事件的响应. 给组件添加ID属性:定义格式为 android:id="@+id/name",这里 ...

  8. Volley(六 )—— 从源码带看Volley的缓存机制

    磁盘缓存DiskBasedCache 如果你还不知道volley有磁盘缓存的话,请看一下我的另一篇博客请注意,Volley已默认使用磁盘缓存 DiskBasedCache内部结构 它由两部分组成,一部 ...

  9. ArcGis 统计方法

    from:http://blog.sina.com.cn/s/blog_4177d50b0100fjbg.html 概述 一般常用的统计功能例如:唯一字段统计.数据行数统计.数据值求和统计等. 1.基 ...

  10. [转]reids客户端 redis-cli用法

    连接:redis-cli -h machine -p port -n db转的:每次都搜,还是扔在这 Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以 ...