- 浏览: 24879 次
- 性别:
- 来自: 东莞
最新评论
-
flythink:
oledb是不是更容易弄一些? 纯猜测
MS ODBC for DMD 2.053 -
hqs7636:
8错,继续完善一下。。。
MS ODBC for DMD 2.053 -
rocex:
lz的这个工具好用,可以随时在1.x和2.x上切换。
DEx ...
D2/Phobos与D2/Tango一键切换编译环境设置 -
Colorful:
链接是这个 : http://code.google.com/ ...
Windows D编程类封装初步学习并请教 -
betty_betty2008:
哥们:链接打不开
Windows D编程类封装初步学习并请教
首先把要请教的问题写在最顶部:
1。事件最好的包装方法是怎样的?怎样才能扩展它?可不可以给一个可运行的Minimal例程?
2。如何向WNDCLASS 的回调传递另一个类的成员方法,当然签名是相同的。直接传递是不行的,因delegate 和function不可隐式转换。
诚意请教,请赐教,谢谢!
想着自己也能写一个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)...
主程序:
Event类:
Form类:
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; } }
评论
5 楼
Colorful
2009-09-02
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 的事件机制封装。
消息处理应该封装在 Form 类中。
此外,关于事件的封装可以参考http://code.google.com/p/d-phoenix/source/browse/trunk/source/system/Event.d的做法。
这是一个通用的类似 .NET 的事件机制封装。
发表评论
-
D2 下win32 api 中文框架备忘
2011-07-28 17:49 1048隔一段时间就忘了怎么在D2下win32 SDK框架里使用中文, ... -
MS ODBC for DMD 2.053
2011-05-20 16:49 1241东拼西凑,终于在dmd2.053下成功连接上了ODBC 数据库 ... -
截屏、闪屏(Timer)、输入窗口--DFL for D2.053
2011-05-16 17:41 1275这个小练习用D2.053+DFL完成了以下功能: 1.截屏(C ... -
SDK写的一个画树(花)程序
2009-11-23 17:53 1080[img]C:\Documents and Settings\ ... -
json for D2.034
2009-10-13 19:54 722作者:Jeremie Pelletier 链接: [url] ... -
D2 中使用VC的Windows资源文件
2009-09-15 15:26 1230终于试成功了。总结一下: 一.在*.RC里包含window ... -
windows vfw.lib
2009-09-07 20:06 1346上传到这里,因为有时候改变工作地点后另一台机上没有。:P -
再学SQLite3 API
2009-08-21 17:48 2240这次进一步看了看SQLigte3 的API,不用上次写的类包装 ... -
"D"iving Into the D Programming Language
2009-08-04 16:23 1593"D"iving Into the D P ... -
练习:boost.timer 转D2
2009-07-21 12:32 1333中间解决了好几个问题,尚有几个问题没解决,已在NG上提问。备忘 ... -
Sqlite3 C++类库Sharplite 转D
2009-07-17 16:32 1672这是一份作业,因为所有创作的部分都是前人的。 材料:1.sql ... -
D2 反射和defineEum! 练习
2009-07-16 14:21 874备忘: module DioApp; imp ... -
D2 std.stream 文件读写小练习
2009-07-13 19:12 1787笔记要点: 1。个人工具包samsTools 工具之一Prom ... -
DFL for DMD2.031
2009-07-10 16:33 912从NG里要到的,俺测过了,OK 的啦. 原贴原下载地址链接: ... -
D2/Phobos与D2/Tango一键切换编译环境设置
2009-05-08 18:01 1174一。适合谁: 象俺一样,反反复复搭不起D编译环境的小菜 二。不 ... -
(翻译)Phobos 2.029 R部 std.random
2009-04-27 14:58 1334std.random ... -
(翻译)Phobos 2.029 P部 std.process
2009-04-23 11:57 1165std.process ... -
(翻译)Phobos 2.029 P部 std.path
2009-04-23 10:52 1321std.path ...
相关推荐
本文将详细讲解Windows串口编程的概念、类封装的重要性以及一个实际的例子。 串口通信允许计算机与其他设备通过串行接口进行数据交换。在Windows环境下,通常使用微软提供的`MSComm`控件或`WinAPI`函数来实现串口...
Visual C++(简称VC++)是微软公司开发的一款强大的C++集成开发环境,它不仅支持C++编程,还包含了对MFC的支持,MFC是一个库,用于简化Windows应用程序的开发,它将Windows API封装为类,使得开发者可以使用面向对象...
标题中的“用C++封装SDK编程,学习作品”意味着这个项目是关于使用C++语言来包装SDK(Software Development Kit)的实践过程,旨在提升开发者的技术能力和理解。SDK通常包含库、API接口、工具和其他资源,方便开发...
在Windows和Linux平台上,由于socket API在基本操作上是跨平台的,但某些特定功能(如线程、信号量、异步IO)可能会有差异,因此封装类需要适配不同的操作系统API。 在实际开发中,使用这样的封装类可以减少代码...
本文将深入探讨“Windows读写注册表封装库”,并介绍如何使用C++进行注册表操作,以及如何利用提供的源码进行学习。 首先,让我们了解什么是注册表读写。在Windows API中,通过`RegCreateKeyEx`、`RegOpenKeyEx`、`...
基础的windows窗口类使用C++封装后的源码,点此下载,这是我的第一版本,还有很多功能没有实现。 代码实现效果如: TWnd* wnd; wnd->Create(IDD_DIALOG1,NULL,(LPARAM)wnd); //创建一个非模态窗口; TWnd* dlg; ...
rust开发封装的windows gui源码。 一般编程问题 【核心代码】 ├── native-windows-gui │ ├── Cargo.toml │ ├── build.rs │ ├── examples │ │ ├── basic.rs │ │ ├── basic_barebone.rs │ ...
开发者在易语言项目中可以轻松导入这个模块,实例化“锐浪类”,并快速运用锐浪库封装好的功能。简而言之,它提供了一种便捷的方式,让易语言的使用者能够快速拥抱图形界面编程的世界。 总的来说,“易语言锐浪类...
《Windows应用高级编程 C#编程篇》是一本专注于C#技术在Windows桌面应用程序开发中的高级实践指南。这本书深入探讨了如何利用C#语言的强大功能和.NET Framework的丰富特性,来构建高效、稳定且用户友好的Windows应用...
这份学习笔记涵盖了从基础知识到高级技术的全方位讲解,旨在帮助读者掌握Windows编程的核心技能。 首先,我们要了解Windows编程的基础,这包括Windows API的概念、窗口消息处理机制以及线程和进程的基本原理。...
将 ffplay 更改为windows版本,去掉SDL,使用GDI+显示,并封装为单独的播放类,实现了快进,后退,暂停,其他请参考ffplay.c自己添加吧 ffmpeg 大概是 2015.4月的版本,每次重新打开文好像有句柄泄露, 发现问题的请...
综上所述,《Windows_Graphics_Programming_Win32_GDI_and_DirectDraw_(2000)》这本书是学习Windows平台图形编程的宝贵资源,无论你是初学者还是经验丰富的开发者,都能从中受益。通过阅读并实践书中的内容,你将...
2. **面向对象编程**:掌握C#中的封装、继承和多态等面向对象特性,理解类与对象的区别,以及接口的应用。 3. **.NET Framework**:了解.NET Framework的基本结构,包括CLR(公共语言运行时)和类库,以及如何利用...
MFC是微软为简化Windows API编程而设计的一套类库,它基于面向对象的C++语言,封装了Windows API,提供了更高级别的抽象。MFC将许多复杂的Windows编程细节封装起来,使得开发人员可以更专注于业务逻辑。MFC的主要...
在IT行业中,网络编程是不可或缺的一...无论是TCP还是UDP,理解并实现这样的封装都有助于提升程序员在网络编程领域的技能。通过学习和实践这些类,开发者能够构建自己的客户端-服务器应用,从而实现跨网络的数据交换。
vc封装类(包括操作有:通信,word,excel,图片,共享内存,注册表等,有源代码) 方便编程! vc封装类(包括操作有:通信,word,excel,图片,共享内存,注册表等,有源代码) 方便编程!
2. **MFC框架**:VC++中的Microsoft Foundation Classes (MFC)库是基于C++封装的Windows API,它简化了Windows编程。书中会详细讲解MFC的类结构,如CWinApp、CWnd、CButton等,以及如何创建和管理窗口、控件和对话框...
在本PPT学习教案中,主要介绍了面向对象编程的三大特性:封装性、继承性和多态性,以及类与对象的关系、类的结构和创建等基本知识。 1. 封装性(信息隐藏) 封装是面向对象编程的核心概念之一,它将对象的属性...
在Windows编程领域,Win32 API是一个至关重要的接口,它提供了与操作系统进行交互的基本功能,包括创建窗口、处理消息等。对于C++开发者来说,直接使用Win32 API编写窗口程序时,通常需要反复编写一些基础的代码,如...
总的来说,"USB HID通讯类封装"是一种高效、便捷的工具,它利用HIDAPI提供的功能,为开发者提供了与HID设备交互的高层抽象,是进行USB HID设备编程时的一个有力助手。通过深入理解和使用这个类,可以提升开发效率,...