zoukankan      html  css  js  c++  java
  • win32 DirectUI控件开发与调用指南

      相较于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"));

  • 相关阅读:
    003 Leaflet 第三个demo 地图上的面积测量
    002 Leaflet 第二个demo 地图上的矩形拉框选择
    001 Leaflet 第一个demo 加载天地图
    This关键字,打印花瓣的数量
    Myeclipse8.5 添加Tomcat7
    WGS84经纬度 与 web 墨卡托相互转化 工具类
    java list集合去重复
    response 下载文件
    jquery实现可拖拽的div
    linux 前端环境搭建
  • 原文地址:https://www.cnblogs.com/chuncn/p/2413082.html
Copyright © 2011-2022 走看看