CustomUI Direct3D9_Sample
刚开始建这个项目的时候编译器报了很多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的更多相关文章
- Excel-DNA项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【C#版】
Excel-DNA项目中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在Class1.cs这个默认文件中. 大家可以在Visual Studi ...
- Excel-DNA项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【VB.Net版】
Excel-DNA项目中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在Class1.vb这个默认文件中. 大家可以在Visual Studi ...
- VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【C#版】
VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.cs这个默认文件中. 大家可以在Visual Studio中创建 ...
- VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【VB.Net版】
VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.vb这个默认文件中. 大家可以在Visual Studio中创建 ...
- Office customUI中如何动态更新控件标题和图标?
本例,在Excel右键菜单中创建一个按钮,按钮的标题使用getLabel动态获取,图标使用getImage动态获取. customUI XML代码: <customUI xmlns=" ...
- 缺少.lib文件导致的Link2019 解决方案汇总
环境Vs2015, Win10 添加lib的方法在末尾 下面的错误都是我在写Direct3D程序中遇到的, 记下来方便查找 4.ws2_32.lib 3. version.lib _GetFil ...
- Xcode8开发iOS10推送通知过程
iOS10发布后,简书优先开发增加了iOS10的新通知.本文分享整个feature的开发过程遇到的问题. 1.工程配置 Xcode8发生了很大的变化,直接打开原来的工程编译运行,这个时候是获取不到Pu ...
- 如何使用.NET开发全版本支持的Outlook插件产品(四)——进阶探讨
插件项目所有代码都已经上传至 https://github.com/VanPan/TestOutlookAdding 如何定制Ribbon在不同界面的显示 实际使用过程中出现的问题 这个问题的来自十分 ...
- 如何使用.NET开发全版本支持的Outlook插件产品(二)——完善插件
插件项目所有代码都已经上传至 https://github.com/VanPan/TestOutlookAdding 勿在浮砂筑高台--定位错误 在介绍后面的插件开发技术之前,让我们先来看看已经达到的 ...
随机推荐
- windows安装zookeeper-单机模式
zookeeper下载地址:http://zookeeper.apache.org/releases.html#download 本次使用的是3.4.9版本 前提:请安装JDK 安装: 创建安装目 ...
- Javascript权威指南学习笔记
第二章:词法结构 ;function a(){alert(2)};//前面的分号保证正确地语句解析 第三章:类型.值和变量 基本概念: 1.数据类型---能够表示并操作的值的类型叫做数据类型. 2.变 ...
- Archlinux安装MySQL5.7.14压缩包版
现在Arch官方源里是MariaDB,MySQL扔到AUR里去了...感觉还是自己安装好些... (参考资料:度娘.官方文档) 贴配置: lts版的 在Vbox虚拟机测试 按照官方文档的安装步骤: 创 ...
- PPM图片格式及其C读写代码
PPM图像格式介绍 PPM图像格式是由Jef Poskanzer 大叔,在我出生那一年,也就是1991年所创造的,碰巧的是PPM也是天蝎座. PPM(Portable Pixmap Format)还有 ...
- How to see the "real" available resources ?
Hi, Hope this will help you : nova hypervisor-stats It will return the statistics of the Hypervisor ...
- DevExpress GridControl 选择整行被选单元格不变色的设置
设置GridControl 里面的 gridview 属性, 找到OptionSelection 将EnableAppearanceFocusedCell 属性设置False 就可以了 此方式同样适用 ...
- 关于VPN的一些问题
在今在外出差,必须得连上公司的数据库,那就得使用VPN了,设置起来还算比较简单(我是win10), 简单介绍一下: 打开设置或者直接点击右下角的
- 浅谈spring 声明式事物
此处主要讲讲事物的属性. 事物属性包含了五个方面: 1.传播行为 2.隔离规则 3.回滚规则 4.事物超时 5.是否只读 一.传播行为 事务的第一个方面是传播行为(propagation behavi ...
- iOS Universal Links(通用链接)
公司的运维,发现最近大量的请求 /.well-known/apple-app-site-association这个文件,造成了大量的404,可是这是谁请求的呢? 其实是苹果从iOS9.3开始更改了通用 ...
- Qt在ui中使用代码添加新的控件
QLabel* label = new QLabel(ui->centralWidget);