DFL框架分析(一)

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

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

一个简单的win32程序,D的例子:winsamp
// 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的做法

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

你可能感兴趣的:(框架,Windows,C,C++,C#)