使用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;
- }
与往常一样,代码地址:http://download.csdn.net/detail/harvic880925/5367129
另附参考资料:《DUIlib编程总结.pdf》及源码 下载地址:http://download.csdn.net/detail/harvic880925/5367161
出错及处理:
一、IDropTarget* GetTxDropTarget();
提出错误:error C2143: 语法错误: 缺少“;”(在“*”的前面)
解决:添加头文件:#include "OLEIDL.h"
使用DUILIB建立项目的更多相关文章
- MVC5 网站开发实践 1、建立项目
目录 MVC5 网站开发实践 概述 一.建立项目 1.建立团队项目 在办公室和家里使用不同的电脑,为了方便代码的共享将项目建立为团队项目. 如图打开vs2013→新建→团队项目(图1),会自动 ...
- 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)
安卓(android)建立项目时失败.出现AndroidManifest.xml file missing几种解决方法?(总结中) Eclipse新建项目.遇到这种问题.注意例如以下: 1.文件名称最 ...
- 关于指针要注意的地方还有尝试在codeblocks上建立项目
1.字符串: char a[]="house"; char *b="house"; a[2]='r';可以 b[2]='r'不可以,因为这个指针变量指的是字 ...
- 关于QT建立项目中遇到的相关问题的处理办法
关于QT建立项目中遇到的相关问题的处理办法 1.在QTCreater中新建一个空的工程时,第一次运行会抱一个错误,如下: -1: error: LNK1123: 转换到 COFF 期间失败: 文件无效 ...
- SVN中建立项目
下午建个svn的时候,出错,有个东西配置错了,晚上google看到一篇文章,觉得作者写的不错,而且很用心,转来共享. [转至]5分钟快速建立项目版本控制 – Face Code,Brain bloom ...
- Flutter实战视频-移动电商-02.Flutter实战建立项目和编写入口文件
02.Flutter实战建立项目和编写入口文件 创建项目: flutter create flutter_shop 创建完成之后呢,它会提示我们, 进入flutter_shop的目录,然后执行flut ...
- cocos2d-x win8下的环境配置和建立项目
cocos2dx 跨平台.可是看网上说开发最合适还是在vs2010中,基本是编完后再移植到安卓. 1.去官网下载源代码2.2.3版本号的. 2.然后运行根文件夹下的build-win32.bat(须要 ...
- EF6 + MySql 建立项目引用失败
EF6 + MySql 建立项目 步骤 在项目中使用” NuGet” 包添加 EntityFramework 和 MySql.Data ,如下图 (1) 在NuGet界面中的“浏览”选项卡 ...
- ASP.NET Core 入门笔记2,建立项目
1.建立项目 2.项目结构 1.项目结构说明 根目录/文件 说明 .vscode目录 VS Code项目配置目录,相当于.vs..idea文件夹 bin目录 编译输出目录 obj目录 编译配置与中间目 ...
随机推荐
- 网页添加Live2D看板娘
看板娘简而言之就是小店的女服务生,也有“吸引顾客,招揽生意,提高人气”等作用类似品牌形象代言人的含义. 如果想放一个呆萌的看板娘在博客上 js <script type="text/j ...
- 22-Ubuntu-文件和目录命令-移动文件和目录-mv
mv 可以用来移动文件或目录,也可以给文件或目录重命名. 选项 含义 -i 覆盖文件前提示 1.移动文件和目录 1-1移动文件 例: 将当前目录下的123.txt文件移动到~/桌面/b/e目录下 mv ...
- 【ARC073F】Many Moves
题目 一个显然的\(dp\),设\(dp_{i,j}\)表示其中一个棋子在\(x_i\)点,另一个棋子在\(j\)点的最小花费 显然\(dp_{i,j}\)有两种转移 第一种是把\(x_i\)上的棋子 ...
- idea引入项目下所有文件(ps:包括静态文件夹)
打开项目的目录结构 点击finish 最后删除目录下多余的src就可以了
- Docker学习のDocker镜像
一.列出镜像 命令:docker images [optsions] [repositort] -a 标识列出所有 -f 写过滤条件 --no-trunc 不截断id -q 只显示唯一id rep ...
- 关于Excel的ctrl+方向键失效的解决方法
在Excel中按方向键,出现了类似滚动条的效果,即按下,表格就往下滚了一格.正常的情况应该是选中的单元格往下移动一格.其实这是一个很正常的情况,只要按一下Scroll Lock键就可以了,对于没有Sc ...
- String--->Double 不依赖地域性的转换
double.TryParse(icStr, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.Invar ...
- java 自加和短路问题 几个例子
x++可以看做一个独立的变量 如int a=x++;x的值先把他赋值给x++然后X++再赋值a,最后x再自加1 ++X int a=++ X 先自加1 x的值赋值给++x然后++x再赋值a ...
- 引用数据类型 Scanner Random
Scanner类 数据类型 变量名 = new 数据类型(); 每种引用数据类型都有其功能,我们可以调用该类型实例的功能. 变量名.方法名(); Scanner类是引用数据类型的一种,我们可以使 ...
- RabbitMQ 连接不上
问题 [org.springframework.amqp.AmqpIOException: java.io.IOException] 解决 username: guest password: gues ...