#pragma once
#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 class CDuiFrameWnd : public CWindowWnd, public INotifyUI
{
public:
virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
virtual void Notify(TNotifyUI& msg)
{
if (msg.sType == _T("click"))
{
if (msg.pSender->GetName() == _T("btnHello"))
{
::MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL);
}
}
} virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRes = ; if (uMsg == WM_CREATE)
{
// 方法1
//CControlUI *pWnd = new CButtonUI;
//pWnd->SetName(_T("btnHello")); // 控件的唯一标识
//pWnd->SetText(_T("Hello World")); // 设置文字
//pWnd->SetBkColor(0xFF00FF00); // 设置背景色 //m_PaintManager.Init(m_hWnd);
//m_PaintManager.AttachDialog(pWnd); //m_PaintManager.AddNotifier(this); // 添加控件响应消息,这样消息就会达到duilib的消息循环 // 方法2
m_PaintManager.Init(m_hWnd); CDialogBuilder builder;
CControlUI *pRoot = builder.Create(_T("duilib.xml"), NULL, NULL, &m_PaintManager, NULL);
ASSERT(pRoot && "Failed to parse XML"); m_PaintManager.AttachDialog(pRoot);
m_PaintManager.AddNotifier(this);
return lRes;
}
// 以下三个消息用于屏蔽系统标题栏
// WM_NCACTIVETE WM_NCCALCSIZE WM_NCPAINT
else if (uMsg == WM_NCACTIVATE)
{
if (!::IsIconic(m_hWnd))
{
return (wParam == ) ? TRUE : FALSE;
}
}
else if (uMsg == WM_NCCALCSIZE)
{
return ;
}
else if (uMsg == WM_NCPAINT)
{
return ;
} if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes))
{
return lRes;
} return __super::HandleMessage(uMsg, wParam, lParam);
} protected:
CPaintManagerUI m_PaintManager;
}; class CDuiXmlFrameWnd : public WindowImplBase
{
public:
// 实现以下三个纯虚函数
virtual LPCTSTR GetWindowClassName()const { return _T("DUIMainFrame"); }
virtual CDuiString GetSkinFile(){ return _T("duilib.xml"); }
virtual CDuiString GetSkinFolder(){ return _T(""); } // 将事件添加到消息队列
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRes = ; if (uMsg == WM_CREATE)
{
// 方法1
//CControlUI *pWnd = new CButtonUI;
//pWnd->SetName(_T("btnHello")); // 控件的唯一标识
//pWnd->SetText(_T("Hello World")); // 设置文字
//pWnd->SetBkColor(0xFF00FF00); // 设置背景色 //m_PaintManager.Init(m_hWnd);
//m_PaintManager.AttachDialog(pWnd); //m_PaintManager.AddNotifier(this); // 添加控件响应消息,这样消息就会达到duilib的消息循环 // 方法2
m_PaintManager.Init(m_hWnd); CDialogBuilder builder;
CControlUI *pRoot = builder.Create(_T("duilib.xml"), NULL, NULL, &m_PaintManager, NULL);
ASSERT(pRoot && "Failed to parse XML"); m_PaintManager.AttachDialog(pRoot);
m_PaintManager.AddNotifier(this);
return lRes;
}
// 以下三个消息用于屏蔽系统标题栏
// WM_NCACTIVETE WM_NCCALCSIZE WM_NCPAINT
else if (uMsg == WM_NCACTIVATE)
{
if (!::IsIconic(m_hWnd))
{
return (wParam == ) ? TRUE : FALSE;
}
}
else if (uMsg == WM_NCCALCSIZE)
{
return ;
}
else if (uMsg == WM_NCPAINT)
{
return ;
} if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes))
{
return lRes;
} return __super::HandleMessage(uMsg, wParam, lParam);
} // 实现控件响应事件
virtual void Notify(TNotifyUI& msg)
{
if (msg.pSender->GetName() == _T("editHello"))
{
// 获取控件对象方法
CEditUI *pEdit = static_cast<CEditUI *>(m_PaintManager.FindControl(_T("editHello")));
}
// 处理控件响应事件
if (msg.sType == _T("click"))
{
if (msg.pSender->GetName() == _T("btnHello"))
{
::MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL); // 人为修改控件焦点
CEditUI *pEdit2 = static_cast<CEditUI *>(m_PaintManager.FindControl(_T("editWorld")));
m_PaintManager.SetFocus(pEdit2, TRUE);
}
}
}
}; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
// 实例句柄与渲染类关联
CPaintManagerUI::SetInstance(hInstance); // 设置资源的默认路径(设置和exe在同一个目录)
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); /*CDuiFrameWnd duiFrame;
duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
duiFrame.CenterWindow();
duiFrame.ShowModal();*/ // 方法2
CDuiXmlFrameWnd duixmlFrame;
duixmlFrame.Create(NULL, _T("DuiWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
duixmlFrame.CenterWindow();
duixmlFrame.ShowModal(); return ;
}

Duilib学习(一)的更多相关文章

  1. DuiLib学习笔记(二) 扩展CScrollbar属性

    DuiLib学习笔记(二) 扩展CScrollbar属性 Duilib的滚动条滑块默认最小值为滚动条的高度(HScrollbar)或者宽度(VScrollbar).并且这个值默认为16.当采用系统样式 ...

  2. Duilib学习笔记《06》— 窗体基类WindowImpBase

    在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...

  3. Duilib学习笔记《05》— 消息响应处理

    在Duilib学习笔记<04>中已经知道了如何将窗体显示出来,而如何处理窗体上的事件.消息呢? 一. 系统消息 窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的 ...

  4. Duilib学习笔记《04》— 窗体显示

    在前面已经了解了duilib控件以及界面布局相关内容,接下来就要考虑该如何将xml中描述的布局通过界面展现出来.实际上在 Duilib学习笔记<01> 中我们已经简单提到过基本的流程及元素 ...

  5. Duilib学习笔记《03》— 控件使用

    在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...

  6. duilib学习 --- 360demo 学习

    我想通过360demo的学习,大概就能把握duilib的一般用法,同时引申出一些普遍问题,和普遍解决方法.并在此分享一些链接和更多内容的深入学习..... 原谅我是一个菜鸟,什么都想知道得清清楚楚.. ...

  7. DuiLib学习笔记5——标题栏不能正常隐藏问题

    我之前代码都是照着官方那个Duilib入门文档.doc来学习的.但是遇到一个问题,虽然他隐藏了windows的自带标题栏,可以自己绘画一个标题栏了,但是在这个标题栏下方,用力乱戳,就可能把系统自带的, ...

  8. Duilib学习笔记《07》— 资源加载

    Duilib的界面表现力能如此丰富,很大程度上得益于贴图描述的简单强大.通过之前的学习及参看相关例子,我们可以发现,在XML布局文件中,不管是窗体背景还是控件,都添加了对应的图片资源以此来美化界面.而 ...

  9. Duilib学习笔记《02》— 界面布局

    1. 界面描述XML文件 Duilib主要是通过XML来进行界面的布局配置,程序通过读取并解析XML文件来创建对应的窗体.DuiLib的页面布局分为三类:窗体(Window).容器(Contain)和 ...

  10. Duilib学习笔记《01》— duilib整体框架认识

    从GoogleCode上下载的duilib工程中附带的一副总体设计图(如下所示),可以先整体了解一下,有个初步的认识,对后续进一步深入了解学习会很有帮助. 通过设计图有了一个初步认识后,接下来开始进一 ...

随机推荐

  1. Python使用Tabula提取PDF表格数据

    今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...

  2. Windows下phpStudy配置独立站点详细步骤

    本文讲如何在phpStudy下配置 域名->站点 步骤. 开始之前,我们先添加几个本地域名(host文件),如果有域名映射到主机此步可以跳过,直接看后面的phpStudy配置部分. 首先打开ho ...

  3. Java学习笔记1(HelloWorld)

    编写HelloWorld是一种仪式: 1.下载JDK,安装,注意路径中不要存在中文. 2.添加环境变量,加入bin目录 3.写一个文本,内容如下,后缀改成.java,注意文本的名称为HelloWorl ...

  4. python3函数

    一.python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.可以自己创建函数,这被叫做用户自定义函数. 1.定义函数规则 函 ...

  5. 谈谈关键字new

    1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........ 程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部 ...

  6. codechef [snackdown2017 Onsite Final] Minimax

    传送门 题目描述 考虑一个 N 行 N 列的网格,行列编号均为 1 ∼ N.每个格子中包含一个整数.记 ri 为第 i 行的最小值,Ci 为第 i 列的最大值.我们称一个网格为好的,当且仅当满足:$$ ...

  7. 【JAVA】hashcode() & equals()

    平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现.近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识. 上简单示例代码 ...

  8. ES6中promise的使用方法

    先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...

  9. JavaScript八张思维导图—数组用法

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  10. Java多线程编程—锁优化

    并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问.加锁会带来性能上的损坏,似乎是众所周知的事情.然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程.如 ...