技术文章 > 用C++Builder5.0开发基于Windows2000的

用C++Builder5.0开发基于Windows2000的

2018-05-22 21:48

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料:
引言
维吾尔文字,跟汉字和英文不一样,书写方向由右到左。而且每个字母按词中的位置,都有单独、字头、字中和字未等四中写法形式。还有每个字母且其四种形式的高度和宽度不一致,均属于不定宽字体。所以,要实现计算机维文处理要解决计算机光标方向转换、自动选型和等宽中文与不等宽维文混合处理等技术难题。幸好,Windows2000提供支持多国语的功能,使维文和中文混合处理带来了大大的便利!我们唯一要作的是,先分析阿拉伯字体的区位安排,制作维文字体库,然后用系统键盘勾子监视键盘消息实现维文输入功能。

1.创建DLL
1. 选用C++Builder的菜单项“File|New…”,然后在“New Items”对话框中选择DLL Wizard,
如图1所示,单击OK。


图1 “New Items”对话框

2. 出现“DLL Wizard”对话框,使其设置如图2所示,单击OK。


图2 “DLL Wizard”对话框

随后系统创建一个Unit1.c文件,文件的主体部分除了注释之外只有一个DllEntryPoint函数,这个函数是在DLL加载和卸载时调用,调用取决于它的reason参数。下面是Unit1.c文件的内容:
#include
……
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
3. 定义系统键盘勾子函数。键盘勾子可以监视各种键盘消息。系统勾子监视系统中所有线
程的事件消息。因为系统勾子会影响系统中的所有应用程序,所以勾子函数必须放在独立的DLL中。下面是件怕勾子的原型:
LRESULT CALLBACK KeyboardProc(int nCode, WORD wParam, DWORD lParam)
参数wParam和lParam包含键盘消息的信息,比如虚拟键值、击键消息信息等。nCode包含有关消息本身的信息,比如怎样处理本消息。
HHOOK hhk=NULL;
LRESULT CALLBACK KeyboardProc(int nCode, WORD wParam, DWORD lParam)
{
WORD Key;
//取当前激活窗口句柄
HWND myhWnd=GetFocus();
//取当前输入法句柄
HKL myHKL=GetKeyboardLayout(0);
//判断当前输入法是否阿拉伯语
if(myHKL==LoadKeyboardLayout("00000401",NULL))
if(lParam&0x40000000)//是否按下某键
{
switch(wParam)
{
case 65://a
Key=-27;赋给维文字Unicode
break;
case 66://b
……
}//end switch
//自定义的键盘信息发送给当前激活窗口
PostMessage(myhWnd,WM_CHAR,(WORD)Key,(DWORD)lParam);
}
}//键盘监视结束
else
{
return CallNextHookEx(hhk,nCode,wParam,lParam);
}
}
4. 保存文件,命名my_dll.c。安Crtl+F9编译源代码生成DLL,生成的动态连接库文件名为my_dll.dll。

2. 创建主程序
主程序的主要功能是动态加载和卸载DLL。动态加载DLL时,模块使用API函数LoadLibrary或LoadLibraryEx,在程序运行时加载DLL。DLL被加载后,模块调用API函数GetProcAddress()来得到DLL导出函数的地址。模块用由GetProcAddress()返回的指针调用导出的函数库,这就不需要到入库了。
1. 选用C++Builder的菜单项“File|New Application”,创建一个工程。
2. 加入一个PopupMenu控件,一个Timer控件和三个Image控件,如图3所示,其目的为
实现托盘(SysTray)程序,也就是程序运行时,Windows的任务条右方(屏幕的右下方)显示一个动态的图标。右击该图标,显示一个弹出式菜单的功能,弹出式菜单上有“退出”、“帮助”、“关于…”等子菜单项。


图3 主窗口与控件

先自定义这样一个函数:
void __fastcall TForm1::MyNotify(TMessage& Msg)
{
POINT MousePos;
switch(Msg.LParam)
{
case WM_RBUTTONUP:
if (GetCursorPos(&MousePos))
{
PopupMenu1->PopupComponent = Form1;
SetForegroundWindow(Handle);
PopupMenu1->Popup(MousePos.x, MousePos.y);
}
}
TForm::Dispatch(&Msg);
}
然后Form的FormCreate事件,写入以下代码:
NOTIFYICONDATA tnd;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
PSTR pszTip="UMS Win 2000";
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=Handle;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=MYWM_NOTIFY;
tnd.hIcon=(HICON)Image1->Picture->Icon->Handle;
lstrcpyn(tnd.szTip,pszTip,sizeof(tnd.szTip));
Shell_NotifyIcon(NIM_ADD,&tnd);
}
3. 准备三个图标,分别引入Image1,Image2和Image3。在Timer控件的Timer1Timer事件
写入以下代码,其目的为,使托盘上显示的图标动起来:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//me是在头文件定义的int类型变量。
switch(me){
case 0:
tnd.hIcon=(HICON)Image1->Picture->Icon->Handle;
me++;
break;
case 1:
tnd.hIcon=(HICON)Image2->Picture->Icon->Handle;
me++;
break;
case 2:
tnd.hIcon=(HICON)Image3->Picture->Icon->Handle;
me=0;
break;
}
Shell_NotifyIcon(NIM_MODIFY,&tnd);
}
4. 主窗口的FormPaint事件写入以下代码,其目的为,程序运行时不再显示主窗口:
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Hide();
}
5. Form的FormCreate事件,再添加以下代码,其目的为动态加载DLL:
HINSTANCE DllInst=LoadLibrary("my_dll.dll");
if(DllInst==NULL)
{
ShowMessage("找不到DLL!");
Application->Terminate();
}
else
//hhk是在头文件定义的勾子句病,其形式:static HHOOK hhk;
hhk=SetWindowsHookEx(WH_KEYBOARD,GetProcAddress(DllInst,"KeyboardProc"),
DllInst,0);
6. Form的Form FormClose事件,写入以下代码,其目的为卸载DLL:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnhookWindowsHookEx(hhk);
Shell_NotifyIcon(NIM_DELETE,&tnd);
}
7. 弹出式菜单的“退出”子菜单项写入以下代码:
void __fastcall TForm1::Chikin1Click(TObject *Sender)
{
Close();
}
8.保存项目,命名为my_IM2000,按F9编译并生成可执行文件。

3.制作安装盘
安装程序的任务,一是、安装所有的动态连接库和主程序,二是、Windows的Fonts目录安装维文字体。
1. 启动InstallShield Express for C++Builder5,建立一个安装工程文件。
2. 在Application Information对话框,设定应用程序的名称,可执行文件,版本号,软件开发公司和缺省的安装路径等。
3. 在Main Window对话框,设定安装时显示的主题,应用程序的商标位图,安装程序的背景颜色等。
4. 在Gereral Options对话框,选择Standard VCL Packages复选框。
5. 在Groups and Files对话框,选择Program Files组,单击Insert Files按钮,添加我们的动态连接库my_dll.dll。选择System Files-WinSysDir组,单击Insert Files按钮,添加C++Builder的Bin目录下的borldndmm.dll和cc3250mt.dll等动态连接库文件。
6. 在Groups and Files对话框,单击New Group按钮,显示的Add group对话框的Group Name编辑框输入Ufonts。从Destination下拉式选项框中选择,但击OK,如图4所示。


图4 Add group对话框

7. 在Dialog Boxes对话框,设定安装应用程序时弹出的对话框。
8. 在Disk Builder对话框,但击Build按钮创建安装程序。


4.程序的运行结果
1.图5是程序运行是的动态托盘图标和右击图标时弹出的弹出示对话框。


图5 动态托盘图标和右击图标时弹出的弹出示对话框

2.图6是在World2000,维文,中文和英文混合处理一览。


图6 中文和英文混合处理一览

若有意者可从http://www.misiran.com免费下在完整的按装程序。