-
DirectX 9.0c Sample :: Custom UI :: Document (번역기)정리필요2 2008. 7. 1. 20:49
DirectX 9.0 - Custom UI의 장단점
(gpg study, sun7302님의 글입니다.)
DirectX 9.0 - Custom UI를 사용 하고 있습니다
물론 그냥은 절대 사용하기 힘들고 소스 수정을 좀 많이 했습니다.
전반적으로 필요없는 부분을 삭제하고 관리 클래스를 만들고 게임에 쓰기 좋게 수정했습니다
장점 - 메세지 처리, 렌더링, 리소스 캐싱(이 명칭이 맞는지 모르겠네요)이 있습니다.
1, 메세지 처리는 MS 에서 만든거라 그런지 참 잘 되어 있습니다( 윈도우의 컨트롤처럼 포커스 까지 처리할수 있습니다. 물론 수정을 좀 해야지요)
2, 렌더링은 ID3DXSprite를 사용하기 때문에 느리다고 볼수 없습니다. 렌더링시 속도가 느리다고 하시는 분도 있는데 그거는 다이얼로그 그릴때 마다 Begin(), End(), SetRenderState()등 함수들을 관리자 클래스에서 전체 UI 그릴때 한번만 호출해서 처리하면 됩니다. 오히려 대부분의 다른 UI 소스들은 DrawPritive(up)를 많이 사용하므로 UI 이동시 락을 걸어서 처리하기 때문에 느려집니다
3, 리소스 관리를 보면 자주 사용하는 거는 따로 인덱스를 캐쉬화 해서 처리하기 때문에 리소스 검색시 빠른 속도를 냅니다 - 아마 사용엔진의 리소스 관리와 비슷할 겁니다. 자세히 설명하기가 좀 힘이 좀 드네요. 사실 이 리소스 처리 부분을 이해하는데 제일 많이 걸리더군요
단점 - 추가 작업이 많이 필요하다..
1, 그냥 샘플이다 보니 관리 클래스가 없습니다
UI 작업을 해보신 분들은 아시겠지만 단순히 관리 클래스만 추가한다고 되는게 아니라 레이어도 만들어야 하고 기타 다른 것도 하다보면 UI 소스 수정이 불가피 합니다
2, 기본적인 컨트롤만 있기에 게임에 필요한 추가 컨트롤 작업을 해야 합니다
예를 들면 리스트 뷰, 숏컷, 페이지 컨트롤등... 게임에 필요한 컨트롤을 만드셔야 합니다
------ 총평 ------
제 개인적인 생각으로는 인터넷에서 구할수 있는 UI 소스( ex - Crazy Eddie's GUI 등... )와 비교하자면 소스가 쉽게 되어 있어 공부하시기에는 참 좋은 소스 입니다
게임에 사용하실려면 소스를 정확히 이해하시고 수정해서 사용한다면 꽤 괜찮을 소스라 생각합니다.
UI 만드시는 분들중 이 Custom UI 때문에 고민하시는 분들이 계신다면 한번 써보시기를 권하고 싶군요
이 외에도 여러 장단점이 있겠지만 이정도로만 줄일까 합니다
DirectX9.0c Direct3D Tips제2 회 「유저 인터페이스」
Last Modified 2004.08.06
◆목차
1. 처음에우선 이번에 DirectX 9.0c에 추가된 부분을 말하고 싶습니다. 그래서 DirectX 9.0c에 추가된 UI 의 체제를 해설합니다. UI 자체는 인터페이스가 아니고, 클래스의 형태로 제공되고 있어서, 신기능이라고 해도 실제로는 내부에서 스프라이트(ID3DXSprite) 라든가 폰트 클래스(ID3DXFont) (을)를 베이스로 실행되고 있습니다. 그래서 부담이 매우 골치아픔니다.( 특히IME 에 얽힌 부분은)
굳이 샘플을 갖고 싶은 분은SDK 의【Sample Browser 】(으)로부터 인스톨 할 수 있습니다.【CustomUI 】(을)를 봐주세요.
2. 컴퍼넌트의 종류우선 우선은 어떤 컴퍼넌트가 있는지 보고 갑니다. 일단, 아래 screen shot은 CustomUI 샘플입니다(Fig1) . 알기 쉽게 각 컴퍼넌트에 번호를 매겨보았습니다. 일단, 이 번호순서로 설명해 갈 것입니다.
이 근처의 컨트롤의 역할에 대해서는, PC (을)를 사용하고 있으면 어디에서라도 나오는 이야기이므로 개별의 해설은 간단하게 끝내 둡니다.
Fig1.CustomUI
①. 스태틱 컨트롤스태틱 컨트롤의 역할은 단순하게 문자를 표시할 뿐입니다.
②. 버튼버튼은 이벤트를 발생하는 컴퍼넌트입니다.
이 UI 의 이벤트를 처리하는 콜백 함수에 프로세스가 담당하는 것은, 밀린 버튼 마다 할당한 처리를 실시한다고 하는 형태가 됩니다.
③. 체크 박스체크 박스는, 복수 회답의 접수가 가능한 선택사항입니다.
이것도 체크가 붙은 순간에 이벤트가 발생해, 콜백 함수내에서 어느 박스에 체크가 붙어 있는지 조사하고, 해당 체크가 발생하는 이벤트를 콜백함수가 처리합니다.
④. 라디오 버튼이것은, 체크 박스와는 달라, 질문에 대한 회답을 1개 선택해 주었으면 할 때에 사용하는 컨트롤입니다.
⑤. 리스트 박스리스트 박스는, 표시된 문자열을 선택하는 박스로, 1개 밖에 선택할 수 없는 타입의 것과 복수 선택 가능한 것을 사용할 수 있습니다.
덧붙여 샘플에서는 왼쪽의 리스트 박스는 1개만 선택가능으로, 오른편이 복수 선택 가능한 타입입니다.
⑥. combobox이것도 문자열로 표시된 선택사항을 선택하는 박스입니다만, 리스트 박스에 비해 지금 선택하고 있는 항목 밖에 표시되어 있지 않기 때문에 깨끗이 합니다.
⑦. 슬라이더슬라이더는 봉 위에 있는 손잡이를 마우스로 드래그 하는 것으로 값을 변경하는 컴퍼넌트입니다. 일단, 임의폭의 정수를 지정해 사용할 수 있습니다. ⑧. 에디트 박스 에디트 박스는 키보드의 입력을 받아들이는 컨트롤입니다. 이 에디트 박스는 IME 의 변환에 대응하지 않기 때문에 한글을 넣게 하고 싶을 때는 IME 사용할 수 있는 것이 편합니다.
⑨. 에디트 박스(IME 의 이용이 가능)이쪽의 에디트 박스는IME 의 이용이 가능해서【반각/ 전각】키( 혹은 + Alt 그리고) 큰/ 영과 바꾼 입력이 가능합니다.
3. UI 클래스의 구조·CDXUTDialog 에 의한 관리 UI 의 컴퍼넌트는 각각이 클래스의 형태로 제공되고 있습니다.그러나, 샘플등을 보면 각 컴퍼넌트 클래스를 이용하지 않고CDXUTDialog 클래스가 사용되고 있습니다. 이 다이얼로그 클래스는 뷰포트상에 임의의 영역을 확보하고, 그 위에 이 클래스에서 관리하는 컴퍼넌트를 보여 준다고 한 것처럼 되어 있습니다. 이러한 구조로 되어있는 것 만큼은 설계자 밖에 모르기 때문에, 몇가지 생각할 수 있는 이점을 들어 둡니다.
하나는, 복수의 컴퍼넌트를 처리하는 이벤트의 콜백 함수를 1개에 정리의 것이라 하겠지요.구체적인 케이스에서는, 에디트 박스의 입력의 타이밍을 별도인 컴퍼넌트인 버튼 컨트롤에 맡긴다고 했을 때지요. 다이얼로그 클래스에서는, 그 관리와 이벤트를 콜백 함수로 처리할 수 있게 되어 있습니다만, 컴퍼넌트 단위에서는 그러한 방법은 없으니까.
또 하나는 Render 명령을 일괄에 정리해 주고 있는 것입니다. 많은 컴퍼넌트를 스스로 1 개씩 Render 명령을 쓰는 것이 귀찮습니다만, 그 부분을 은폐 해 주고 있다고(면) 간 참도 이점의 하나라고 말할 수 있을 것 같습니다.
덧붙여 CDXUTDialog 클래스가 뷰포트상에 다이얼로그용 구형을 확보하는 설정은【CustomUI 】그럼OnResetDevice() 함수로 아래와 같은 소스가 되어 있습니다.
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc ) { HRESULT hr;
/* …이상 생략…*/
g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 ); g_HUD.SetSize( 170, 170 ); g_SampleUI.SetLocation( 0, 0 ); g_SampleUI.SetSize( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
/* …이하 생략…*/
return S_OK; }
샘플에서는 2개의 다이얼로그 클래스(g_HUD 와 s_SampleUI) 하지만 사용되고 있습니다만 어느쪽이나 여기에서는SetLocation() (와)과SetSize() (을)를 하고 있습니다. CDXUTDialog::SetLocation() (은)는 다이얼로그용의 뷰포트의 좌상의 좌표를 지정하고, CDXUTDialog::SetSize() (은)는 그 구형의 폭과 높이를 지정합니다.
g_HUD는 스크린 우상의 한 획이 사용되고, g_SampleUI (은)는 백 버퍼 영역과 같은 사이즈가 지정되어 있으므로 스크린 전체에 Render 영역이 확보되고 있습니다.
덧붙여/* …이하…*/ 생략아래는 g_SampleUI 관리하의 컴퍼넌트의 배치에 관해서 질질 끄지 않고 코드가 써 있습니다만, 별로 다이얼로그 클래스에서 일괄관리 한다고 다이얼로그에 맞추어 자동적으로 리사이즈까지 관리해 주고 있는 것은 아닌 것 같네요.
·CDXUTDialog 에 컴퍼넌트를 추가한다전항에서, 다이얼로그용의 구형의 설정의 이야기를 했습니다만,CDXUTDialog 에 각 컴퍼넌트를 사용하기 위한 추가 방법에 관해서는【CustomUI 】샘플에서는,void InitApp() 함수내에서 기술되고 있습니다. 기본적으로는,CDXUTDialog::Add ~() 함수라고 하므로 세트 합니다.각각의 컴퍼넌트에 대응했다Add ~() 함수에 대해서는 후에 설명합니다.
·UI 이벤트UI 에 대해서 유저의 하등의 변경에 대응하는 것이UI 용무의 콜백 함수입니다.이것은,CDXUTDialog::SetCallback() 함수로 지정합니다( 샘플에서는OnGUIEvent() 함수) . 그 콜백 함수 자체는, 이하와 같이 정의되고 있습니다.
typedef VOID (CALLBACK *PCALLBACKDXUTGUIEVENT) (UINT nEvent, int nControlID, CDXUTControl* pControl);
우선, 인수에 대해서는 헬프 문서에 특히 기재가 없기 때문에 실제로 디버그 해 들어 온 값등에서 추측합니다. UINT nEvent 발생한 이벤트.16 진으로 정의된 정수( 후술) . int nControlID 이벤트가 발생한 컴퍼넌트의ID .컴퍼넌트 마다 할당했다ID 그리고 참조하면 무엇에 이벤트가 발생하고 있을지를 알 수 있다. CDXUTControl* pControl 이벤트가 발생한 컴퍼넌트의 컨트롤 클래스의 상세한 정보가 들어가 있습니다.어느 다이얼로그 클래스에 소속하는 무엇에 이벤트가 발생하고 있는지를 알 수 있습니다. 덧붙여nEvent 에 들어 오는 정수는DXUTgui.h 에 정의가 있습니다. #define 정수 설명 EVENT_BUTTON_CLICKED 0x0101 버튼이 클릭되었다. EVENT_COMBOBOX_SELECTION_CHANGED 0x0201 combobox의 선택사항이 변경되었다. EVENT_RADIOBUTTON_CHANGED 0x0301 라디오 버튼이 변경되었다. EVENT_CHECKBOX_CHANGED 0x0401 체크 박스의 체크가 변경되었다. EVENT_SLIDER_VALUE_CHANGED 0x0501 슬라이더의 값이 변경되었다. EVENT_EDITBOX_STRING 0x0601 에디트 박스로부터 값을 받았을 때.구체적으로는 입력 후에Enter 의 동작이 들어갈 때라든지. EVENT_EDITBOX_CHANGE 0x0602 에디트 박스의 문자열이 변경되었다. EVENT_LISTBOX_ITEM_DBLCLK 0x0701 리스트 박스의 아이템이 더블 클릭 되었을 때. EVENT_LISTBOX_SELECTION 0x0702 리스트 박스의 아이템이 선택되었을 때. 【CustomUI 】샘플에서는 미리nControlID 에 대응하는 컴퍼넌트의ID (을)를IDC_ ~와 같이#define 그리고 정의하는 것으로 식별하고, 각각 이벤트의 대상이 된 컴퍼넌트마다의 처리를switch 하는 형태로 하고 있습니다.아무튼, 이 근처는Win32 그리고 다이얼로그를 취급했을 때의 느낌으로부터 그만큼 위화감은 없네요. · 각 컴퍼넌트에의 액세스 이 장의 여기까지의 해설에서는 다이얼로그 클래스 자체의 이야기가 중심이었지만, 여기에서는 다이얼로그 클래스에서 각종 컴퍼넌트에의 액세스라고 하는 것을 설명합니다. 그리고,CDXUTDialog 클래스에서 컴퍼넌트를 추가할 때CDXUTDialog::Add ~() 함수로 추가하기 전에 썼습니다.그리고, 그렇게 해서 추가한 컴퍼넌트에 값을 주거나 취득하는 방법을 설명해 갈 것입니다.
한 번, 등록한 컴퍼넌트를 부르려면 ,CDXUTDialog::Get ~() 함수( ~는 컴퍼넌트명) (을)를 사용합니다.일단, 이 함수는Get 이하는 컴퍼넌트의 명칭이 되어 있습니다만, 인수에 호출하고 싶은 컴퍼넌트의ID (을)를 넣습니다.이것으로 그 컴퍼넌트의 클래스의 포인터가 되돌아 오고 있기 때문에 나머지는, 각 컴퍼넌트의 멤버 함수에 액세스 하면OK (이)군요.
·묘화 그런데, 설정이든지 취득이든지 액세스든지를 알 수 있으면 최후는 묘화입니다.이쪽은 비교적 단순합니다. 【CustomUI 】그럼OnFrameRender() 함수내에 기술이 있습니다만,CDXUTDialog::OnRender() 함수를 이용합니다.샘플에서는 아래와 같은 기술로 써지네요.
// OnFrameRender() 함수내 V( g_HUD.OnRender( fElapsedTime ) ); V( g_SampleUI.OnRender( fElapsedTime ) );
4. 각 컴퍼넌트 클래스의 소개 ①스태틱 컨트롤 ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTStatic** ppCreated=NULL ) 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 표시하고 싶은 문자열.LPCWSTR 형태의 경우L" 표시하고 싶은 문자열" (와)과 같이"" 의 전에L (을)를 붙입시다. 제3 인수 표시하는 구형의 좌상의 정점의X 좌표. 제4 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제5 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제7 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제8 인수 생성한 스태틱 텍스트 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 전회 해설했습니다만,CDXUTDialog::AddStatic() 함수로 추가합니다. ·CDXUTDialog (으)로부터의 액세스 CDXUTStatic* GetStatic( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetStatic( ID )->... // ... 에 후술의CDXUTStatic 클래스의 멤버를 부른다
아무튼, 이런 식으로 짊어질까? ·CDXUTStatic class CDXUTStatic : public CDXUTControl { public: CDXUTStatic( CDXUTDialog *pDialog = NULL );
virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
HRESULT GetTextCopy( LPWSTR strDest, UINT bufferCount ); LPCWSTR GetText() { return m_strText; } HRESULT SetText( LPCWSTR strText );
protected: WCHAR m_strText[MAX_PATH]; // Window text };
우선 이런 느낌의 클래스입니다.기억해 두는 것은, 문자를 세트 한다SetText (와)과 취득한다GetText 입니까. 스태틱 컨트롤은 단순해서 아무튼 이런 곳입니다.Render() 라든가는CDXUTDialog (을)를 사용하고 있는 집은 스스로 명시적으로 부르는 것도 없을 것입니다.
②버튼 ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey=0, bool bIsDefault=false, CDXUTButton** ppCreated=NULL ); 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 표시하고 싶은 문자열.LPCWSTR 형태의 경우L" 표시하고 싶은 문자열" (와)과 같이"" 의 전에L (을)를 붙입시다. 제3 인수 표시하는 구형의 좌상의 정점의X 좌표. 제4 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제5 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제7 인수 hot key를 할당할지.여기서 가상 키(VK_F1 라든가VK_ESC 같아) (을)를 할당해 두면 그 키로 체크를 넣을 수 됩니다. 제8 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제9 인수 생성한 버튼 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . ·CDXUTDialog (으)로부터의 액세스 CDXUTButton* GetButton( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetButton( ID )->... // ... 에 후술의CDXUTButton 클래스의 멤버를 부른다
버튼에 관해서는UI 의 이벤트를 처리하는 콜백으로nControlID 그리고 버튼을 밀렸는지 알므로, 버튼에 쓰여진 문자열의 변경이나 위치 변경으로 밖에 액세스 할 기회는 적을지도 모릅니다. ·CDXUTButton class CDXUTButton : public CDXUTStatic { public: CDXUTButton( CDXUTDialog *pDialog = NULL );
virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); virtual void OnHotkey() { m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); }
virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); }
virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
protected: bool m_bPressed; };
이 클래스는,CDXUTStatic 클래스를 계승하고 있습니다.그래서, 버튼상의 문자열의 취득이나 세트는 그쪽의 친클래스의 것을 사용하게 됩니다. 아무튼, 확실히 스태틱과의 차이는 버튼범위만이니까요.
③체크 박스 ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked=false, UINT nHotkey=0, bool bIsDefault=false, CDXUTCheckBox** ppCreated=NULL ); 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 표시하고 싶은 문자열.LPCWSTR 형태의 경우L" 표시하고 싶은 문자열" (와)과 같이"" 의 전에L (을)를 붙입시다. 제3 인수 표시하는 구형의 좌상의 정점의X 좌표. 제4 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제5 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제7 인수 hot key를 할당할지.여기서 가상 키(VK_F1 라든가VK_ESC 같아) (을)를 할당해 두면 그 키로 체크를 넣을 수 됩니다. 제8 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제9 인수 생성한 체크 박스 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 3번째까지 오는 곳의 옆은 거의 같네요. ·CDXUTDialog (으)로부터의 액세스 CDXUTCheckBox* GetCheckBox( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetCheckBox( ID )->...// ... 에 후술의CDXUTCheckBox 클래스의 멤버를 부른다
코코까지 오면 생략 하고 싶어집니다. ·CDXUTCheckBox class CDXUTCheckBox : public CDXUTButton { public: CDXUTCheckBox( CDXUTDialog *pDialog = NULL );
virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); virtual void OnHotkey() { SetCheckedInternal( !m_bChecked, true ); }
virtual BOOL ContainsPoint( POINT pt ); virtual void UpdateRects();
virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
bool GetChecked() { return m_bChecked; } void SetChecked( bool bChecked ) { SetCheckedInternal( bChecked, false ); }
protected: virtual void SetCheckedInternal( bool bChecked, bool bFromInput );
bool m_bChecked; RECT m_rcButton; RECT m_rcText; };
버무리지 않고, 체크 상태가 어떨까를 조사한다GetChecked() (와)과SetChecked (을)를 기억해 두면 좋지 않을까요? 일단, 이하와 같이 사용합니다.
// 체크되고 있을까?
if(dialog.CheckBox( ID )->GetCheked())
{
// 그 후의 처리를 기술}
// 체크 상태로 한다
dialog.CheckBox( ID )->SetChecked( TRUE );④라디오 버튼 ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width, int height, bool bChecked=false, UINT nHotkey=0, bool bIsDefault=false, CDXUTRadioButton** ppCreated=NULL ); 제1 인수 컴퍼넌트로서의ID . 제2 인수 라디오 버튼의 그룹ID .이 변수로 지정한 같은 정수를 가지는 그룹에서 선택사항을 공유합니다. 제3 인수 라디오 버튼의 항목명. 제4 인수 표시하는 구형의 좌상의 정점의X 좌표. 제5 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제6 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제7 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제8 인수 이 라디오 버튼에 체크를 넣는 경우는true .디폴트는false 입니다.샘플에서는 디폴트인 채. 제9 인수 hot key를 할당할지.여기서 가상 키(VK_F1 라든가VK_ESC 같아) (을)를 할당해 두면 그 키로 체크를 넣을 수 됩니다. 제10 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제11 인수 생성한 라디오 버튼 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 라디오 버튼의 추가도 외와 같이 보입니다만, 제2 인수가 라디오 버튼 고유의 인수군요.이것은 선택사항을 공유하고 싶은 라지보탄의 그룹용의ID 그리고 여기를 같은 수치로 지정한 라디오 버튼이 선택을 공유합니다.【CustomUI 】의 경우, 아래와 같이 사용되고 있습니다. // Radio buttons g_SampleUI.AddRadioButton( IDC_RADIO1A, 1, L"Radio group 1 Amy", 0, 50, 200, 24 ); g_SampleUI.AddRadioButton( IDC_RADIO1B, 1, L"Radio group 1 Brian", 0, 50, 200, 24 ); g_SampleUI.AddRadioButton( IDC_RADIO1C, 1, L"Radio group 1 Clark", 0, 50, 200, 24 );
g_SampleUI.AddRadioButton( IDC_RADIO2A, 2, L"Single", 0, 50, 70, 24 ); g_SampleUI.AddRadioButton( IDC_RADIO2B, 2, L"Double", 0, 50, 70, 24 ); g_SampleUI.AddRadioButton( IDC_RADIO2C, 2, L"Triple", 0, 50, 70, 24 );
여기에서는,6 개의 라디오 버튼을 추가하고 있습니다만, 1으로2 의2 종류가 있습니다.이것으로1 (분)편은, 위의3 개로 선택사항을 공유,2 (분)편은 아래의 3개로 선택사항을 공유하게 됩니다. ·CDXUTDialog (으)로부터의 액세스 CDXUTRadioButton* GetRadioButton( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetRadioButton( ID )->...// ... 에 후술의CDXUTRadiobutton 클래스의 멤버를 부른다
아무튼, 이것도 똑같네요. ·CDXUTRadioButton class CDXUTRadioButton : public CDXUTCheckBox { public: CDXUTRadioButton( CDXUTDialog *pDialog = NULL );
virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); virtual void OnHotkey() { SetCheckedInternal( true, true, true ); }
void SetChecked( bool bChecked, bool bClearGroup=true ) { SetCheckedInternal( bChecked, bClearGroup, false ); } void SetButtonGroup( UINT nButtonGroup ) { m_nButtonGroup = nButtonGroup; } UINT GetButtonGroup() { return m_nButtonGroup; }
protected: virtual void SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput ); UINT m_nButtonGroup; };
이 클래스는 전술의CDXUTCheckBox (을)를 계승하고 있습니다.그 때문에, 단순하게GetCheck() 하지만 사용할 수 있습니다.SetCheck() 에 관해서는, 그룹내에서2 개이상 체크가 붙은 라디오 버튼이 존재하면 마즈이의 것으로 거기에 배려한 만들기가 되어 있습니다.단지,SetChecked() 의 제2 인수를false (으)로 하면 당연, 그룹내에서2 개이상 체크를 붙이는 것도 가능합니다. 아무튼, 이 근처의 사용법은 체크 박스의 항을 참고로 해 주세요.
⑤리스트 박스 ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle=0, CDXUTListBox** ppCreated=NULL ); 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 표시하는 구형의 좌상의 정점의X 좌표. 제3 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제4 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제5 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 리스트 박스의 스타일.0 (이)라면 리스트 박스의 항목은1 개 밖에 선택할 수 없다.1 혹은CDXUTListBox::MULTISELECTION (이)라면 복수 항목 선택이 가능한 리스트 박스가 된다. 제7 인수 생성한 리스트 박스 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 우선, 여기에서는 제6 인수가 주의 해야할 때 군요. 덧붙여 여기까지에서는 아직 어디까지나의 리스트 박스의 테두리만 만든 것이 되므로 항목의 등록은 아래와 같은 함수로 실시합니다.
HRESULT CDXUTListBox::AddItem( const WCHAR *wszText, void *pData ) 제1 인수가 항목에 추가하는 문자열로, 제2 인수가 항목의 보관 유지하는 데이터입니다. 좀 더 자세하게 설명하면 제1 인수가"July"(7 월) (으)로서 제2 인수는 이것을 선택하면7 달의"7" 그렇다고 하는 것을 프로그램에 건네주고 싶을 때에7 그렇다고 하는 것을 넣어 두면,"July" 그렇다고 하는 항목이 선택되면7 그렇다고 하는 데이터를 받을 수 있게 되는 것이 되는 것이군요.
·CDXUTDialog (으)로부터의 액세스 CDXUTListBox* GetListBox( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetListBox( ID )->...// ... 에 후술의CDXUTListBox 클래스의 멤버를 부른다
전술의AddItem (은)는, 매번 매번GetListBox() 해Additem() 합니다. ·CDXUTListBox class CDXUTListBox : public CDXUTControl { public: CDXUTListBox( CDXUTDialog *pDialog = NULL ); virtual ~CDXUTListBox();
virtual HRESULT OnInit() { return m_pDialog->InitControl( &m_ScrollBar ); } virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); } virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime ); virtual void UpdateRects();
DWORD GetStyle() const { return m_dwStyle; } int GetSize() const { return m_Items.GetSize(); } void SetStyle( DWORD dwStyle ) { m_dwStyle = dwStyle; } void SetScrollBarWidth( int nWidth ) { m_nSBWidth = nWidth; UpdateRects(); } void SetBorder( int nBorder, int nMargin ) { m_nBorder = nBorder; m_nMargin = nMargin; } HRESULT AddItem( const WCHAR *wszText, void *pData ); HRESULT InsertItem( int nIndex, const WCHAR *wszText, void *pData ); void RemoveItem( int nIndex ); void RemoveItemByText( WCHAR *wszText ); void RemoveItemByData( void *pData ); void RemoveAllItems();
DXUTListBoxItem *GetItem( int nIndex ); int GetSelectedIndex( int nPreviousSelected = -1 ); DXUTListBoxItem *GetSelectedItem( int nPreviousSelected = -1 ) { return GetItem( GetSelectedIndex( nPreviousSelected ) ); } void SelectItem( int nNewIndex );
enum STYLE { MULTISELECTION = 1 };
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; };
이제 조금 두개컴퍼넌트 클래스가 커져 옵니다. 우선 주목해야 하는 것은 아래와 같이에 사용예로 주어 둡니다.
// July 그렇다고 한다7 (을)를 데이터에 가지는 항목을15 번째에 삽입
dialog.GetListBox( ID )->InsertItem( 15, L"July", (LPVOID)(size_t)7 );// 선택되고 있는 항목의 데이터 취득
DXUTListBoxItem* Item = dialog.GetListBox( ID )->GetSelectedItem ();// 3 번째의 항목의 데이터 취득
DXUTListBoxItem* Item = dialog.GetListBox( ID )->GetItem( 3 );// 선택되고 있는 인덱스의 취득(1 개 밖에 선택할 수 없는 리스트 박스의 경우)
int Idex = dialog.GetListBox( ID )->GetSelectedIndex();// 복수 취득의 경우의 인덱스 취득
int nSelected = -1;
while( ( nSelected = ((CDXUTListBox *)pControl)->GetSelectedIndex( nSelected ) ) != -1 )
{
// 선택한 항목수만큼 루프가 주위nSelected 에Index 하지만 들어간다}
비교적 주의해야 하는 것은-1 (을)를GetSelectedItem 에 넣었을 때에 현재 선택되고 있는 항목의 번호를 알 수 있는 곳(중)입니까? 이것이 선택1 개라면 이해가 하기 쉽습니다만, 복수개에서는 최초로-1 하지만 들어가면 그 반환값이 선택되고 있는 인덱스가 되어 그것을 인수로 하면 다음에 선택되고 있는 항목의 서수가 들어간다고 하는 구조가 되어 있기 때문에 주의해 주세요.
⑥combobox ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddComboBox( int ID, int x, int y, int width, int height, UINT nHotKey=0, bool bIsDefault=false, CDXUTComboBox** ppCreated=NULL ); 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 표시하는 구형의 좌상의 정점의X 좌표. 제3 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제4 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제5 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 hot key를 할당할지.여기서 가상 키(VK_F1 라든가VK_ESC 같아) (을)를 할당해 두면 그 키로 체크를 넣을 수 됩니다. 제7 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제8 인수 생성한 combobox 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 여기까지가 combobox의 테두리의 부분의 생성입니다.항목의 추가는 리스트 박스와 같아서 할애 합니다(GetComboBox() 하는 방법과 샘플과 같이ppCreated (을)를 취득하는 방법) . ·CDXUTDialog (으)로부터의 액세스 CDXUTComboBox* GetComboBox( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetComboBox( ID )->... // ... 에 후술의CDXUTComboBox 클래스의 멤버를 부른다
이것은 친숙하네요. ·CDXUTComboBox class CDXUTComboBox : public CDXUTButton { public: CDXUTComboBox( CDXUTDialog *pDialog = NULL ); virtual ~CDXUTComboBox();
virtual HRESULT OnInit() { return m_pDialog->InitControl( &m_ScrollBar ); }
virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); virtual void OnHotkey();
virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); } virtual void OnFocusOut(); virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
virtual void UpdateRects();
HRESULT AddItem( const WCHAR* strText, void* pData ); void RemoveAllItems(); void RemoveItem( UINT index ); bool ContainsItem( const WCHAR* strText, UINT iStart=0 ); int FindItem( const WCHAR* strText, UINT iStart=0 ); void* GetItemData( const WCHAR* strText ); void SetDropHeight( UINT nHeight ) { m_nDropHeight = nHeight; UpdateRects(); } void SetScrollBarWidth( int nWidth ) { m_nSBWidth = nWidth; UpdateRects(); }
void* GetSelectedData(); DXUTComboBoxItem* GetSelectedItem();
UINT GetNumItems() { return m_Items.GetSize(); } DXUTComboBoxItem* GetItem( UINT index ) { return m_Items.GetAt( index ); }
HRESULT SetSelectedByIndex( UINT index ); HRESULT SetSelectedByText( const WCHAR* strText ); HRESULT SetSelectedByData( void* pData );
protected: int m_iSelected; int m_iFocused; int m_nDropHeight; CDXUTScrollBar m_ScrollBar; int m_nSBWidth;
bool m_bOpened;
RECT m_rcText; RECT m_rcButton; RECT m_rcDropdown; RECT m_rcDropdownText;
CGrowableArray< DXUTComboBoxItem* > m_Items; };
이 클래스는 버튼 클래스를 계승하고 있습니다. 사용법에 관해서는,1 개 밖에 선택할 수 없는 리스트 박스와 같은 느낌입니다.단지, 저쪽에는 없다FindItem() 함수등이 있군요.
항목의 삽입은 할 수 있어 없을 것 같네요.
⑦슬라이더 ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddSlider( int ID, int x, int y, int width, int height, int min=0, int max=100, int value=50, bool bIsDefault=false, CDXUTSlider** ppCreated=NULL ); 제1 인수 컴퍼넌트로서의ID .상기의 스태틱 텍스트의 곳과 설명적으로는 같습니다. 제2 인수 표시하는 구형의 좌상의 정점의X 좌표. 제3 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제4 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 잘린다) . 제5 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 잘린다) . 제6 인수 최소치의 값.디폴트는0 . 제7 인수 최대치의 값.디폴트는100 . 제8 인수 최초로 손잡이 부분이 세트 되고 있는 값.디폴트는50 . 제9 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제10 인수 생성한 슬라이드 버크 라스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 우선 슬라이더는 초기치에 관련되는 부분이 그 밖에 없는 곳이군요. ·CDXUTDialog (으)로부터의 액세스 CDXUTSlider* GetSlider( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.GetSlider( ID )->... // ... 에 후술의CDXUTSlider 클래스의 멤버를 부른다
이것은 친숙하네요. ·CDXUTSlider class CDXUTSlider : public CDXUTControl { public: CDXUTSlider( CDXUTDialog *pDialog = NULL );
virtual BOOL ContainsPoint( POINT pt ); virtual bool CanHaveFocus() { return true; } virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
virtual void UpdateRects();
virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
void SetValue( int nValue ) { SetValueInternal( nValue, false ); } int GetValue() { return m_nValue; };
void SetRange( int nMin, int nMax );
protected: void SetValueInternal( int nValue, bool bFromInput ); int ValueFromPos( int x );
int m_nValue;
int m_nMin; int m_nMax;
int m_nDragX; // Mouse position at start of drag int m_nDragOffset; // Drag offset from the center of the button int m_nButtonX;
bool m_bPressed; RECT m_rcButton; };
코레에 관해서는,SetValue() (와)과GetValue() , 나머지는SetRange() 만 억제해 두면 좋지 않을까요? 슬라이더는 기본적으로 정부의 영역을 범위로 지정할 수 있습니다만 정수 밖에 취급할 수 없기 때문에 주의해 주세요( 소수를 취급하고 싶은 경우는 취득한 값을 가공해 사용할 필요가 있습니다) .
⑧에디트 박스 ·다이얼로그에의 추가 방법 HRESULT CDXUTEditBox::AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTEditBox** ppCreated=NULL ); 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 에디트 박스내에 디폴트로 표시하고 싶은 문자열.LPCWSTR 형태의 경우L" 표시하고 싶은 문자열" (와)과 같이"" 의 전에L (을)를 붙입시다. 제3 인수 표시하는 구형의 좌상의 정점의X 좌표. 제4 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제5 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제7 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제8 인수 생성한 에디트 박스 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 특히 지금까지 본 컨트롤 중(안)에서 바뀐 부분은 없겠네요. ·CDXUTDialog (으)로부터의 액세스 CDXUTEditBox* GetEditBox( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.EditBox( ID )->... // ... 에 후술의CDXUTEditBox 클래스의 멤버를 부른다
특별히 말할 것은 없습니다. ·CDXUTEdutBox class CDXUTEditBox : public CDXUTControl { friend class CExternalApiInitializer;
public: CDXUTEditBox( CDXUTDialog *pDialog = NULL ); virtual ~CDXUTEditBox();
virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual void UpdateRects(); virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); } virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime ); virtual void OnFocusIn();
void SetText( LPCWSTR wszText, bool bSelected = false ); LPCWSTR GetText() { return m_Buffer.GetBuffer(); } int GetTextLength() { return m_Buffer.GetTextSize(); }// Returns text length in chars excluding NULL. HRESULT GetTextCopy( LPWSTR strDest, UINT bufferCount ); void ClearText(); void SetTextColor( D3DCOLOR Color ) { m_TextColor = Color; } // Text color void SetSelectedTextColor( D3DCOLOR Color ) { m_SelTextColor = Color; } // Selected text color void SetSelectedBackColor( D3DCOLOR Color ) { m_SelBkColor = Color; } // Selected background color void SetCaretColor( D3DCOLOR Color ) { m_CaretColor = Color; } // Caret color void SetBorderWidth( int nBorder ) { m_nBorder = nBorder; UpdateRects(); } // Border of the window void SetSpacing( int nSpacing ) { m_nSpacing = nSpacing; UpdateRects(); } void ParseFloatArray( float *pNumbers, int nCount ); void SetTextFloatArray( const float *pNumbers, int nCount );
public: // 길기 때문에 이하 생략 };
이 클래스는 길기 때문에 우선 실장상 손대어 없을 것 같은 후반은 생략 합니다. 우선 억제해 두는 것은 청자 의 개소입니까?
쓰여져 있다 문자열의 취득은,GetText()
박스의 소거는,ClearText()
색변경은,SetTextColor()기본은 이런 곳에서 짊어질까?
⑨에디트 박스(IME 의 이용이 가능) ·다이얼로그에의 추가 방법 HRESULT CDXUTDialog::AddIMEEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTIMEEditBox** ppCreated=NULL ); 제1 인수 UI 의 컴퍼넌트는 무엇을 사용해도 반드시,ID 그렇다고 하는 것을 최초의 인수에 넣습니다.그것은, 이 클래스에서 관리하고 있다UI 의 각 컴퍼넌트를 식별하기 위한 정수입니다.Windows 프로그래밍으로 다이얼로그등의 자원을 사용해 개발한 것이 있는 분이라면 핀과 온다고 생각합니다(IDI_ ~라든지IDC_ ~라든지IDM_ ~라든지의 정수무슨이미지에 가깝네요) . 덧붙여 다른UI 의ID (와)과 중복되어서는 안됩니다.
제2 인수 에디트 박스내에 디폴트로 표시하고 싶은 문자열.LPCWSTR 형태의 경우L" 표시하고 싶은 문자열" (와)과 같이"" 의 전에L (을)를 붙입시다. 제3 인수 표시하는 구형의 좌상의 정점의X 좌표. 제4 인수 표시하는 구형의 좌상의 정점의Y 좌표. 제5 인수 표시하는 구형의 폭( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제6 인수 표시하는 구형의 높이( 충분한 영역이 확보되어 있지 않으면 문자열이 잘린다) . 제7 인수 디폴트의 컨트롤인지 어떤지.초기화완료 어째서 특히 변경은 하지 않아 좋다고 생각합니다. 제8 인수 생성했다IME 부착 에디트 박스 클래스를 취득한다( 이 다이얼로그 클래스에서 관리하고 싶은 것이면NULL 그리고 좋다) .덧붙여 초기화가 끝난 상태이니까 샘플과 같이 인수를 주지 않아도OK . 과연IME 기능이 붙는 것만으로 기본적으로는 에디트 박스 때와 같습니다. ·CDXUTDialog (으)로부터의 액세스 CDXUTIMEEditBox* GetIMEEditBox( int ID ); // 멤버 함수
// 례 CDXUTDialog dialog; dialog.IMEEditBox( ID )->... // ... 에 후술의CDXUTIMEEditBox 클래스의 멤버를 부른다
특별히 말할 것은 없습니다. ·CDXUTIMEEditBox 생략 기본적으로는CDXUTEditBox (을)를 계승하고 있어, 문자열의 취득 그 외는 그쪽의 클래스의 멤버 함수를 이용합니다.코치라 고유의 멤버 함수도 사용할 기회는 있을까 생각합니다만, 이번은 거기까지 발을 디디는 것은 하지 않습니다. 5. 정리 우선 이것으로 최저한 사용할 수 있으십니까? 여담입니다만,UI 용무의 소재는Sample Framework 베이스의 프로젝트라면【Media 】→【UI 】폴더에【dxutcontrols.dds 】그렇다고 하는 파일로 거둘 수 있고 있습니다.이것은 잘 스스로 만든 소재에 옮겨놓으면 오리지날 스킨이 되어 버리는 것이군요.그렇게 생각하면UI 용무의 스킨 제작 툴이라든지 콘버터 툴은의도 지금 만들어 두면 귀하게 여겨지는지도 모르겠네요.
그렇게 깊게가 아닙니다만 대충UI 의 사용법을 소개해 왔습니다.이 분량의 기사와 과연 전회에 예고는 했지만 많이 트라이의 것이 있습니다.
아무튼, 책이라든지 돈이라도 되면 좀 더 정중하게 의지도 나옵니다만 아무튼 지금은 이것으로 용서 주세요.
우선 이번은 힘들었기 때문에, 다음 번의 예정은 세우지 않고 일어납니다.