오후 9:16 2002-09-23
조경민 bro@shinbiro.com
다이얼로그 컨트롤 아이디로 버튼인지 체크 박스인지 알아내기
====================================================================
HWND 컨트롤의 윈도우 핸들로 아래와 같이 클래스 이름을 얻어와서
int GetClassName( hC
HWND hWnd, // handle to window
LPTSTR lpClassName, // class name
int nMaxCount // size of class name buffer
);
"button" 이라는 문자열이라면 버튼 윈도우를 의미하며
버튼 윈도우는 디폴트 버튼(테두리가 굵은섹 IDOK), 그냥 버튼.
라디오 버튼, 체크 버튼 등 여러가지가 있다. 아래는 버튼의 스타일이다.
( Spy++로 해당 윈도우를 잡아 보면 윈도우 클래스이름을 얻어올 수 있다. )
/*
* Button Control Styles
*/
#define BS_PUSHBUTTON 0x00000000L
#define BS_DEFPUSHBUTTON 0x00000001L
#define BS_CHECKBOX 0x00000002L
#define BS_AUTOCHECKBOX 0x00000003L
#define BS_RADIOBUTTON 0x00000004L
#define BS_3STATE 0x00000005L
#define BS_AUTO3STATE 0x00000006L
#define BS_GROUPBOX 0x00000007L
#define BS_USERBUTTON 0x00000008L
#define BS_AUTORADIOBUTTON 0x00000009L
#define BS_OWNERDRAW 0x0000000BL
#define BS_LEFTTEXT 0x00000020L
#if(WINVER >= 0x0400)
#define BS_TEXT 0x00000000L
#define BS_ICON 0x00000040L
#define BS_BITMAP 0x00000080L
#define BS_LEFT 0x00000100L
#define BS_RIGHT 0x00000200L
#define BS_CENTER 0x00000300L
#define BS_TOP 0x00000400L
#define BS_BOTTOM 0x00000800L
#define BS_VCENTER 0x00000C00L
#define BS_PUSHLIKE 0x00001000L
#define BS_MULTILINE 0x00002000L
#define BS_NOTIFY 0x00004000L
#define BS_FLAT 0x00008000L
#define BS_RIGHTBUTTON BS_LEFTTEXT
#endif /* WINVER >= 0x0400 */
하위 한바이트가 버튼의 특성을 크게 결정짓는 것이므로
CWnd::GetStyle 즉
_AFXWIN_INLINE DWORD CWnd::GetStyle() const
{ ASSERT(::IsWindow(m_hWnd)); return (DWORD)GetWindowLong(m_hWnd, GWL_STYLE); }
UINT nButtonStyle = GetWindowLong(m_hWnd, GWL_STYLE) & 0x0000000F;
한 후
if( nButtonStyle == BS_PUSHBUTTON || nButtonStyle == BS_DEFPUSHBUTTON )
{
// 보통의 버튼이다.
}
else
if( nButtonStyle == BS_CHECKBOX || nButtonStyle == BS_AUTOCHECKBOX )
{
// 보통의 체크 박스다.
}
else
if( nButtonStyle == BS_3STATE || nButtonStyle == BS_AUTO3STATE )
{
// 보통의 3 상태 버튼이다.
}
else
if( nButtonStyle == BS_RADIOBUTTON || nButtonStyle == BS_AUTORADIOBUTTON )
{
// 보통의 라디오 버튼이다.
}
else
if( nButtonStyle == BS_OWNERDRAW )
{
// 보통의 오너 드로우 버튼이다.
}
else
{
} ..
이런식으로 하면 어떤 버튼인지 알 수 있다.
이와 비슷하게 리스트, 트리 등도 구분 해 낼 수 있을 것이다.
조경민 bro@shinbiro.com
다이얼로그 컨트롤 아이디로 버튼인지 체크 박스인지 알아내기
====================================================================
HWND 컨트롤의 윈도우 핸들로 아래와 같이 클래스 이름을 얻어와서
int GetClassName( hC
HWND hWnd, // handle to window
LPTSTR lpClassName, // class name
int nMaxCount // size of class name buffer
);
"button" 이라는 문자열이라면 버튼 윈도우를 의미하며
버튼 윈도우는 디폴트 버튼(테두리가 굵은섹 IDOK), 그냥 버튼.
라디오 버튼, 체크 버튼 등 여러가지가 있다. 아래는 버튼의 스타일이다.
( Spy++로 해당 윈도우를 잡아 보면 윈도우 클래스이름을 얻어올 수 있다. )
/*
* Button Control Styles
*/
#define BS_PUSHBUTTON 0x00000000L
#define BS_DEFPUSHBUTTON 0x00000001L
#define BS_CHECKBOX 0x00000002L
#define BS_AUTOCHECKBOX 0x00000003L
#define BS_RADIOBUTTON 0x00000004L
#define BS_3STATE 0x00000005L
#define BS_AUTO3STATE 0x00000006L
#define BS_GROUPBOX 0x00000007L
#define BS_USERBUTTON 0x00000008L
#define BS_AUTORADIOBUTTON 0x00000009L
#define BS_OWNERDRAW 0x0000000BL
#define BS_LEFTTEXT 0x00000020L
#if(WINVER >= 0x0400)
#define BS_TEXT 0x00000000L
#define BS_ICON 0x00000040L
#define BS_BITMAP 0x00000080L
#define BS_LEFT 0x00000100L
#define BS_RIGHT 0x00000200L
#define BS_CENTER 0x00000300L
#define BS_TOP 0x00000400L
#define BS_BOTTOM 0x00000800L
#define BS_VCENTER 0x00000C00L
#define BS_PUSHLIKE 0x00001000L
#define BS_MULTILINE 0x00002000L
#define BS_NOTIFY 0x00004000L
#define BS_FLAT 0x00008000L
#define BS_RIGHTBUTTON BS_LEFTTEXT
#endif /* WINVER >= 0x0400 */
하위 한바이트가 버튼의 특성을 크게 결정짓는 것이므로
CWnd::GetStyle 즉
_AFXWIN_INLINE DWORD CWnd::GetStyle() const
{ ASSERT(::IsWindow(m_hWnd)); return (DWORD)GetWindowLong(m_hWnd, GWL_STYLE); }
UINT nButtonStyle = GetWindowLong(m_hWnd, GWL_STYLE) & 0x0000000F;
한 후
if( nButtonStyle == BS_PUSHBUTTON || nButtonStyle == BS_DEFPUSHBUTTON )
{
// 보통의 버튼이다.
}
else
if( nButtonStyle == BS_CHECKBOX || nButtonStyle == BS_AUTOCHECKBOX )
{
// 보통의 체크 박스다.
}
else
if( nButtonStyle == BS_3STATE || nButtonStyle == BS_AUTO3STATE )
{
// 보통의 3 상태 버튼이다.
}
else
if( nButtonStyle == BS_RADIOBUTTON || nButtonStyle == BS_AUTORADIOBUTTON )
{
// 보통의 라디오 버튼이다.
}
else
if( nButtonStyle == BS_OWNERDRAW )
{
// 보통의 오너 드로우 버튼이다.
}
else
{
} ..
이런식으로 하면 어떤 버튼인지 알 수 있다.
이와 비슷하게 리스트, 트리 등도 구분 해 낼 수 있을 것이다.
'KB > Win32/x86' 카테고리의 다른 글
How to i386 32bit OS Kernel Compile in VC6 (0) | 2004.03.20 |
---|---|
How to Stack Walk (0) | 2004.03.19 |
apihook - 간편한 유저레벨하의 API 후킹(dll injecting/iat patching (0) | 2004.03.19 |
[ddk] NT Kernel-Mode Driver with WDM (0) | 2004.03.19 |
[ddk] NT Kernel-Mode Device Driver Programming in VC++ with SoftICE (0) | 2004.03.19 |