DuiLib主要用于创建一个漂亮的界面程序,界面的全部定义放到了xml文件中保存。程序加载xml文件中的内容就能够显示之前定义的界面。定义可以用DuiLib提供的一个工具UIDesigner.exe进行定义,如果你技术足够好的话也可以自己编写xml文件。

下面看一下用UIDesigner.exe定义的一个简单界面:

下面看一下在xml文件中定义形式:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>

<Window size="589,439" sizebox="4,4,6,6" caption="0,0,0,30">

<VerticalLayout name="VerticalLayoutUI1" text="第二个测试文本框" bkcolor="#FF0000FF" inset="1,1,1,1">

<HorizontalLayout name="HorizontalLayoutUI1" pos="0,0,0,68" height="68" bkimage="file='titlebar.png' fade='205'" inset="1,1,1,1">

<HorizontalLayout name="HorizontalLayoutUI2" pos="0,0,0,71" height="71">

<Label name="LabelUI1" text="第一个测试程序" float="true" pos="71,13,277,56" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" />

<Control name="ControlUI1" float="true" pos="9,7,60,59" bkimage="theworld.png" />

</HorizontalLayout>

<HorizontalLayout name="HorizontalLayoutUI3" pos="497,21,606,92" width="109" height="71">

<Button name="closeBtn" float="true" pos="74,4,108,29" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='title_close.png' dest='0,0,30,25' source='0,0,30,25'" hotimage="file='title_close2.png' dest='0,0,30,25' source='45,0,86,25'" />

<Button name="bigBtn" float="true" pos="40,4,74,29" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='title_max.png' dest='0,0,32,20' source='0,0,32,20'" hotimage="file='title_max.png' dest='0,0,32,20' source='35,0,65,20'" pushedimage="file='title_max.png' dest='0,0,32,20' source='32,0,63,20'" />

<Button name="restoreBtn" visible="false" float="true" pos="33,5,67,30" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='title_max2.png' dest='0,0,32,25' source='0,0,32,25'" hotimage="file='title_max2.png' dest='0,0,32,25' source='32,0,64,25'" pushedimage="file='title_max2.png' dest='0,0,32,25' source='64,0,96,25'" />

<Button name="minBtn" float="true" pos="3,3,37,28" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="file='title_min.png' dest='0,0,32,25' source='0,0,32,25'" hotimage="file='title_min.png' dest='0,0,32,25' source='64,0,96,25'" />

</HorizontalLayout>

</HorizontalLayout>

<VerticalLayout name="VerticalLayoutUI2" bkcolor="#FFFFFBF0">

<VerticalLayout name="VerticalLayoutUI3">

<VerticalLayout name="VerticalLayoutUI4">

<HorizontalLayout name="HorizontalLayoutUI5" pos="0,0,0,39" height="39" bkimage="titlebar.png" bkcolor="#FF0000FF" bkcolor2="#000000FF">

<Button name="ButtonUI1" text="硬件检测" float="true" pos="22,7,97,34" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="button_down.bmp" hotimage="button_nor.bmp" pushedimage="button_over.bmp" />

<Button name="ButtonUI2" text="木马查杀" float="true" pos="106,9,180,34" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" align="center" normalimage="button_down.bmp" hotimage="button_nor.bmp" pushedimage="button_over.bmp" />

</HorizontalLayout>

</VerticalLayout>

<HorizontalLayout name="HorizontalLayoutUI4" pos="0,208,0,261" height="53" bkimage="titlebar.png" />

</VerticalLayout>

</VerticalLayout>

</VerticalLayout>

</Window>

说明一下:DuiLib所制作的界面就仅仅是显示的界面,其中并没有包含任何的处理逻辑。所有的处理逻辑都在C++编写的代码中实现。所做的每一个界面都对应着一个类来和这个界面对应。在其中能够进行处理逻辑,比如说按钮的响应。

下面编写一个类和上面的界面对应,代码如下:

头文件:

class CMyFirstWnd : public CWindowWnd, public INotifyUI

{

public:

CMyFirstWnd();

//这个函数将被系统所调用

LPCTSTR GetWindowClassName() const;

//当窗口关闭的时候会调用这个函数

void OnFinalMessage(HWND hWnd);

//处理一些系统消息

LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);

//对窗口进行一些初始化工作

void Init();

// 前期的准备工作,在这里我什么都没做

void OnPrepare();

// 处理按钮消息

void Notify(TNotifyUI& msg);

// 屏蔽自带的系统关闭,最大化,最小化按钮。

LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

// 自定义的最大化,最小化,关闭按钮的图片切换

LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

public:

CPaintManagerUI m_pm;

};

下面看一下cpp文件中的实现代码:

#include "StdAfx.h"

#include "MyFirstWindow.h"

#include <exdisp.h>

#include <comdef.h>

CMyFirstWnd::CMyFirstWnd()

{

}

LPCTSTR CMyFirstWnd::GetWindowClassName() const

{

return _T("UIMainFrame");

}

void CMyFirstWnd::OnFinalMessage(HWND hWnd)

{

delete this;

}

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

{

if( uMsg == WM_CREATE )

{

m_pm.Init(m_hWnd);

CDialogBuilder builder;

CControlUI* pRoot = builder.Create(_T("testSkin.xml"), (UINT)0, NULL, &m_pm);

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

m_pm.AttachDialog(pRoot);

m_pm.AddNotifier(this);

Init();

return 0;

}

else if( uMsg == WM_ERASEBKGND )

{

return 1;

}

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;

}

else if (uMsg == WM_DESTROY)

{

PostQuitMessage(0);

}

else if (uMsg == WM_SYSCOMMAND)

{

BOOL bHandled = false;

return OnSysCommand(uMsg, wParam, lParam, bHandled);

}

if (uMsg == WM_NCHITTEST)

{

BOOL bHandled = false;

return OnNcHitTest(uMsg, wParam, lParam, bHandled);

}

LRESULT lRes = 0;

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

return lRes;

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

}

void CMyFirstWnd::Init()

{

}

void CMyFirstWnd::OnPrepare()

{

}

void CMyFirstWnd::Notify(TNotifyUI& msg)

{

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

OnPrepare();

else if( msg.sType == _T("click") )

{

if(msg.pSender->GetName() == _T("closeBtn"))

{

PostQuitMessage(0);

}

else if (msg.pSender->GetName() == _T("bigBtn"))

{

PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);

}

else if (msg.pSender->GetName() == _T("restoreBtn"))

{

PostMessage(WM_SYSCOMMAND, SC_RESTORE, 0);

}

else if (msg.pSender->GetName() == _T("minBtn"))

{

PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);

}

}

}

LRESULT CMyFirstWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)

{

POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam);

::ScreenToClient(*this, &pt);

RECT rcClient;

::GetClientRect(*this, &rcClient);

RECT rcCaption = m_pm.GetCaptionRect();

if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \

&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) {

CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));

if( pControl && _tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0 &&

_tcscmp(pControl->GetClass(), _T("OptionUI")) != 0 &&

_tcscmp(pControl->GetClass(), _T("TextUI")) != 0 )

return HTCAPTION;

}

return HTCLIENT;

}

LRESULT CMyFirstWnd::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)

{

// 有时会在收到WM_NCDESTROY后收到wParam为SC_CLOSE的WM_SYSCOMMAND

if( wParam == SC_CLOSE ) {

::PostQuitMessage(0L);

bHandled = TRUE;

return 0;

}

BOOL bZoomed = ::IsZoomed(*this);

LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);

if( ::IsZoomed(*this) != bZoomed ) {

if( !bZoomed ) {

CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(_T("bigBtn")));

if( pControl )

pControl->SetVisible(false);

pControl = static_cast<CControlUI*>(m_pm.FindControl(_T("restoreBtn")));

if( pControl )

pControl->SetVisible(true);

}

else {

CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(_T("bigBtn")));

if( pControl ) pControl->SetVisible(true);

pControl = static_cast<CControlUI*>(m_pm.FindControl(_T("restoreBtn")));

if( pControl ) pControl->SetVisible(false);

}

}

return lRes;

}

下面实在main函数中的编写方式:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
{
 CPaintManagerUI::SetInstance(hInstance);
 CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());

HRESULT Hr = ::CoInitialize(NULL);
 if(FAILED(Hr))
  return 0;
 CMyFirstWnd* pFrame = new CMyFirstWnd();
 if( pFrame == NULL ) return 0;
 pFrame->Create(NULL, _T("我的第一个DUILIB程序"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
 pFrame->CenterWindow();
 pFrame->ShowWindow(true);
 CPaintManagerUI::MessageLoop();

::CoUninitialize();
 return 0;
}

这样一个程序窗口就能够显示出来了。如下图所示:

一个界面就完成了。你也试一试吧!!!!!



DuiLib的第一个win32程序相关推荐

  1. 一个Win32程序的进化

    作者:刘铁猛 日期:2005-12-13 关键字: Win32 API 入门 声明:如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向[email]bladey@tom.com[/ema ...

  2. win32c语言编程实例,实例分析一个简单的Win32程序

    本文较为详细的分析了一个Win32程序的组成.结构.实现方法及运行原理,对于进行Windows程序设计有很好的借鉴参考价值.分享给大家供大家参考之用.具体分析如下: 一.Windows程序与普通C或C ...

  3. 为什么要学Win32及Win32程序框架

    前言: 最近在看侯捷的<深入浅出MFC>,在理解MFC时觉得必须要掌握win32,才能更好的理解MFC,才能写出更有用的程序.于是将自己对win32程序的理解写了下来,供朋友们参考.文中的 ...

  4. 第一个Win32 SDK应用程序

    #include<windows.h>int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);LRESULT WINAPI WndProc(HW ...

  5. 第一个 Win32 窗口程序

    第一个 Win32 窗口程序 程序骨架 int WinMain(){ // 设计窗口外观及交互响应,注册,申请专利RegisterClass(...) ;// 生产窗口 CreateWindow(.. ...

  6. Win32 程序开发:一个简单的Win32程序

    1)什么是Win32 Win32是指Microsoft Windows操作系统的32位环境,与Win64 都为Windows常见环境.如今的Win32操作系统可以一边听音乐,一边编程,一边打印文档.W ...

  7. 整个linux程序的框架,Linux兼容Win32程序,一个框架、两个界面

    Linux兼容Win32程序,"一个框架.两个界面" Linux兼容Win32程序,"一个框架.两个界面" [日期:2007-07-19] 来源:Linux公社 ...

  8. win32的一个售票程序,收获有非常的多

    先秀一下我的收获吧! 1.在创建非模态对话框的时,需要用到createdialog函数,第二个参数需要注意是填写对话框的资源标识符(id),之后需要调用showwindow来显示对话框:或者不这么做也 ...

  9. 我的第一个win32窗口程序------------记录

    // Myday03.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "Myday03.h" int API ...

最新文章

  1. idea可以使用flash框架吗_这个框架厉害了,使用它几分钟就可以编写一个微信插件...
  2. Windows版 mysql 5.7.16安装
  3. matlab plot函数_慧图大讲堂 | 一起来认识MATLAB吧!
  4. 压缩感知(Compressive Sensing)学习之(一)
  5. 牛客练习赛26 E-树上路径 (树链剖分+线段树)
  6. b类 蚂蚁金服_股权设计与合伙制,解析蚂蚁金服与华为的顶层结构
  7. java maven 操作 收集的一些命令
  8. 行内块的巧妙运用(HTML、CSS)
  9. nginx 开机启动_4步配置Nginx + Keepalived + Havip,解决前端单点问题
  10. 用202种编程语言输出hello world,你会几种?(3)
  11. 碳排放权交易管理办法即将施行,你知道火电厂的碳排放是怎么算出来的吗?
  12. 七年级下册政治知识点总结
  13. c语言工业设计中的案例,工业设计中CMF为什么这么重要?看看设计案例就知道了!...
  14. outlook2007 有一个程序正试图以您的名义自动发送电子邮件
  15. 如何使用计算机还原魔方?
  16. [深度学习之CNN]CNN卷积神经网络LeNet-5
  17. Shopify卖家:EDM营销就要搭配SaleSmartly,轻松搞定转化率
  18. 油溶性InP/ZnS高亮绿光和红光PL490nm-750nm
  19. canoe 分析log_CANoe教程 | 分析功能-Trace窗口
  20. ReactDOM.render(...) 渲染方法

热门文章

  1. zabbix搭建详细全过程,以及遇到的问题
  2. 【CSAPP】家庭作业2.55~2.76
  3. linux如何安装vi命令,Ubuntu 16.04 下 Vim安装及配置
  4. java 线框图,你知道线框图和原型有啥区别吗
  5. a50交割日时间表2021(a50三大主要功能)
  6. 娱乐明星为何纷纷入局元宇宙?
  7. 人脸检测(dlib和opencv)
  8. 【总结】放电管知识大全,看过这篇你都了解了
  9. android 空间动态,Android手机QQ空间新版:玩转GIF动态说说
  10. (转)反汇编算法介绍和应用——线性扫描算法分析