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为大家提供一个学习交流各种知识的平台