网吧管理系统——第一个GUI+SQLite程序

本来将SQLite基本封装完毕了的,可是鹚觉得呢还想干点儿什么^_^

虽然鹚的最初目的是让数据库简单的工作在那个“黑框框”下的,但是做完了之后,感觉到,这界面实在是有点郁闷啊。

是啊,都读了两年大学了,从 C 学到 C++ ,但是印证了一个 真理 —— “学校永远不会教你 如何配置 Apache,也永远不会教你将CLI变成GUI” !

所谓的 “大学计算机教育” ,只会教你一堆算法,但事实上,大多数程序的编写,基本上用不着算法,就算你要用 “快速排序” , C/C++ 的库函数都要好上很多!

抱怨也没用,可幸的是 —— 我自学的权利并没有被剥夺!

想写GUI,尤其在 Windows 下,大家首先会想到 MFC。

不过,真要鹚专心去学 MFC 的话,鹚认为还不如把时间花在学 GTK+ 上面去,鹚从来都不希望自己成为一个 “Windows编程高手” 啊。

所以,我需要一个 快速而低成本 的开发方案。

除了 MFC ,最直接的就用 SDK 了。

嗯,就用国内的那个叫 win32 DialogBased 的 SDK 吧。

至于为什么选他,因为 win32 DialogBased 没有做神奇的事情,只是简化了创建的过程,创建的代码可以在没有安装 Win32 DialogBased 的机器上用。

换句话说,这不是一个封装的不是很彻底的 SDK ,也就是不会误导你对 WinGUI 的认识。

好吧,所谓的 “网吧管理系统” ,鹚这里使用了两个组件。

一是作为数据库的 sqlite3 ,一是写GUI的 win32 DialogBased 。

第一次写GUI啊,不过在这个SDK里面,鹚算是一下子就明白了什么叫 “事件驱动” —— 也就一堆对 “事件ID” 的 case 捕获而已。

但关键是怎么将CLI的数据库和GUI的界面结合起来。

输入设备变了,输出设备也变了,回调函数已经无法完成所有的工作,需要修改原来的函数与原来的数据类型,还需要新的数据库输出函数。

开始化按钮,画输入框,画输出框,修改自己封装的 SQLite 函数。

一个一个的解决Bug,当然,最怕的就是按下么按钮之后整个窗口都 “宕掉” 了。

毕竟不是一个很完善的 SDK ,所以,不得不用上 全局变量, static 类型 等等来 传递、控制 数据,当然,还有一个重要的原因就是 —— 鹚的技术有限哈^_^

由于是用的 C 语言完成的 SQL 调用,所以不得不用上 二维指针数组,一旦用指针,就不得不进行越界检查了。

不然,我在测试时不停的点击那个 “查询所有数据” 的按钮,没过几下,就弹出 Win7 那 “程序出现异常” 的警告框啦!

好吧好吧,最终还是征服了所有Bug。

整个源代码比较庞大,我这里只贴出关键的视窗代码部分:

#include "stdafx.h"
#include 
#include 
#include "resource.h"
#include "MainDlg.h"

char sqlx[200];
char **sqlalltable;
char sqltableover[20];

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
		HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }

    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
	char sqldbname[20];
	char sqltablename[20];
    switch(id)
    {
        case IDC_OK:
			{
				char idcard[256];
				char member[256];
				char money[256];
				GetDlgItemText(hwnd,IDC_EDIT7,sqldbname,sizeof(sqldbname));
				GetDlgItemText(hwnd,IDC_EDIT8,sqltablename,sizeof(sqltablename));
				GetDlgItemText(hwnd,IDC_EDIT1,idcard,sizeof(idcard));
				GetDlgItemText(hwnd,IDC_EDIT2,member,sizeof(member));
				GetDlgItemText(hwnd,IDC_EDIT3,money,sizeof(money));
				sqlitetableinsert(sqldbname,sqltablename,idcard,member,money);
				MessageBox(hwnd,TEXT("客户数据已储存到数据库"),TEXT("^_^"),MB_OK);
				break;
			}
		case IDC_BUTTON1:
			{
				char strsqlcustomernumber1[256];
				char customemoney[256];
				GetDlgItemText(hwnd,IDC_EDIT7,sqldbname,sizeof(sqldbname));
				GetDlgItemText(hwnd,IDC_EDIT8,sqltablename,sizeof(sqltablename));
				GetDlgItemText(hwnd,IDC_EDIT4,strsqlcustomernumber1,sizeof(strsqlcustomernumber1));
				GetDlgItemText(hwnd,IDC_EDIT5,customemoney,sizeof(customemoney));
				sqlitetableupdate(sqldbname,sqltablename,strsqlcustomernumber1,customemoney);
				break;
			}
		case IDC_BUTTON2:
			{
				char strsqlcustomernumber2[256];
				GetDlgItemText(hwnd,IDC_EDIT7,sqldbname,sizeof(sqldbname));
				GetDlgItemText(hwnd,IDC_EDIT8,sqltablename,sizeof(sqltablename));
				GetDlgItemText(hwnd,IDC_EDIT6,strsqlcustomernumber2,sizeof(strsqlcustomernumber2));
				sqliteselect(sqldbname,sqltablename,strsqlcustomernumber2);
				HWND hwndprintf1=GetDlgItem(hwnd,IDC_LIST1);
				ListBox_AddString(hwndprintf1, TEXT(sqlx) );
				break;
			}
		case IDC_BUTTON3:
			{
				int nrow=0;
				int ncolumn=0;
				GetDlgItemText(hwnd,IDC_EDIT7,sqldbname,sizeof(sqldbname));
				GetDlgItemText(hwnd,IDC_EDIT8,sqltablename,sizeof(sqltablename));
				sqliteselect2(sqldbname,sqltablename,&nrow,&ncolumn);
				sqlitetableovercheck(sqldbname,sqltablename);
				char stridoverchek[256];
				sprintf(stridoverchek,"%s: %s","总数据量为",sqltableover);
				MessageBox(hwnd,TEXT(stridoverchek),TEXT("^_^越界检查"),MB_OK);
				HWND hwndprintf2=GetDlgItem(hwnd,IDC_LIST1);
				char strdone[256];
				static int j=ncolumn;
				static int jq=0;
				int z=(sqltableover[0]-'0');
				if( jq < z )
				{
					sprintf(strdone,"\t%s\t\t\t%s\t\t%s",sqlalltable[j+1],sqlalltable[j+2],sqlalltable[j+3]);
					ListBox_AddString(hwndprintf2, TEXT(strdone) );
					j+=4;
					jq++;
				}
				break;
			}
			case IDC_BUTTON4:
			{
				GetDlgItemText(hwnd,IDC_EDIT7,sqldbname,sizeof(sqldbname));
				GetDlgItemText(hwnd,IDC_EDIT8,sqltablename,sizeof(sqltablename));
				sqlitedbcreat(sqldbname);
				sqlitetablecreat(sqldbname,sqltablename);
				MessageBox(hwnd,TEXT("数据库创建成功"),TEXT("^_^"),MB_OK);
				break;
			}
			default:
			break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

对了这里有编译好的程序提供下载,里面就一个 可执行文件 和一个 sqlite3.dll 的动态运行库。

使用方法很简单,注意一点,如果没有数据库,就在那里输入一个 数据库名称,数据表 的名称,然后点击 “创建数据库” 。

若是有现成的数据库,并且数据库里面有一个数据表的话,输入已有的 数据库名称 和 数据表名 就可以了,不要再点击 “创建数据库” 的按钮啦,否则程序会自动关闭的说!

好吧程序运行截图如下:

编译好的程序下载:        点我下载

About Mucid

My life is brilliant !
This entry was posted in Technology and tagged , , , , , . Bookmark the permalink.

72 Responses to 网吧管理系统——第一个GUI+SQLite程序

  1. Cavsle says: Firefox 16.0 Firefox 16.0 Ubuntu Ubuntu

    博主,你115到外链基本都挂了,建议用dbank重发一下! :?:

  2. Jyu.. says: Google Chrome 17.0.963.56 Google Chrome 17.0.963.56 Windows XP Windows XP

    少了个DLL。。 :sad:

  3. 怎样瘦脸 says: Internet Explorer 8.0 Internet Explorer 8.0 Windows XP Windows XP

    进来看看,了解一下

  4. yetone says: Google Chrome 14.0.797.0 Google Chrome 14.0.797.0 GNU/Linux x64 GNU/Linux x64

    :grin: 亲爱的

  5. 龙龙 FRED says: Firefox 5.0 Firefox 5.0 GNU/Linux GNU/Linux

    我觉得这种GUI程序用VB效率最高。

  6. 小松 says: Google Chrome 14.0.797.0 Google Chrome 14.0.797.0 Windows 7 Windows 7

    不要太NB 哦

  7. Solo says: Google Chrome 12.0.742.100 Google Chrome 12.0.742.100 GNU/Linux GNU/Linux

    额,开始玩C/S模式了。