DFL框架分析(一)

来源:转载

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

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

一个简单的win32程序,D的例子:winsamp

// Compile with: dmd winsamp gdi32.lib winsamp.defimport 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 winProcwc.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的做法

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



分享给朋友:
您可能感兴趣的文章:
随机阅读: