您的位置:首页 > 产品设计 > UI/UE

win32 DirectUI控件开发与调用指南

2012-03-23 07:54 309 查看


  相较于win32/mfc,directui(win32)更加轻量化,在开发方式上更加现代化,使得其在c++应用方面成为主流,官方中提到了可以开发控件(插件),也就是说新的库可以不写在dui里,而独立出来。研究了许久终于知道如何玩,故此总结一下:

一、创建Dui DLL控件库

  使用vc或vs创建一个win32 dll类型的项目,头文件PriceTableUI.h如下:

#pragma once

class DuiLib_API PriceTableUI : public CContainerUI//注意要导出类
{
public:
PriceTableUI();
~PriceTableUI();
LPCTSTR GetClass() const;
LPVOID GetInterface(LPCTSTR pstrName);
void DoEvent(TEventUI& event);
void PaintText(HDC hDC);
};


  对应的代码PriceTableUI.cpp如下:

#include "StdAfx.h"
#include "PriceTableUI.h"

PriceTableUI::PriceTableUI()
{

}

PriceTableUI::~PriceTableUI()
{

}

LPCTSTR PriceTableUI::GetClass() const
{
return _T("PriceTableUI");
}

LPVOID PriceTableUI::GetInterface( LPCTSTR pstrName )
{
if( _tcscmp(pstrName, _T("PriceTable")) == 0 )
return static_cast<PriceTableUI*>(this);

return CControlUI::GetInterface(pstrName);
}

void PriceTableUI::DoEvent( TEventUI& event )
{
if( event.Type == UIEVENT_SETFOCUS )
{
m_bFocused = true;
return;
}
if( event.Type == UIEVENT_KILLFOCUS )
{
m_bFocused = false;
return;
}
if( event.Type == UIEVENT_MOUSEENTER )//鼠标进入控件
{
return;
}
if( event.Type == UIEVENT_MOUSELEAVE )//鼠标离开控件
{
return;
}
//其它事件(消息)go to 到dui里自己看了
CControlUI::DoEvent(event);
}

void PriceTableUI::PaintText( HDC hDC )
{
RECT rect = m_rcPaint;

HBRUSH redHBrush =  CreateSolidBrush(RGB(255,0,0));

FillRect(hDC,&rect,redHBrush);
TextOut(hDC,rect.left,rect.top,"china mobile",strlen("china mobile"));
}


  为了简化,这个示例没有对基类函数进一步实现,有需求自行去dui库里复制过来或者自己扩展即可。

二、在主程序中定向自定义控件

  ControlEx.h如下:

#pragma once
#include "stdafx.h"

class CDialogBuilderCallbackEx : public IDialogBuilderCallback
{
public:
CControlUI* CreateControl(LPCTSTR pstrClass)
{
if( _tcscmp(pstrClass, "PriceTable") == 0 )
return new PriceTableUI;

return NULL;
}
};


三、调用控件

  如此,即可在dui的xml界面文件里使用<PriceTable />或在程序中调用,比如:

  PriceTableUI* table=static_cast<PriceTableUI*>(m_pm.FindControl("table1"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: