这篇文章教大家用D语言写一个具有资源文件的Win 32 GUI 程序。
如果有不会使用D语言的,请看我写过的《看图配置D语言集成开发环境》这篇文章。
首先了解一下基础知识。
D语言的源代码默认是用UTF8 编写的。
如果
char szMsg[] = "我们";//这么写,就是UTF8的字符串
string sMsg="什么";//这么写,就是UTF8的字符串
MessageBoxW(null,cast(char *)toUTF16(szMsg),null,MB_OK);
wchar szMsg[] = "我们";//这么写,就是unicode/UTF16的字符串
wstring sMsg="什么";//这么写,就是unicode/UTF16的字符串
MessageBoxW(null,cast(char *)szMsg,null,MB_OK);
传递给win32 API 时类型不匹配,强制转换是必须的
我的建议是不要使用A后缀的函数。
如果你要直接写个常字符串在API调用中,有点麻烦
MessageBoxW(null,cast(char *)toUTF16(cast(char[])"我们ddd我么"),null,MB_OK);
--------------------------------------------------------------------------------------------------------------
windows.d 的API 申明 不全,有时候我们 要自己声明像下面这样
//===================================================
//D语言的std.c.windows.windows没申明的win32 API函数,要用的话自己加上。
extern (Windows)
{
int LoadStringA(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax);
BOOL DestroyWindow(HWND hWnd);
BOOL Rectangle(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect);
}
//===================================================
--------------------------------------------------------------------------------------------------------------
建一个下图的项目,再次提醒“项目路径必须是已存在的目录”
然后 去 D:/dmd/samples/d (就是放dmd编译器的地方)目录把 winsamp.d 的内容 复制到 我们项目中的 main.d 中。复制下面的也行。
import std.c.windows.windows; const int IDC_BTNCLICK = 101; extern(Windows) case WM_PAINT: default: int doit() btnDontClick = CreateWindowA("BUTTON", "DON'T CLICK!", WS_CHILD | WS_VISIBLE, MSG msg; /**********************************************************/ /* Note the similarity of this code to the console D startup extern (C) void gc_init(); extern (Windows) gc_init(); // initialize garbage collector try result = doit(); // insert user code here catch (Object o) // catch any uncaught exceptions gc_term(); // run finalizers; terminate garbage collector |
然后“生成并运行”,问题来了,下图状况。
看样子是少个 *.lib ,看到源代码前面的
/* Compile with:
* dmd winsamp gdi32.lib winsamp.def
*/
了吧,少个gdi32.lib
进入“项目属性”的导入路径及程序库选项卡,程序库点击添加 找到 gdi32
好了,“生成并运行”没问题了,D语言的demo编译成功了。
去这个网站 下载 Resource Builder,只有30天试用,凑合用。
http://www.resource-builder.com/download.html
http://www.onlinedown.net/soft/12422.htm
安装了以后 把 “工具”-》“选项”-》“编译器”里的 "Res Tool" 指向 我们 安装 的Resource Builder,
默认是"C:/Program Files/SiComponents/Resource Builder/Resbldr2.exe"
在Resource 上面右键 新建 main.res 文件,在IDE里面把main.res关闭了。
然后双击 打开 Resource Builder 进行 资源 编辑。
建立菜单 和 图标。
我这里建立了一个图标和一个菜单,图标里面含有3个子项是windows标准要求的我们要拿这个做程序及窗体上的图标,注意ID值图标40001,菜单40002程序中要用。这个res文件是编译后的2进制文件了。
在程序 的 前面 加上
const int IDI_ICON = 40001;
const int IDM_MENU = 40002;
窗口结构填充处修改成
wc.hIcon = LoadIconW(hInst,cast(wchar*)IDI_ICON);
wc.lpszMenuName = cast(LPCSTR) IDM_MENU;
效果如下,资源 文件的 使用,请参考其他书籍。
我用D语言写了个完整 的 《汉诺塔》游戏,需要看源代码的去这里看看,我发的资源里面也有
http://bbs.gameres.com/showthread.asp?threadid=98142