通过前面2节的学习也算是入门了,但是如果要做项目的话,那还很早!路漫漫其修远兮 吾将上下而求索……
继续学习,如果界面靠代码布局那未免有点太坑了,编写效率低,不直观( 其实duilib主打的界面制作方式是XML + UI引擎 + win32框架)。有人说android开发是用代码总局,不过人家那是为了适应多部屏幕,windows起码要好的多,你窗口800*600就定在那里了,不需要适配。而且直接拖放效率也是倍高儿不是?废话了一大堆赶紧进入正题,不然要扔板砖了……(其实也是让大家多了解一些)
前面的教程所使用的界面制作方式大家应该不算陌生,那么如果用XML来实现,会是什么样子呢?其实也是很简单的。
1、把if( uMsg == WM_CREATE ) 里面的代码改成下面这样:
Cpp源码:
继续学习,如果界面靠代码布局那未免有点太坑了,编写效率低,不直观( 其实duilib主打的界面制作方式是XML + UI引擎 + win32框架)。有人说android开发是用代码总局,不过人家那是为了适应多部屏幕,windows起码要好的多,你窗口800*600就定在那里了,不需要适配。而且直接拖放效率也是倍高儿不是?废话了一大堆赶紧进入正题,不然要扔板砖了……(其实也是让大家多了解一些)
前面的教程所使用的界面制作方式大家应该不算陌生,那么如果用XML来实现,会是什么样子呢?其实也是很简单的。
1、把if( uMsg == WM_CREATE ) 里面的代码改成下面这样:
if( uMsg == WM_CREATE )
{
m_PaintManager.Init(m_hWnd);
CDialogBuilder builder;
// duilib.xml需要放到exe目录下
CControlUI* pRoot = builder.Create(S("duilib.xml"), (UINT)0, NULL, &m_PaintManager);
ASSERT(pRoot && "Failed to parse XML");
m_PaintManager.AttachDialog(pRoot);
// 添加控件等消息响应,这样消息就会传达到duilib的消息循环,我们可以在Notify函数里做消息处理
m_PaintManager.AddNotifier(this);
return lRes;
} 2、设置XML的路径: 在CPaintManagerUI::SetInstance(hInstance); 下面调用SetResourcePath函数: CPaintManagerUI::SetInstance(hInstance); CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 设置资源的默认路径(此处设置为和exe在同一目录)3、建立XML: 新建一个XML,文件名为“duilib.xml”,保存为UTF-8格式(不要使用windows自带的记事本编辑,可以使用UltraEdit、EditPlus等编辑器),内容如下:
4、将"duilib.xml"放到exe目录下。 现在即可看到一个绿色的窗口,是不是也很简单呢。 那么我们继续来添加Hello World按钮吧~O(∩_∩)O~ 上面的XML只是描述了窗口的大小和背景色,但是并没有添加按钮,下面我们添加一个Hello 按钮,只需在XML里面添加一行即可:
运行效果和原来一样。

Cpp源码:
// MyApp.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "MyApp.h"
#define S(s) _T(s) //定义一个宏
class CDuiFrameWnd : public CWindowWnd, public INotifyUI
{
public:
virtual LPCTSTR GetWindowClassName() const { return S("DUIMainFrame"); }
virtual void Notify(TNotifyUI& msg)
{
//处理通知事件
if (msg.sType == S("click"))
{
if (msg.pSender->GetName() == S("test"))
{
MessageBox(NULL,S("Test"),NULL,MB_OK);
}
}
}
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//处理对应的消息
LRESULT lRes = 0;
if( uMsg == WM_CREATE )
{
m_PaintManager.Init(m_hWnd);
CDialogBuilder builder;
// duilib.xml需要放到exe目录下
CControlUI* pRoot = builder.Create(S("duilib.xml"), (UINT)0, NULL, &m_PaintManager);
ASSERT(pRoot && "Failed to parse XML");
m_PaintManager.AttachDialog(pRoot);
// 添加控件等消息响应,这样消息就会传达到duilib的消息循环,我们可以在Notify函数里做消息处理
m_PaintManager.AddNotifier(this);
return lRes;
}
// 以下3个消息WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT用于屏蔽系统标题栏
else if( uMsg == WM_NCACTIVATE )
{
if( !::IsIconic(m_hWnd) )
{
return (wParam == 0) ? TRUE : FALSE;
}
}
else if( uMsg == WM_NCCALCSIZE )
{
return 0;
}
else if( uMsg == WM_NCPAINT )
{
return 0;
}
if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) )
{
return lRes;
}
return __super::HandleMessage(uMsg, wParam, lParam);
}
protected:
CPaintManagerUI m_PaintManager;
};
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
CDuiFrameWnd duiFrame;
duiFrame.Create(NULL, S("DuiLib程序"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
duiFrame.CenterWindow();//居中显示
duiFrame.ShowModal();
return 0;
} 收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2313
- 用户1336
- 访客11757018
每日一句
Life is short; Live it!
人生苦短,活出精彩。
人生苦短,活出精彩。
信鸽推送报错NSObject checkTargetOtherLinkFlagForObjc
简单利用Clover四叶草安装U盘安装黑苹果
学习使用Java注解
OllyDbg中如何找出B模块中所有调用了A模块的C方法的地方
解决SSH客户端中文乱码
10年后,Android应用程序仍然比iOS应用程序差
C++11特性里面的thread
XPosed微信自动生成二维码
解决android studio "found an invalid color"的问题
T9社区注册方法【勼适様鲃女尔懟死】
Thinkpad x1 Extreme黑苹果10.14.5安装完成
基于大白主题增加图片本地化的功能
Linux系统查看CPU使用率的几个命令
新会员