D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: DFL框架分析1

yidabu 2007-4-27 19:30

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 )        代码        [Copy to clipboard] [ - ]CODE:                                // 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为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: DFL框架分析1