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

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 ST说明书

    DFL-ST II工具是一款由磁动电子科技自主开发的专业ST硬盘固件修复工具,与深受大家喜爱和赞誉的DFL-WD为兄弟产品。 DFL-ST II工具主要针对市面上的7200.7-7200.10系列及11、12代的F3系列的ST硬盘而设计。DFL-ST II...

    DFL for DMD2.031

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

    DFL210配置示例

    DFL210配置示例 DFL系列防火墙配置

    DFL-WD中文说明书

    DFL-DE是专业的数据恢复软硬件USB2.0设备,该组件能够对ATA,SATA所有硬盘进行数据恢复,该设备也能够对连接于DFL-WD的SATA端口使用48位寻址方式的硬盘工作,同也也可以对任何操作系统识别的存储装置进行数据恢复。...

    DFL-WD II Setup_CHS_V2.3.5

    综合以上分析,我们可以推测“DFL-WD II”可能是一个专为西部数据硬盘设计的数据恢复或维护工具,具有高级的性能和稳定性,其最新版本为V2.3.5。然而,关于“XISHU”标签和“1590不降溶Pinnacle”的确切含义,需要更...

    DFL员工福利商业保险项目信息管理系统毕业论文

    《DFL员工福利商业保险项目信息管理系统》毕业论文主要探讨了一种基于B/S架构的保险信息系统设计与实现。本文将详细解析B/S结构的核心特点、系统功能以及在保险业务中的应用,尤其是理赔归档信息、归档信息查询及...

    DLINK DFL PPPoE設定方式

    DFL系列防火牆簡易安裝手冊 DFL-210,260,800,860,1600,2500 適用。

    DFL-CNN-master_svm人脸识别_人脸识别_facerecognition_支持向量机_cnn人脸识别_

    人脸识别是一种生物特征识别技术,它通过分析和比较人脸图像的特征信息来确认或验证个体身份。在实际应用中,人脸识别通常包括人脸检测、特征提取和匹配三个步骤。人脸检测定位出图像中的人脸区域,特征提取则从检测...

    PyPI 官网下载 | DFL168A-1.0.0-py3-none-any.whl

    标签“Python库”揭示了DFL168A是一个专门为Python设计的软件模块或框架,旨在提供特定功能或服务,如数据处理、网络通信、机器学习等。Python库可以极大地扩展Python的功能,简化开发过程,提高代码的可重用性。 ...

    DLINK -DFL系列設定如何阻檔某網站的方法

    DFL系列防火牆如果阻檔URL DFL-210,260,800,860,1600,2500 適用

    Premiere插件DFL2调色插件

    DFL2调色插件 DFL2调色插件 DFL2调色插件

    DFL Printting!

    ”可能指的是一个打印相关的项目或者软件,而描述中的“20080303,DMD1.027,xp,dfl0.97”提供了这个项目的更新日期(2008年3月3日)以及使用的编译器版本(DMD1.027)和可能的框架或库版本(dfl0.97)。这个项目似乎...

    DFL干膜润滑剂

    **DFL干膜润滑剂**是由ELECTROLUBE公司生产的一种特殊白色干膜润滑剂。该产品具有极高的纯净度,适用于不能使用矿物油或硅酮材料的场景。DFL干膜润滑剂能够形成不会污染、迁移或吸附灰尘及杂质的薄膜。 #### 二、...

    D-Link推出DFL-800/1600高性能整合式防火墙

    国际著名网络设备和解决方案提供商D-Link推出区域联防机制,并将其应用在新一代的安全产品--DFL-800/1600高性能 整合式防火墙中,不仅通过在网络安全设备之间建立互动机制,实现对网络安全设备的有效整合,将传统...

    dfl_0802:dfl0802纯

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

    O26_SDK框架_V0.5.pdf

    6. 硬件驱动层:硬件驱动层负责与硬件设备通信,包含了一系列驱动程序,如I2C、ADC、UART、SPI、GPIO、I2C、DMA、ADC、DAC、Timer、PWM、PWC、SPI、DFL、Low Power、RTC、NVM、CAN等。该层确保软件能有效地控制硬件...

    TOSHIBA-TC55257DFL.pdf

    TOSHIBA-TC55257DFL.pdf

Global site tag (gtag.js) - Google Analytics