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 勿在浮砂筑高台--定位错误 在介绍后面的插件开发技术之前,让我们先来看看已经达到的 ...
随机推荐
- Linux下Python 文件内容替换脚本
Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...
- [COJ2201][KOJ0223][KOJ0250]花园
[KOJ0223][KOJ0250]花园 试题描述 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温室里的花的种类也在不断发生着 ...
- 将本地项目提交到coding上托管
1: 注册coding并新建项目test2:在终端 cd 到要提交的项目 使用git init创建.git文件夹3:使用git pull <项目地址>https的那个4:git a ...
- Spring框架学习(二)
一.Spring IOC参数值注入 1.注入基本值 1.1)<value></value>元素可以通过字符串指定属性或构造参数的值.容器将字符串从java.lang.Strin ...
- JavaBean的用法
JavaBean是一个可重复使用的软件组件,是用Java语言编写的.遵循一定标准的类. JavaBean是Java Web的重要组件,它封装了数据和操作的功能类,供JSP和Servlet调用,完成数据 ...
- DevExpress 关于alertControl 图片显示
private void button1_Click(object sender, EventArgs e) { AlertInfo info = new AlertInfo("Captio ...
- 关于imageOrientation
用相机拍出来的照片都含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息.如果我们忽略orientation信心,而直接对照片进行想速处 ...
- SAP 订单状态跟踪
*&--------------------------------------------------------------------- *& Program name: *& ...
- Transaction事务传播行为种类PROPAGATION_REQUIRED
事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 表1事务传播行为类型 事务传 ...
- JSP复习整理(三)基本语法续
查看注册后的信息: TestBean.java package com.hai.xaio.cn; public class TestBean { public String userName; pub ...