createdroptargets_使用DUILIB建立项目

使用DUILIB加载XML界面

这篇主要目的就是教给大家怎样在自己的工程中加载XML界面,这是最基本的应用,对于界面控件响应啥的,我就不讲了,在大家懂了这个之后,我会给大家一个其它人写的博客,再看他的文章,大家应该就更清楚明白

一,建立工程

建立win32应用程序,取名叫blog_try

这里有几点要注意:

1、选择.net framework 2.0 如果你在开发时没有选择这个,而你用了默认的3.5的话,当你发布APP的时候,你就只有哭了,因为,3.5以上的只能在WIN 7上的操作系统运行,这一点一定要注意。我有血的教训!!!

2、其它其实也没什么注意的了,选择win32下的win32项目

这里选择:windows应用程序

二、搭环境

1、删除部分生成的代码

到blog_try里,把自动生成的代码删成这个样子,即除了包含头文件和winmain函数以外,其它都不要

2、复制duilib相关文件到工程目录

2.1、把duilib源工程中的头文件全部复制到我们的blog_try工程目录下:

2.2、将lib文件同样放在blog_try工程目录下

2.3、将dll文件放在debug目录下

三、函数重写与加载界面文件

1、在stdafx.h中加入以下代码,以添加包含duilib的头文件和库文件

// TODO: 在此处引用程序需要的其他头文件

#include "UIlib.h"

using namespace DuiLib;

#ifdef _DEBUG

#   ifdef _UNICODE

#       pragma comment(lib, "DuiLib_ud.lib")

#   else

#       pragma comment(lib, "DuiLib_d.lib")

#   endif

#else

#   ifdef _UNICODE

#       pragma comment(lib, "DuiLib_u.lib")

#   else

#       pragma comment(lib, "DuiLib.lib")

#   endif

#endif

2、在blog_try.h中添加类CMainFrame,这个类继承自CwindowWnd,INotifyUI,我们也就是用这个类CMainFrame来实现绑定XML,添加对按钮等等控件的响应。

class CMainFrame :

public DuiLib::CWindowWnd,public INotifyUI//应用程序窗口类CWindowWnd

{

public:

CMainFrame(void);

~CMainFrame(void);

};

在blog_try.cpp中添加实现

CMainFrame::CMainFrame(void)

{

}

CMainFrame::~CMainFrame(void)

{

}

现在blog_try.cpp中的代码应该是:

3、重写虚函数

在新实现的类中,有三个虚函数是必须重写的,它们是:

LPCTSTR GetWindowClassName() const {}  //这是个纯虚函数,大家看UIBase.cpp里对它的引用就可以明白为什么非要实现它,因为

//在注册窗口类时所用的类名(classname),就是用GetWindowClassName()来获取的;

//与此类似地,大家可以通过重写UINT GetClassStyle() const {}来为注册窗口类时,指定//类别,在360Demo中重写了这个函数,大家可以去看看

void Notify(TNotifyUI& msg){}         //在新类中可以通过实现该类,来实现消息拦截,从而当指定的消息出现时,响应我们的函数

//这个函数主要用来处理窗口上的控件发出来消息的响应

LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){}  //消息处理函数,这个主要用来处理对话框窗口产生的消息

首先是对GetWindowClassName()的重写,即返回任意一个字符串做为注册类的类名就可以了

代码如下:

LPCTSTR CMainFrame::GetWindowClassName() const //重写获取类名函数,也就是指定要新建的窗口类的类名

{

return _T("UIMainFrame");

};

然后是对Notify的重写

代码如下:

void CMainFrame::OnPrepare()

{

}

void CMainFrame::Notify(TNotifyUI& msg)//处理窗口通知消息,响应用户的输入

{

if( msg.sType == _T("windowinit") ) OnPrepare();

}

最后是对HandleMessage()的重写:

3.1 先定义一个变量

CPaintManagerUI m_pm;

这个变量将用来绘图,即画出我们图像中的各种控件与背景的,从它的类型名CPaintManagerUI也能看得出来

3.2实现HandleMessage(){}

LRESULT CMainFrame::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){

LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);

styleValue &= ~WS_CAPTION;

::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

m_pm.Init(m_hWnd);//主窗口类与窗口句柄关联

CDialogBuilder builder;

CControlUI* pRoot = builder.Create(_T("UISkin.xml"), (UINT)0, NULL, &m_pm);//加载XML并动态创建界面无素,与布局界面元素,核心函数单独分析

//注意:CDialogBuilder 并不是一个对话框类

ASSERT(pRoot && "Failed to parse XML");

if (NULL==pRoot)//如果找不到皮肤文件则退出

{

MessageBox(NULL,TEXT("Cant not find the skin!"),NULL,MB_ICONHAND);

return 0;

}

m_pm.AttachDialog(pRoot);//附加控件数据到HASH表中……为pRoot作为对话框结点,为其创建控件树

m_pm.AddNotifier(this);//增加通知处理

return 0;

}

LRESULT CMainFrame::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)

{

LRESULT lRes = 0;

BOOL bHandled = TRUE;

switch( uMsg ) {

case WM_CREATE:

lRes = OnCreate(uMsg, wParam, lParam, bHandled);

break;

default:

bHandled = FALSE;

}

if( bHandled ) return lRes;

if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;

return CWindowWnd::HandleMessage(uMsg, wParam, lParam);

}

4、实现主函数WinMain()

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR    lpCmdLine,

int       nCmdShow)

{

CPaintManagerUI::SetInstance(hInstance);//设置程序实例

CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()

+ _T("skin"));//实例句柄与渲染类关联,获得皮肤文件目录(加载皮肤文件在OnCreate之中)

HRESULT Hr = ::CoInitialize(NULL);//初始化COM库, 为加载COM库提供支持

if( FAILED(Hr) )

return 0;

CMainFrame* pMainFrame = new CMainFrame();//创建应用程序窗口类对象

if( pMainFrame == NULL )

return 0;

pMainFrame->Create(NULL, _T("AdderCalc"), UI_WNDSTYLE_DIALOG, 0);

pMainFrame->CenterWindow();//将窗口放到桌面中央

pMainFrame->ShowWindow(true);//显示窗口

CPaintManagerUI::MessageLoop();//进入消息循环

::CoUninitialize();//退出程序并释放COM库

return 0;

}

出错及处理:

一、IDropTarget* GetTxDropTarget();

提出错误:error C2143: 语法错误: 缺少“;”(在“*”的前面)

解决:添加头文件:#include "OLEIDL.h"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器缺少storportSYS文件,Windows操作系统蓝屏日志分析方法

或许你可以先检测下机器硬件健康状况,详情点击查看检测教程工具:X64 Debuggers And Tools-x64_en-us 下载地址:链接:http://pan.baidu.com/s/1cAO2ey 密码:9oms源文件:DMP蓝屏日志 ,文件目录查看…

vue 时区转换_vue---时间戳转换

在/assets下创建一个utils.jsfunction formatDate(date, fmt) {if (/(y)/.test(fmt)) {fmt fmt.replace(RegExp.$1, (date.getFullYear() ).substr(4 - RegExp.$1.length))}let o {M: date.getMonth() 1,d: date.getDate(),h: date.getHours(),m: date.getMinutes(),s: dat…

过滤特征_LR训练优化-稀疏特征过滤

一、背景在推荐系统中,LR由于简单高效,至今在各大互联网公司中仍广泛应用。但是互联网公司中的数据大都是高维稀疏,比如广告id,再加上各种人工的特征组合,特征维度很容易达到上亿维,使得内存的消耗和训练的…

合并工具_你值得拥有这个PDF合并工具 免费获取转换方法

合并PDF文件?很多人在日常生活中经常会需要使用到合并文档的要求,但是不是所有的人都能够很熟练的去合并我们生活中常用的文件,例如PDF,例如Word和Excel等等,其实只要我们学会了PDF合并的方法,以上文件的合…

python中eof表示什么语句错误_python中pickle的EOF错误

根据这些评论,我对最有可能的问题有一个猜测,但至少有50%的可能性我猜错了,在这种情况下……告诉我,我会删除答案。在我猜你是在尝试使用流套接字,就好像它是一个消息序列一样。这是网络编程新手中非常常见的问题。在想…

事物与持久化_跟面试官侃半小时MySQL事务,说完原子性、一致性、持久性的实现...

提到MySQL的事物,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关。而事务的ACID(即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)可以说涵盖了事务…

cookie里面用到的关键字_晓龙吊打面试官系列:synchronized关键字入门(同步方法与同步代码块)...

文章目录一、 线程安全问题二、synchronized简介1) 原子性2) 可见性3) 有序性4)可重入1. 什么是synchronized2.什么是同步3.synchronized的特性4.synchronized的实现原理(了解即可)三、synchronized的用法1. 同步方法2. 同步代码块四、对象锁和类锁1)对象锁2)类锁1.对象锁的探索…

mac vscode 背景半透明_给 vscode 添加半透明毛玻璃效果

Electron 可以调用 MacOS 的毛玻璃效果,下面让我来带你给 VScode 添加毛玻璃效果。2. 创建一个 CSS 文件(CSS 是我自己写的,你可以按需修改)html {background: transparent !important;}.scroll-decoration {box-shadow: none !important;}.minimap {opa…

python队列精灵对战_python队列Queue

python2, 参考思路.QueueQueue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递基本FIFO队列class Queue.Queue(maxsize0)FIFO即First in First Out,先进先出…

mysql 函数返回查询结果_MySQL数据库中常用查询函数简介

MYSQL中的常用函数count(*)---相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录。 select count(*) from yinxiong;Count(列名)表示统计此列当中总行数(不计算null所在的行)Count(distinct 列名&#xf…

属性值动态调整_这可能是你见过最牛的CAD粗糙度动态块了!

好课推荐:零基础CAD:点我CAD家装:点我 周站长CAD:点我CAD机械:点我revit教程:点我CAD建筑:点我CAD三维:点我全屋定制:点我 ps教程:点我苹果版CAD:点我 3dmax教…

mysql like_MySQL LIKE:模糊查询

在 MySQL 中,LIKE 关键字主要用于搜索匹配字段中的指定内容。其语法格式如下:[NOT] LIKE 字符串其中:NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。字符串:指定用来匹配的字符串。“字符串…

bootstrap mysql源码_Django+Bootstrap+Mysql 搭建个人博客 (六)

6.1.comments插件(1)安装pip install django-contrib-comments(02)settingsINSTALLED_APPS [django.contrib.sites,django_comments,]SITE_ID 1(3)website/urlurl(r^comments/, include(django_comments.urls)),(4)修改源码django_comments/abstracts.py第36行原代码site mode…

mysql 查看索引 命令_MySQL命令篇之库、表、索引、用户、视图及SELECT查询

大纲一、库管理二、表管理三、索引管理四、用户管理五、视图管理六、SELECT查询一、库管理(1)、创建数据库CREATE DATABASE db_name [CHARACTER SET [] charset_name] [COLLATE [] collation_name];mysql> CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET gbk COLLATE …

mysql 数据修改记录日志_mysql对数据的更新操作记录在哪个日志中?

mysql对数据的更新操作记录在通用查询日志和二进制日志中。通用查询日志用来记录用户的所有操作,包括启动和关闭 MySQL 服务、更新语句和查询语句等;二进制日志会以二进制的形式记录数据库的各种操作,但不记录查询语句。(推荐教程&#xff1a…

mysql insert 二进制_MYSQL 插入二进制数的 2 种方法。

方法 1、insert into TableName set column ;方法 2、insert into TableName .... values(.....);------------------------------------------------------------------------------------------------------------------------------------------create table T(x bit(8));方…

mysql jdbc 单利_java单利模式设计

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,…

vb 读取mysql所有表名_vb怎么列举出一个mdb数据库里面所有表名?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Private Sub Command1_Click()Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordset打开指定的服务器sql "ProviderSQLOLEDB.1;Persist Security InfoFalse;User IDfood;Password123456;Data Source192.168.1.251…

mysql行级锁升级_mysql innodb 行级锁升级

创建数据表test,表定义如下所示:CREATE TABLE test (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) NOT NULL,PRIMARY KEY (id),KEY idx_name (name)) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETlatin1;创建测试数据集,插入SQL语…

mysql触发器可以使用正则表达式,是否可以使用正则表达式在MySQL中强制执行数据检查...

Suppose I have an attribute called phone number and I would like to enforce certain validity on the entries to this field. Can I use regular expression for this purpose, since Regular Expression is very flexible at defining constraints.解决方案Yes, you can…