`
ideage
  • 浏览: 327247 次
社区版块
存档分类
最新评论

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的做法

使用面向对象语言的方法,使用继承抽象了窗口组件的层次,封装了消息循环,简化了处理过程.待续...
分享到:
评论
1 楼 flyingxu 2008-11-24  
等待续文“2.DFL的做法 ”

相关推荐

    DFL for DMD2.031

    同时,DFL也考虑到了工具链的完整性,可能包含构建系统、测试框架等,使得开发流程更为顺畅。 压缩包中的"dfl"文件可能包含了DFL库的所有源码,这为开发者提供了深入学习和定制的机会。通过阅读和研究源码,我们...

    dfl_0802:dfl0802纯

    【标题】"dfl_0802:dfl0802纯" 暗示着这可能是一个关于数据处理或者数据分析的项目,其中“dfl”可能是“Data Flow”或“DataFrame Library”的缩写,而“0802”可能是日期、版本号或者是项目的特定标识。...

    dfl-v104

    通常,一个名为"dfl"的项目可能是数据处理、数据分析或是数据流相关的,而"v104"则表明它经过了多次迭代,可能是一个成熟且稳定的项目。 【标签】"Python"揭示了这个项目是用Python语言编写的。Python是一种高级、...

    财务管理杠杆及财务知识分析.pptx

    杠杆分析框架图10-1展示了如何将销售量变动的影响分解为经营政策(经营杠杆)和融资政策(财务杠杆)两个方面,这对于管理层制定战略和计划具有指导意义。通过理解这些杠杆效应,管理者可以更好地预测企业收益的波动...

    XXXX年会计师考试—财务杠杆专题.docx

    在本文中,我们将深入探讨财务杠杆专题,为准备会计师考试的考生们提供一个全面的分析框架。 首先,要了解财务杠杆效应,我们先要明白其定义及如何产生。财务杠杆效应是指企业因为存在固定财务费用(如利息支出和...

    基于去中心化联邦学习的货运速度预测时空模型-A decentralized federated learning-based s

    本研究提出了一种新颖的基于去中心化联邦学习的时空模型(Decentralized Federated Learning-based Spatial-Temporal Model, DFL-ST),该模型能够通过多个参与者之间的协作训练来进行货运速度预测,而无需依赖于...

    Pytorch 实现冻结指定卷积层的参数

    在深度学习中,模型训练往往需要优化大量参数,这一过程通常在Pytorch这样的深度学习框架中进行。在训练过程中,我们可能会遇到需要冻结模型中特定层(例如卷积层)的参数的情况,这样做的目的可能是为了保留之前...

    李凡长教授与"动态模糊逻辑研究" (2004年)

    动态模糊集理论中包含的DF格结构、DF模运算、DF表现定理等概念,构成了一个完整的理论框架,用以描述和分析动态模糊现象。 3. 动态模糊逻辑系统的构建 动态模糊逻辑系统(Dynamic Fuzzy Logic,简称DFL)是李凡长...

    鱼群算法优化组合核函数GPR 的油井动液面预测

    高斯过程是一种非参数概率模型,它为回归分析提供了一种灵活的框架。它使用高斯过程来建模数据,以概率分布的形式对函数进行建模。通过定义一个先验概率分布,然后用观测数据来更新这个先验分布,以得到后验分布。...

    usb_drive驱动

    5. 调试技巧:学会使用USB分析器、kernel log、调试器等工具来诊断和解决问题。 对于"4th"这个文件,可能是源代码或者编译指南的一部分。在实际学习过程中,你需要阅读源代码,理解其结构和功能,熟悉如何配置、...

Global site tag (gtag.js) - Google Analytics