幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2730|回复: 4

[通用编程] 一个空窗口

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2008-8-31 17:25:51 | 显示全部楼层 |阅读模式
以前看到不少的例子,都是要从WinMain入口,然后自己手动开启GC子。
后来玩GDC的时候,发现用这个方法就很麻烦了。
gdc的gc方面的函数名和dmd不一样,最后link的时候,还得去用gcc的lib,不是一般的麻烦。
后来参考了下dfl的处理办法,可以直接从D的main入口,就是不知道这么做,会不会有什么问题。
(对这些东西背后的原理不熟悉。)
  1. import win32.windows;
  2. pragma(lib,"gdi32.lib");
  3. HINSTANCE Hi;
  4. HWND Hw;
  5. WNDCLASSEXW Wc;
  6. int main(char[][] args)
  7. {
  8.     Hi = GetModuleHandleW(null);
  9.     assert(Hi);
  10.     Wc.lpszClassName = "MyClass";
  11.     Wc.cbSize = WNDCLASSEXW.sizeof;
  12.     Wc.lpfnWndProc = &winProc;
  13.     Wc.hInstance = Hi;
  14.     Wc.style = CS_CLASSDC;
  15.     Wc.hIcon = null;
  16.     Wc.hCursor = null;
  17.     Wc.hbrBackground = cast(HBRUSH)GetStockObject(BLACK_BRUSH);
  18.     Wc.lpszMenuName = null;
  19.     Wc.cbClsExtra = 0;
  20.     Wc.cbWndExtra = 0;
  21.     auto t = RegisterClassExW(&Wc);
  22.     assert(t);
  23.     
  24.     int WindowWidth = 800 + GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXDLGFRAME);
  25.     int WindowHeight = 600 + GetSystemMetrics(SM_CYEDGE) + GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYCAPTION);
  26.     int WindowPositionX = GetSystemMetrics(SM_CXSCREEN)/2 - WindowWidth/2;
  27.     int WindowPositionY = GetSystemMetrics(SM_CYSCREEN)/2 - WindowHeight/2;
  28.     
  29.     Hw = CreateWindowExW(WS_EX_APPWINDOW, "MyClass", "一个例子",
  30.                                WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,
  31.                                WindowPositionX, WindowPositionY, WindowWidth, WindowHeight,
  32.                                null, null, Hi, null);
  33.     assert(Hw);
  34.     
  35.     ShowWindow(Hw,SW_SHOW);
  36.     
  37.     auto MSG Msg;
  38.     
  39.     while(GetMessageW(&Msg, cast(HWND)null, 0, 0))
  40.     {
  41.         TranslateMessage(&Msg);
  42.         DispatchMessageW(&Msg);
  43.     }
  44.     
  45.     UpdateWindow(Hw);
  46.     
  47.     return 0;
  48. }
  49. extern(Windows) int winProc(HWND Hwnd, uint Msg, WPARAM Wparam, LPARAM Lparam)
  50. {
  51.     switch (Msg)
  52.     {
  53.         case WM_CLOSE:
  54.             DestroyWindow(Hwnd);
  55.         break;
  56.         case WM_DESTROY:
  57.             PostQuitMessage(0);
  58.         break;
  59.         
  60.         case WM_PAINT:
  61.             showText(Hwnd);
  62.         break;
  63.         default:
  64.         break;
  65.     }
  66.     return DefWindowProcW(Hwnd, Msg, Wparam, Lparam);
  67. }
  68. void showText(HWND Hwnd)
  69. {
  70.     HDC Hdc;
  71.     PAINTSTRUCT Paint;
  72.     wchar* str = "只是一个空窗口";
  73.     Hdc = BeginPaint(Hwnd, &Paint);
  74.     TextOutW(Hdc, 300, 200, str, 2*str.sizeof);
  75.     EndPaint(Hwnd, &Paint);
  76. }
复制代码
需要bindings项目中的win32库,这里面的unicode系的winapi函数才是全的。
存为uft-16le格式后,dmd test.d -L/exet:nt/su:windows:4.0 即可。
え~え~お!!!
回复

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2008-9-4 18:18:07 | 显示全部楼层
哟,你现在编辑D的文件用啥编辑器?进来Descent的进展还挺不错的,已经相当可用了呢。有没有用?
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2008-9-4 19:27:00 | 显示全部楼层
我没有用Descent,因为我的机子比较老,还是单核的,跑纯Java的IDE还是太吃力了。按别人说的优化后,反应还是迟钝,效果不明显。
一直在用的是Code::Blocks,虽然自动完成的能力差了点,但是可以不换IDE直接用上我机子里dmd,dmc,vc,gcc等命令行编译器。有利有弊。
え~え~お!!!
回复 支持 反对

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2008-9-7 14:42:09 | 显示全部楼层
我的老笔记本也很老了啊,04年的。现在不照样经常开着两个VS2008在跑……Eclipse近来的速度也还不错啦,虽然Descent我没用不知道现在性能表现如何。
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2008-9-7 17:50:22 | 显示全部楼层
可能是我的pf8060的问题吧,
因为我不爱用鼠标,而这个笔的驱动程序写的不好,运行太耗资源的大程序,笔的响应就有点问题.(SAI、PS等软件除外)
我把他驱动的client部分设为realtime了,server部分不知道怎么调。也不能彻底解决被别的程序强占的毛病.

ps.问一下,怎么调节注册为系统服务的程序在启动时的优先级。
ps2.45nm的四核快掉价,我要升级。
え~え~お!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 22:24 , Processed in 0.018300 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表