发新话题
打印

DFL框架分析1

DFL框架分析1

知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070427

点击下面网址查看原文:
http://www.d-programming-language-china.org

by: ideage
from: http://ideage.javaeye.com/blog/29345

关键字: DFL
1.框架的意义,一个简单windows程序的要素:
封装了windows窗口,控件,简化windows开发.

声明winProc回调函数;定义窗口属性,绑定回调函数,注册窗口类;创建windows窗口;进入消息处理循环,直到结束.

一个简单的win32程序,D的例子:winsamp( 本文出处: http://www.d-programming-language-china.org )

代码

// Compile with: dmd winsamp gdi32.lib winsamp.def
import std.c.windows.windows;
import std.c.stdio;

const int IDC_BTNCLICK = 101;
const int IDC_BTNDONTCLICK = 102;

extern(Windows)
int WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
            case WM_COMMAND:
        {
                switch (LOWORD(wParam))
                {
                case IDC_BTNCLICK:
                        if (HIWORD(wParam) == BN_CLICKED)
                            MessageBoxA(hWnd, "Hello, world!", "Greeting",
                                MB_OK | MB_ICONINFORMATION);
                        break;
                case IDC_BTNDONTCLICK:
                        if (HIWORD(wParam) == BN_CLICKED)
                        {
                            MessageBoxA(hWnd, "You've been warned...", "Prepare to GP fault",
                                MB_OK | MB_ICONEXCLAMATION);
                            *(cast(int*) null) = 666;
                        }
                        break;
                }
                break;
            }
        case WM_PAINT:
        {
                static char[] text = "D Does Windows";
                PAINTSTRUCT ps;
                HDC dc = BeginPaint(hWnd, &ps);
                RECT r;
                GetClientRect(hWnd, &r);
                HFONT font = CreateFontA(80, 0, 0, 0, FW_EXTRABOLD, FALSE, FALSE,
                    FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                    DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
                HGDIOBJ old = SelectObject(dc, cast(HGDIOBJ) font);
                SetTextAlign(dc, TA_CENTER | TA_BASELINE);
                TextOutA(dc, r.right / 2, r.bottom / 2, text, text.length);
                SelectObject(dc, old);
                EndPaint(hWnd, &ps);
                break;
        }
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                break;
    }
    return DefWindowProcA(hWnd, uMsg, wParam, lParam); // allow windows process other message
}

int doit()
{
    HINSTANCE hInst = GetModuleHandleA(null);

    WNDCLASS wc;
    wc.lpszClassName = "DWndClass";
    wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = &WindowProc; //set winProc
    wc.hInstance = hInst;
    wc.hIcon = LoadIconA(cast(HINSTANCE) null, IDI_APPLICATION);
    wc.hCursor = LoadCursorA(cast(HINSTANCE) null, IDC_CROSS);
    wc.hbrBackground = cast(HBRUSH) (COLOR_WINDOW + 1);
    wc.lpszMenuName = null;
    wc.cbClsExtra = wc.cbWndExtra = 0;
    RegisterClassA(&wc);

    HWND hWnd, btnClick, btnDontClick;
    hWnd = CreateWindowA("DWndClass", "Just a window", WS_THICKFRAME |
        WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, HWND_DESKTOP,
        cast(HMENU) null, hInst, null);
    assert(hWnd);

    btnClick = CreateWindowA("BUTTON", "Click Me", WS_CHILD | WS_VISIBLE,
        0, 0, 100, 25, hWnd, cast(HMENU) IDC_BTNCLICK, hInst, null);

    btnDontClick = CreateWindowA("BUTTON", "DON'T CLICK!", WS_CHILD | WS_VISIBLE,
        110, 0, 100, 25, hWnd, cast(HMENU) IDC_BTNDONTCLICK, hInst, null);

    MSG msg;
    while (GetMessageA(&msg, cast(HWND) null, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }

    return 1;
}

extern (C) void gc_init();
extern (C) void gc_term();
extern (C) void _minit();
extern (C) void _moduleCtor();
extern (C) void _moduleUnitTests();

extern (Windows)
int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    int result;

    gc_init();    // initialize garbage collector
    _minit();    // initialize module constructor table

    try
    {
            _moduleCtor();    // call module constructors
            _moduleUnitTests(); // run unit tests (optional)
            result = doit();    // insert user code here
    }
    catch (Object o)    // catch any uncaught exceptions
    {
            MessageBoxA(null, cast(char *)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION);
            result = 0;    // failed
    }
    gc_term();    // run finalizers; terminate garbage collector
    return result;
}

2.DFL的做法

使用面向对象语言的方法,使用继承抽象了窗口组件的层次,封装了消息循环,简化了处理过程.待续...

( lastupdate:20070427 最新文章请访问http://www.d-programming-language-china.org )

关于一大步成功社区:
yidabu提倡在交流中学习,在分享中提高
收集感兴趣的知识,写下心得,通过网络与别人一起分享
理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的
网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台

TOP

发新话题