import std.utf; //for toUTF16z
import win32.api; //for windows api
import std.stdio; //for writefln
extern(C) void gc_init();
extern(C) void gc_term();
extern(C) void _minit();
extern(C) void _moduleCtor();
extern(C) void _moduleDtor();
extern(C) void _moduleUnitTests();
//TextOut函数
pragma(lib,"gdi32.lib");
const char[] ClassName = "
http://www.d-programming-language-china.org";
extern(Windows)
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
int result;
gc_init();
_minit();
try
{
_moduleCtor();
_moduleUnitTests();
result = myWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
_moduleDtor();
}
catch(Exception e)
{
printf("catch %.*s\n",e.msg);
result = 0;
}
gc_term();
return result;
}
int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
wc.cbSize = WNDCLASSEX.sizeof;
wc.style = CS_HREDRAW | CS_VREDRAW ;
wc.lpfnWndProc = &WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
//bbs.d-programming-language-china.org注: D语言标准库的windows.d主要服务于ascii字符集的windows api,IDI_APPLICATION被定义为CHAR*,所以这里要转换成wchar*
//如果IDI_APPLICATION来定义是CHAR,就可以用toUTF16z来转换
wc.hIcon = LoadIcon (cast(HINSTANCE)null,cast(wchar*)IDI_APPLICATION);
wc.hIcon = LoadIcon (hInstance,toUTF16z("IDI_MYICON"));
wc.hCursor = LoadCursor(cast(HINSTANCE)null,cast(wchar*)IDC_ARROW);
wc.hbrBackground = cast(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = null;
//转换类名到以0结尾的宽字符集
wc.lpszClassName = toUTF16z(ClassName);
wc.hIconSm = LoadIcon(hInstance,std.utf.toUTF16z("IDI_MYICON"));
if ( !RegisterClassEx (&wc) )
return 0;
hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE | WS_EX_TOPMOST,
toUTF16z(ClassName),
std.utf.toUTF16z("D语言论坛
http://www.d-programming-language-china.org "),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,800,600,
HWND_DESKTOP,
cast(HMENU) null,
hInstance,
null);
if (hWnd == null)
{
MessageBoxEx(null,toUTF16z("欢迎来到 http://bbs.d-programming-language-china.org "),toUTF16z("error"),MB_ICONERROR | MB_HELP,0);
return -2;
}
//显示和更新窗体
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
int nRet; //防止GetMessage=-1时陷入死循环
while ( (nRet = GetMessage(&msg, cast(HWND)null, 0, 0)) != 0 )
{
if (nRet == -1 )
{
return -1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
extern(Windows)
LRESULT WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CHAR:
writefln("你按了键盘键 %d",wParam);
break;
case WM_LBUTTONDOWN:
HDC hDc;
hDc = GetDC(hwnd);
wchar[] s = "你左键单击了";
//用TextOut函数,必须加上gid32.lib库编译
TextOut(hDc,50,50, s.ptr, s.length);
ReleaseDC(hwnd,hDc);
break;
case WM_PAINT:
HDC hDc;
PAINTSTRUCT ps;
hDc = BeginPaint(hwnd, &ps);
wchar[] s = "你现在还好吗,D语言学得还好吧
http://www.d-programming-language-china.org";
TextOut(hDc,100,200, s.ptr, s.length);
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if ( IDYES== MessageBoxEx(hwnd, toUTF16z("真的要退出吗?"), toUTF16z("请选择"), MB_YESNO,0) )
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}