刚开始建这个项目的时候编译器报了很多Link2019的错误。

后来添加了一些lib文件才解决,参考    缺少.lib文件导致的Link2019 解决方案汇总

============================================================================================================================

Dialog::InitDefaultElements()

创建各种Element(元素,组成Control的单元),放到CDXUTElementHolder类型的Dialog::m_DefaultElements中.

 struct DXUTElementHolder
{
UINT nControlType;
UINT iElement; CDXUTElement Element;
};

m_DefaultElements存放的ElementHolder根据所属控件的类型(nControlType)从小到大(0开始)编号

 //-------------------------------------
// CDXUTButton - Button
//-------------------------------------
SetRect( &rcTexture, , , , );
Element.SetTexture( , &rcTexture );
Element.SetFont( );
Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB( , , , );
Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( , , , );
Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( , , , ); // Assign the Element
SetDefaultElement( DXUT_CONTROL_BUTTON, , &Element ); //-------------------------------------
// CDXUTButton - Fill layer
//-------------------------------------
SetRect( &rcTexture, , , , );
Element.SetTexture( , &rcTexture, D3DCOLOR_ARGB( , , , ) );
Element.TextureColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB( , , , );
Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB( , , , );
Element.TextureColor.States[ DXUT_STATE_FOCUS ] = D3DCOLOR_ARGB( , , , ); // Assign the Element
SetDefaultElement( DXUT_CONTROL_BUTTON, , &Element );

这段代码定义了两个Button类型的Element,编号为0和1。

如果继续添加的话编号递增。

添加另一种类型的话,编号重新从零开始。

===================================================================================================================

CDXUTControl::SetElement
 HRESULT CDXUTControl::SetElement( UINT iElement, CDXUTElement* pElement )
{
HRESULT hr = S_OK; if( pElement == NULL )
return E_INVALIDARG; //m_DefaultElements中的元素同类型编号按从小到大的顺序排列
//所以从m_DefaultElements中挑选出来的pElement的编号iElement递增(0,1,2.....)
//某一种控件第一次调用此函数(SetElement)时,控件的m_Elements为空,将编号为0的Element存入,循环退出
// Make certain the array is this large
for( UINT i = m_Elements.GetSize(); i <= iElement; i++ )
{
CDXUTElement* pNewElement = new CDXUTElement();
if( pNewElement == NULL )
return E_OUTOFMEMORY; hr = m_Elements.Add( pNewElement );
if( FAILED( hr ) )
{
SAFE_DELETE( pNewElement );
return hr;
}
} // Update the data
CDXUTElement* pCurElement = m_Elements.GetAt( iElement );
*pCurElement = *pElement; return S_OK;
}

===================================================================================================

Element的定义如下

 class CDXUTElement
{
public:
void SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor = D3DCOLOR_ARGB( , , ,
) );
void SetFont( UINT iFont, D3DCOLOR defaultFontColor = D3DCOLOR_ARGB( , , ,
), DWORD dwTextFormat = DT_CENTER |
DT_VCENTER ); void Refresh();
  //纹理, 文本字体, 文本格式,
UINT iTexture; // Index of the texture for this Element
UINT iFont; // Index of the font for this Element
DWORD dwTextFormat; // The format argument to DrawText
  // 放纹理的边界矩形
RECT rcTexture; // Bounding rect of this element on the composite texture
  //纹理和文本的Blend颜色, Blend分量用于控制透明度
DXUTBlendColor TextureColor;
DXUTBlendColor FontColor;
};

======================================================================================================

可以使用输入法(Input Method Editor)的IMEEditBox

 //已经定义了g_SampleUI
CDXUTDialog g_SampleUI; // dialog for sample specific controls
g_SampleUI.Init( &g_DialogResourceManager );
g_SampleUI.SetCallback( OnGUIEvent );
// IME-enabled edit box
CDXUTIMEEditBox* pIMEEdit;
CDXUTIMEEditBox::InitDefaultElements( &g_SampleUI );
if( SUCCEEDED( CDXUTIMEEditBox::CreateIMEEditBox( &g_SampleUI, IDC_EDITBOX2,
L"IME-capable edit control with custom styles. Type and press Enter", , , , , false, &pIMEEdit ) ) )
{
g_SampleUI.AddControl( pIMEEdit );
pIMEEdit->GetElement( )->iFont = ;
pIMEEdit->GetElement( )->iFont = ;
pIMEEdit->GetElement( )->iFont = ;
pIMEEdit->GetElement( )->TextureColor.Init( D3DCOLOR_ARGB( , , , ) ); // Transparent center
pIMEEdit->SetBorderWidth( );
pIMEEdit->SetTextColor( D3DCOLOR_ARGB( , , , ) );
pIMEEdit->SetCaretColor( D3DCOLOR_ARGB( , , , ) );
pIMEEdit->SetSelectedTextColor( D3DCOLOR_ARGB( , , , ) );
pIMEEdit->SetSelectedBackColor( D3DCOLOR_ARGB( , , , ) );
}

CDXUTIMEEditBox继承自CDXUTEditBox, 定义在DXUTguiIME.h/cpp文件中

包含了静态函数:

static void             InitDefaultElements( CDXUTDialog* pDialog );

负责为该类定义所使用的Element(元素),并通过

HRESULT CDXUTDialog::SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement );

添加到所属Dialog的默认元素表(m_DefaultElements)中,  一共9个Element

Please refer to DXUTguiIME.h/cpp  for more details  .

=-=========================================================================================================================

单选列表框                                                     多选列表框

                           

 class CDXUTListBox : public CDXUTControl
{
public:
CDXUTListBox( CDXUTDialog* pDialog = NULL );
virtual ~CDXUTListBox();
.
.
.
.//member function skipped
.
. protected:
RECT m_rcText; // Text rendering bound
RECT m_rcSelection; // Selection box bound
CDXUTScrollBar m_ScrollBar;
int m_nSBWidth;
int m_nBorder;
int m_nMargin;
int m_nTextHeight; // Height of a single line of text
DWORD m_dwStyle; // List box style
int m_nSelected; // Index of the selected item for single selection list box
int m_nSelStart; // Index of the item where selection starts (for handling multi-selection)
bool m_bDrag; // Whether the user is dragging the mouse to select CGrowableArray <DXUTListBoxItem*> m_Items;
};
CDXUTListBox成员里的两个类型
CDXUTScrollBar m_ScrollBar; 滚动条定义如下
 class CDXUTScrollBar : public CDXUTControl
{
public:
CDXUTScrollBar( CDXUTDialog* pDialog = NULL );
virtual ~CDXUTScrollBar();
.
.
. //member functions skipped
.
.
. protected:
// ARROWSTATE indicates the state of the arrow buttons.
// CLEAR No arrow is down.
// CLICKED_UP Up arrow is clicked.
// CLICKED_DOWN Down arrow is clicked.
// HELD_UP Up arrow is held down for sustained period.
// HELD_DOWN Down arrow is held down for sustained period.
enum ARROWSTATE
{
CLEAR,
CLICKED_UP,
CLICKED_DOWN,
HELD_UP,
HELD_DOWN
}; void UpdateThumbRect();
void Cap(); // Clips position at boundaries. Ensures it stays within legal range. bool m_bShowThumb;
bool m_bDrag;
RECT m_rcUpButton;
RECT m_rcDownButton;
RECT m_rcTrack;
RECT m_rcThumb;
int m_nPosition; // Position of the first displayed item
int m_nPageSize; // How many items are displayable in one page
int m_nStart; // First item
int m_nEnd; // The index after the last item
POINT m_LastMouse;// Last mouse position
ARROWSTATE m_Arrow; // State of the arrows
double m_dArrowTS; // Timestamp of last arrow event.
};
CGrowableArray <DXUTListBoxItem*> m_Items  选项的类型如下
1 struct DXUTListBoxItem
2 {
3 WCHAR strText[256];
4 void* pData;
5
6 RECT rcActive;
7 bool bSelected;
8 };
CGrowableArray解析

CustomUI Direct3D9_Sample的更多相关文章

  1. Excel-DNA项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【C#版】

    Excel-DNA项目中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在Class1.cs这个默认文件中. 大家可以在Visual Studi ...

  2. Excel-DNA项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【VB.Net版】

    Excel-DNA项目中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在Class1.vb这个默认文件中. 大家可以在Visual Studi ...

  3. VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【C#版】

    VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.cs这个默认文件中. 大家可以在Visual Studio中创建 ...

  4. VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【VB.Net版】

    VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.vb这个默认文件中. 大家可以在Visual Studio中创建 ...

  5. Office customUI中如何动态更新控件标题和图标?

    本例,在Excel右键菜单中创建一个按钮,按钮的标题使用getLabel动态获取,图标使用getImage动态获取. customUI XML代码: <customUI xmlns=" ...

  6. 缺少.lib文件导致的Link2019 解决方案汇总

    环境Vs2015,  Win10 添加lib的方法在末尾 下面的错误都是我在写Direct3D程序中遇到的, 记下来方便查找 4.ws2_32.lib 3.   version.lib _GetFil ...

  7. Xcode8开发iOS10推送通知过程

    iOS10发布后,简书优先开发增加了iOS10的新通知.本文分享整个feature的开发过程遇到的问题. 1.工程配置 Xcode8发生了很大的变化,直接打开原来的工程编译运行,这个时候是获取不到Pu ...

  8. 如何使用.NET开发全版本支持的Outlook插件产品(四)——进阶探讨

    插件项目所有代码都已经上传至 https://github.com/VanPan/TestOutlookAdding 如何定制Ribbon在不同界面的显示 实际使用过程中出现的问题 这个问题的来自十分 ...

  9. 如何使用.NET开发全版本支持的Outlook插件产品(二)——完善插件

    插件项目所有代码都已经上传至 https://github.com/VanPan/TestOutlookAdding 勿在浮砂筑高台--定位错误 在介绍后面的插件开发技术之前,让我们先来看看已经达到的 ...

随机推荐

  1. D3.js学习(一)

    从今天开始我将和大家一起学习D3.js(Data-Driven Documents),由于国内关于D3的学习资料少之又少,所以我觉得很有必要把自己学习过程记录下来,供同学们参考,如果文章有有哪些表达有 ...

  2. 分布式session的实现

    一.分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统3.基于memcached 的session,如何保证 memcached 本身的高可用性?4. ...

  3. 几个常用的Linux命令

    最近在学习Linux,记录了几个命令如下: 首先认识:关机命令,我喜欢用的是:shutdown -h now ,当然还有init 0等命令(用自己习惯的);重启命令:reboot;注销命令:logou ...

  4. bzoj4349: 最小树形图

    最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...

  5. Windows 10(64位)配置Caffe运行环境的基本流程

    最新博客地址已搬家到: http://blog.csdn.net/zzlyw/article/details/53215148

  6. flask源码分析

    本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...

  7. Oracle的SQL语句中的变量替换

    一.问题描述 如下SQL: INSERT INTO tmp(val)VALUES('a&b'); 执行过程中会出现如下提示: 点击"确定"过后我们查看表中的数据: b后面的 ...

  8. Xcode 属性面板添加自定义控件属性

    让自定义控件像原生控件一样可以在属性面板配置参数,Apple文档传送 直接上效果图,根据

  9. 设计模式--桥接模式Bridge(结构型)

    一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...

  10. iOS 内存管理

    一 . 内存管理 包括内存分配 和 内存清除 1.内存管理的范围 :人和继承于NSObject类的对象都需要进行内存管理,任何非对象类型的对象(基本数据类型 如 int char float doub ...