刚开始建这个项目的时候编译器报了很多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. 简单的C语言文法

    <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...

  2. 页面解耦—— 统跳协议和Rewrite引擎

    原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...

  3. 整理文件,翻出了以前作的ps稿 (^o^)c旦``

    稍稍会那么一点PS,小意思   

  4. 53. 特殊的O(n)时间排序[sort ages with hashtable]

    [本文链接] http://www.cnblogs.com/hellogiser/p/sort-ages-with-hashtable.html [题目] 某公司有几万名员工,请完成一个时间复杂度为O ...

  5. java性能调优及问题追踪--Btrace的使用

    在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方式,在不修改 ...

  6. Android导包导致java.lang.NoClassDefFoundError

    摘要: SDK方法总数是不能超过65k的.是否也引入其他的三方库,导致总数超过限制.超出限制会导致部分class找不到,引发java.lang.NoClassDefFoundError.解决方法:近日 ...

  7. swift 3.0 协议笔记

    协议能够要求遵循者必须含有一些特定名称和类型的实例属性(instance property)或类属性(type property),也能够要求属性的(设置权限)settable 和(访问权限)gett ...

  8. 在input中放对象

    var input = $("<input type='hidden' class='hidden-user'/>"); $(input).data("ran ...

  9. 建表and新增删除数据A

    SELECT*FROM 表名:查询表 新建数据库: select 文件名(可以很多被查询的文件名)from 文件名 创建student表  CREATE TABLE `student`  ( `id` ...

  10. js获取cookie

    js获取cookie 之前用jQuery.cookie来获取cookie,虽然简单,但是项目上又多引用了一个插件,总觉得不太好,下面是我封装的js原生获取cookie的函数. function get ...