최상단 광고

2012년 4월 11일 수요일

[MFC] 다이얼로그 컨트롤 아이디로 버튼인지 알아내기


[MFC] 다이얼로그 컨트롤 아이디로 버튼인지 알아내기  | VC++ 일반2003-01-02 오전 9:38:21

조경민 (bro)  번호: 5887   / 평점:  (-)  / 읽음:1,116
오후 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
{
} ..

이런식으로 하면 어떤 버튼인지 알 수 있다.

이와 비슷하게 리스트, 트리 등도 구분 해 낼 수 있을 것이다.

댓글 없음: