shawind 发表于 2008-8-31 17:25:51

一个空窗口

以前看到不少的例子,都是要从WinMain入口,然后自己手动开启GC子。
后来玩GDC的时候,发现用这个方法就很麻烦了。
gdc的gc方面的函数名和dmd不一样,最后link的时候,还得去用gcc的lib,不是一般的麻烦。
后来参考了下dfl的处理办法,可以直接从D的main入口,就是不知道这么做,会不会有什么问题。
(对这些东西背后的原理不熟悉。)


import win32.windows;

pragma(lib,"gdi32.lib");

HINSTANCE Hi;
HWND Hw;
WNDCLASSEXW Wc;

int main(char[][] args)
{
    Hi = GetModuleHandleW(null);
    assert(Hi);

    Wc.lpszClassName = "MyClass";
    Wc.cbSize = WNDCLASSEXW.sizeof;
    Wc.lpfnWndProc = &winProc;
    Wc.hInstance = Hi;
    Wc.style = CS_CLASSDC;
    Wc.hIcon = null;
    Wc.hCursor = null;
    Wc.hbrBackground = cast(HBRUSH)GetStockObject(BLACK_BRUSH);
    Wc.lpszMenuName = null;
    Wc.cbClsExtra = 0;
    Wc.cbWndExtra = 0;

    auto t = RegisterClassExW(&Wc);
    assert(t);
    
    int WindowWidth = 800 + GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXDLGFRAME);
    int WindowHeight = 600 + GetSystemMetrics(SM_CYEDGE) + GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYCAPTION);
    int WindowPositionX = GetSystemMetrics(SM_CXSCREEN)/2 - WindowWidth/2;
    int WindowPositionY = GetSystemMetrics(SM_CYSCREEN)/2 - WindowHeight/2;
    
    Hw = CreateWindowExW(WS_EX_APPWINDOW, "MyClass", "一个例子",
                               WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,
                               WindowPositionX, WindowPositionY, WindowWidth, WindowHeight,
                               null, null, Hi, null);
    assert(Hw);
    
    ShowWindow(Hw,SW_SHOW);
    
    auto MSG Msg;
    
    while(GetMessageW(&Msg, cast(HWND)null, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessageW(&Msg);
    }
    
    UpdateWindow(Hw);
    
    return 0;
}

extern(Windows) int winProc(HWND Hwnd, uint Msg, WPARAM Wparam, LPARAM Lparam)
{
    switch (Msg)
    {
        case WM_CLOSE:
            DestroyWindow(Hwnd);
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        
        case WM_PAINT:
            showText(Hwnd);
        break;

        default:
        break;
    }

    return DefWindowProcW(Hwnd, Msg, Wparam, Lparam);
}

void showText(HWND Hwnd)
{
    HDC Hdc;
    PAINTSTRUCT Paint;
    wchar* str = "只是一个空窗口";
    Hdc = BeginPaint(Hwnd, &Paint);
    TextOutW(Hdc, 300, 200, str, 2*str.sizeof);
    EndPaint(Hwnd, &Paint);
}

需要bindings项目中的win32库,这里面的unicode系的winapi函数才是全的。
存为uft-16le格式后,dmd test.d -L/exet:nt/su:windows:4.0 即可。

rednaxela 发表于 2008-9-4 18:18:07

哟,你现在编辑D的文件用啥编辑器?进来Descent的进展还挺不错的,已经相当可用了呢。有没有用?

shawind 发表于 2008-9-4 19:27:00

我没有用Descent,因为我的机子比较老,还是单核的,跑纯Java的IDE还是太吃力了。按别人说的优化后,反应还是迟钝,效果不明显。
一直在用的是Code::Blocks,虽然自动完成的能力差了点,但是可以不换IDE直接用上我机子里dmd,dmc,vc,gcc等命令行编译器。有利有弊。

rednaxela 发表于 2008-9-7 14:42:09

我的老笔记本也很老了啊,04年的。现在不照样经常开着两个VS2008在跑……Eclipse近来的速度也还不错啦,虽然Descent我没用不知道现在性能表现如何。

shawind 发表于 2008-9-7 17:50:22

可能是我的pf8060的问题吧,
因为我不爱用鼠标,而这个笔的驱动程序写的不好,运行太耗资源的大程序,笔的响应就有点问题.(SAI、PS等软件除外)
我把他驱动的client部分设为realtime了,server部分不知道怎么调。也不能彻底解决被别的程序强占的毛病.

ps.问一下,怎么调节注册为系统服务的程序在启动时的优先级。
ps2.45nm的四核快掉价,我要升级。
页: [1]
查看完整版本: 一个空窗口