本来将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 的动态运行库。
使用方法很简单,注意一点,如果没有数据库,就在那里输入一个 数据库名称,数据表 的名称,然后点击 “创建数据库” 。
若是有现成的数据库,并且数据库里面有一个数据表的话,输入已有的 数据库名称 和 数据表名 就可以了,不要再点击 “创建数据库” 的按钮啦,否则程序会自动关闭的说!
好吧程序运行截图如下:
编译好的程序下载: 点我下载
博主,你115到外链基本都挂了,建议用dbank重发一下!
少了个DLL。。
@Jyu.. , 嘛,不必在意,也不是神马有用的玩意儿~
进来看看,了解一下
亲爱的
@yetone , 嘿
我觉得这种GUI程序用VB效率最高。
@龙龙 FRED , 再怎么我都不会考虑VB的
不要太NB 哦
@小松 , 那里有松哥NB的说……
额,开始玩C/S模式了。
@Solo , 没时间啊,要不客户端我就做出来了!