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"));

  • 相关阅读:
    or具体点vc
    异常 中断 实现
    int 0x80 系统调用实现
    方便查看 linux/kernel/sched.c
    第五周课堂笔记1th
    第四周课堂笔记4th
    第四周课堂笔记3th
    第四周课堂笔记2th
    第四周课堂笔记1th
    第三周课堂笔记4thand5th
  • 原文地址:https://www.cnblogs.com/chuncn/p/2413082.html
Copyright © 2011-2022 走看看