`
betty_betty2008
  • 浏览: 24705 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
最近访客 更多访客>>
社区版块
存档分类
最新评论

Windows D编程类封装初步学习并请教

    博客分类:
  • D
阅读更多
首先把要请教的问题写在最顶部:
1。事件最好的包装方法是怎样的?怎样才能扩展它?可不可以给一个可运行的Minimal例程?
2。如何向WNDCLASS 的回调传递另一个类的成员方法,当然签名是相同的。直接传递是不行的,因delegate 和function不可隐式转换。

诚意请教,请赐教,谢谢!


dmd2031+windows xp sp3 +bud
compile:
bud -O -release -gui -cleanup winwrapapp.d


想着自己也能写一个GUI框架那多好啊,最起码也能学多一点东西,今天小试了一下用类封装Win32 编程,很明显事件部分是一大难点;另外D2的string 在与Win32 API 交互时的转换也很费事。做做笔记先。以下代码编译通过,可正常运行,但事件部分实在谈不上类封装。
注:1.为了支持中文,用了Win32 的Unicode API.
       2.Event类和Form类引用的Windows API 头文件来自D2 自带的std.c.windows.windows模块,如果改用win32包(http://www.dsource.org/projects/bindings/wiki/WindowsApi)的话则方便许多,因更全面,所以不用那么多的extern(Windows)...

主程序:
module winwrapApp;

import samsTools.form;

int main(string[] args)
{
	auto app=new Form("我的第一个WIN32 CLASS WRAPPER 窗口");
	return app.show;
}



Event类:
module samsTools.event;

//import win32.windows;
import std.c.windows.windows;

extern(Windows) int MessageBoxW(HWND,in wchar*,in wchar*,int);
class Event
{
	public:
	this()
	{
		//to-do 
	}
	
	//just a beginning test...
    //Oops!!!if wndProc is a non-static method,can not pass it to 
    //Form.WNDCLASS.lpfnWndProc directly!!!
	extern(Windows)
	static int wndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
	{
		switch(msg)
		{
			case WM_CREATE:
				//ti = new TrayIcon (hwnd,
              //TI_MYTRAYICON,LoadIconA(null, IDI_APPLICATION),"TrayIcon!");
	       //ti.show();
			break;
				case WM_LBUTTONDOWN:
				MessageBoxW(null,"左键被按下\nLeft button clicked!", "事件发生了",
					MB_ICONINFORMATION);
				break;
			/*
			case WM_RESIZE:
				showMessage("Windows 被更改了大小","事件通知");
				break;
			*/
			case WM_DESTROY:
				PostQuitMessage(0);
				break;
		
			default:
			break;
			
		}
		return DefWindowProcA(hwnd, msg, wparam, lparam);
	}
	private:
	enum EventType
	{
		Unknown=-1
		//to-do
	}
	

}

Form类:
module samsTools.form;

import samsTools.event;
//import win32.windows;

import std.c.windows.windows;

extern(Windows) HWND GetModuleHandleW(HWND);
extern(Windows) int MessageBoxW(HWND,in wchar*,in wchar*,int);
extern(Windows) HWND CreateWindowExW(
	int,const(wchar*),const (wchar*),int,int,int,int,int,HWND,HWND,HWND,void*);
extern(Windows) bool GetMessageW(LPMSG,HWND,int,int);
class Form
{
	public:
	this(const wstring title="Windows Template")
	{
		this._title=title;
		appInstance=GetModuleHandleW(null);
		//event=new Event;
		
		
	}
	int show()
	{
		if(! initApiClass)
			return 1;
		if(! initWidget)
			return 2;
		return loop;
	}

	HINSTANCE handle()
	{
		return appInstance;
	}
	
	const wstring title()
	{
		return _title;
	}
	
	private:
	HINSTANCE appInstance;
	HWND appWnd;
	WNDCLASS wc;
	MSG msg;
	const wstring _title;
	//Event event;

	

	bool initApiClass()
	{
		wc.lpszClassName = "winapi class";
		wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
		wc.lpfnWndProc = &Event.wndProc;
		wc.hInstance = appInstance;
		wc.hIcon = LoadIconA(null, IDI_APPLICATION);
		wc.hCursor = LoadCursorA(null, IDC_ARROW);
		wc.hbrBackground = cast(HBRUSH)(COLOR_BTNFACE + 1);
		wc.lpszMenuName = null;
		wc.cbClsExtra = wc.cbWndExtra = 0;
		if(!RegisterClassA(&wc))
		{
			MessageBoxW(null, "Window registration failure.", null, MB_ICONERROR);
			return false;
		}
		return true;
		
	}
	bool initWidget()
	{
		appWnd = CreateWindowExW(0, "winapi class",
		_title.ptr, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, null, null, appInstance, null);
		if(appWnd is null)
		{
			MessageBoxW(null, "Window creation failure.", null, MB_ICONERROR);
			return false;
		}
		return true;
	}
	int loop()
	{
		while(GetMessageW(&msg, null, 0, 0) > 0)
		{
			TranslateMessage(&msg);
			DispatchMessageA(&msg);
		}
		return cast(int)msg.wParam;
	}
	
}
分享到:
评论
4 楼 betty_betty2008 2009-09-02  
哥们:链接打不开
3 楼 Colorful 2009-09-02  
具体的事件例程可以参考源码中的单元测试。
2 楼 Colorful 2009-09-02  
实际上 Form 类会有多个继承。
1 楼 Colorful 2009-09-02  
请参考 .NET Windows Form 的窗口封装或者 DFL 的窗口封装,这两者非常相似。
消息处理应该封装在 Form 类中。

此外,关于事件的封装可以参考http://code.google.com/p/d-phoenix/source/browse/trunk/source/system/Event.d的做法。
这是一个通用的类似 .NET 的事件机制封装。

相关推荐

    Windows核心编程第五版随书源码集.rar

    Visual C++(简称VC++)是微软公司开发的一款强大的C++集成开发环境,它不仅支持C++编程,还包含了对MFC的支持,MFC是一个库,用于简化Windows应用程序的开发,它将Windows API封装为类,使得开发者可以使用面向对象...

    Windows图形编程源代码

    通过查看这些类的定义和成员函数,可以学习到如何封装Windows API功能,以及如何实现事件驱动编程。 此外,源代码可能还包括对资源的管理,如对话框模板、图标、位图等。MFC库提供了一些方便的类,如`CDialog`和`...

    用C++封装SDK编程,学习作品

    标题中的“用C++封装SDK编程,学习作品”意味着这个项目是关于使用C++语言来包装SDK(Software Development Kit)的实践过程,旨在提升开发者的技术能力和理解。SDK通常包含库、API接口、工具和其他资源,方便开发...

    tcp udp 底层c++封装类(windows和linux)

    在Windows和Linux平台上,由于socket API在基本操作上是跨平台的,但某些特定功能(如线程、信号量、异步IO)可能会有差异,因此封装类需要适配不同的操作系统API。 在实际开发中,使用这样的封装类可以减少代码...

    rust开发封装的windows gui源码 一般编程问题

    rust开发封装的windows gui源码。 一般编程问题 【核心代码】 ├── native-windows-gui │ ├── Cargo.toml │ ├── build.rs │ ├── examples │ │ ├── basic.rs │ │ ├── basic_barebone.rs │ ...

    Windows应用高级编程 C#编程篇

    《Windows应用高级编程 C#编程篇》是一本专注于C#技术在Windows桌面应用程序开发中的高级实践指南。这本书深入探讨了如何利用C#语言的强大功能和.NET Framework的丰富特性,来构建高效、稳定且用户友好的Windows应用...

    VC++技术内幕(windows编程篇)

    这份学习笔记涵盖了从基础知识到高级技术的全方位讲解,旨在帮助读者掌握Windows编程的核心技能。 首先,我们要了解Windows编程的基础,这包括Windows API的概念、窗口消息处理机制以及线程和进程的基本原理。...

    易语言锐浪类封装易语言锐浪类封装

    使用这个模块,开发者可以在自己的易语言程序中导入并实例化"锐浪类",从而调用封装好的锐浪库功能。 在实际应用中,例如,开发者可以利用"锐浪类封装"创建窗口、设置窗口样式、响应用户的鼠标和键盘事件,甚至进行...

    Windows可视化编程课件 (VC++)

    通过这个“Windows可视化编程课件”,你将掌握如何使用VC++和MFC设计和实现功能强大的Windows应用程序,理解Windows编程的核心概念,并能够应对各种GUI开发挑战。这不仅是提升编程技能的好途径,也是进入更复杂系统...

    ffplay windows 版本,去掉SDL并封装为单独类

    将 ffplay 更改为windows版本,去掉SDL,使用GDI+显示,并封装为单独的播放类,实现了快进,后退,暂停,其他请参考ffplay.c自己添加吧 ffmpeg 大概是 2015.4月的版本,每次重新打开文好像有句柄泄露, 发现问题的请...

    windows图形编程 英文原版

    综上所述,《Windows_Graphics_Programming_Win32_GDI_and_DirectDraw_(2000)》这本书是学习Windows平台图形编程的宝贵资源,无论你是初学者还是经验丰富的开发者,都能从中受益。通过阅读并实践书中的内容,你将...

    VC++编程指南 Windows编程和面向对象技术

    5. **MFC(Microsoft Foundation Classes)**:是微软为简化Windows编程提供的一套C++类库,它封装了Windows API,使得代码更易于理解和编写。 **面向对象技术** 面向对象编程(Object-Oriented Programming, OOP...

    Windows GUI高级编程(C#编程篇)源代码

    2. **面向对象编程**:掌握C#中的封装、继承和多态等面向对象特性,理解类与对象的区别,以及接口的应用。 3. **.NET Framework**:了解.NET Framework的基本结构,包括CLR(公共语言运行时)和类库,以及如何利用...

    c++ socket类封装(udp/tcp)

    在IT行业中,网络编程是不可或缺的一...无论是TCP还是UDP,理解并实现这样的封装都有助于提升程序员在网络编程领域的技能。通过学习和实践这些类,开发者能够构建自己的客户端-服务器应用,从而实现跨网络的数据交换。

    Windows 编程 VC++

    在Windows平台上进行编程,尤其是利用...通过深入学习这些知识点,并结合提供的22个Windows编程课程PPT,你将能够逐步掌握VC++下的Windows应用程序开发。在实际项目中,不断实践和迭代,你的技能将得到不断提升。

    C语言基于对象编程实现封装

    C语言基于对象编程实现封装,供大家一起共同分享学习。

    windows编程技术ppt

    MFC是微软为简化Windows API编程而设计的一套类库,它基于面向对象的C++语言,封装了Windows API,提供了更高级别的抽象。MFC将许多复杂的Windows编程细节封装起来,使得开发人员可以更专注于业务逻辑。MFC的主要...

    vc多个封装类方便编程

    vc封装类(包括操作有:通信,word,excel,图片,共享内存,注册表等,有源代码) 方便编程! vc封装类(包括操作有:通信,word,excel,图片,共享内存,注册表等,有源代码) 方便编程!

    深入windows编程

    2. **MFC框架**:VC++中的Microsoft Foundation Classes (MFC)库是基于C++封装的Windows API,它简化了Windows编程。书中会详细讲解MFC的类结构,如CWinApp、CWnd、CButton等,以及如何创建和管理窗口、控件和对话框...

    类与对象编程初步PPT学习教案.pptx

    在本PPT学习教案中,主要介绍了面向对象编程的三大特性:封装性、继承性和多态性,以及类与对象的关系、类的结构和创建等基本知识。 1. 封装性(信息隐藏) 封装是面向对象编程的核心概念之一,它将对象的属性...

Global site tag (gtag.js) - Google Analytics