DuiLib的第一个win32程序
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程序相关推荐
- 一个Win32程序的进化
作者:刘铁猛 日期:2005-12-13 关键字: Win32 API 入门 声明:如果阁下想转载,在转载的时候烦劳阁下连同在下的姓名一起转载,并向[email]bladey@tom.com[/ema ...
- win32c语言编程实例,实例分析一个简单的Win32程序
本文较为详细的分析了一个Win32程序的组成.结构.实现方法及运行原理,对于进行Windows程序设计有很好的借鉴参考价值.分享给大家供大家参考之用.具体分析如下: 一.Windows程序与普通C或C ...
- 为什么要学Win32及Win32程序框架
前言: 最近在看侯捷的<深入浅出MFC>,在理解MFC时觉得必须要掌握win32,才能更好的理解MFC,才能写出更有用的程序.于是将自己对win32程序的理解写了下来,供朋友们参考.文中的 ...
- 第一个Win32 SDK应用程序
#include<windows.h>int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);LRESULT WINAPI WndProc(HW ...
- 第一个 Win32 窗口程序
第一个 Win32 窗口程序 程序骨架 int WinMain(){ // 设计窗口外观及交互响应,注册,申请专利RegisterClass(...) ;// 生产窗口 CreateWindow(.. ...
- Win32 程序开发:一个简单的Win32程序
1)什么是Win32 Win32是指Microsoft Windows操作系统的32位环境,与Win64 都为Windows常见环境.如今的Win32操作系统可以一边听音乐,一边编程,一边打印文档.W ...
- 整个linux程序的框架,Linux兼容Win32程序,一个框架、两个界面
Linux兼容Win32程序,"一个框架.两个界面" Linux兼容Win32程序,"一个框架.两个界面" [日期:2007-07-19] 来源:Linux公社 ...
- win32的一个售票程序,收获有非常的多
先秀一下我的收获吧! 1.在创建非模态对话框的时,需要用到createdialog函数,第二个参数需要注意是填写对话框的资源标识符(id),之后需要调用showwindow来显示对话框:或者不这么做也 ...
- 我的第一个win32窗口程序------------记录
// Myday03.cpp : 定义应用程序的入口点. // #include "stdafx.h" #include "Myday03.h" int API ...
最新文章
- idea可以使用flash框架吗_这个框架厉害了,使用它几分钟就可以编写一个微信插件...
- Windows版 mysql 5.7.16安装
- matlab plot函数_慧图大讲堂 | 一起来认识MATLAB吧!
- 压缩感知(Compressive Sensing)学习之(一)
- 牛客练习赛26 E-树上路径 (树链剖分+线段树)
- b类 蚂蚁金服_股权设计与合伙制,解析蚂蚁金服与华为的顶层结构
- java maven 操作 收集的一些命令
- 行内块的巧妙运用(HTML、CSS)
- nginx 开机启动_4步配置Nginx + Keepalived + Havip,解决前端单点问题
- 用202种编程语言输出hello world,你会几种?(3)
- 碳排放权交易管理办法即将施行,你知道火电厂的碳排放是怎么算出来的吗?
- 七年级下册政治知识点总结
- c语言工业设计中的案例,工业设计中CMF为什么这么重要?看看设计案例就知道了!...
- outlook2007 有一个程序正试图以您的名义自动发送电子邮件
- 如何使用计算机还原魔方?
- [深度学习之CNN]CNN卷积神经网络LeNet-5
- Shopify卖家:EDM营销就要搭配SaleSmartly,轻松搞定转化率
- 油溶性InP/ZnS高亮绿光和红光PL490nm-750nm
- canoe 分析log_CANoe教程 | 分析功能-Trace窗口
- ReactDOM.render(...) 渲染方法