SendMessage()를 이용하여 버튼 이미지를 변경해 주면,
EnableWindow()로 버튼을 비활성화 시킬 경우 버튼이 회색으로 변해버린다.
이 문제를 해결하기 위해 버튼에 BS_OWNERDRAW 스타일을 추가하여
직접 이미지를 그려준다.
1. 버튼 생성
case WM_CREATE:
CreateWindow("button","",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_OWNERDRAW,
100,100,70,30,hWnd,(HMENU)IDC_BUTTON, hInst,NULL);
도구 상자를 이용하여 버튼을 추가했을 경우 속성에 Owner Draw 값을 True로 설정해주어야 한다.
안해주면 WM_DRAWITEM 이벤트가 안옴
2. 이미지 로드
hBitmap[0] = LoadBitamp(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
hBitmap[1] = LoadBitamp(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
3. 이미지를 그려 줄 구조체, 변수 선언
static LPDRAWITEMSTRUCT lpdis;
static HDC memDC;
4. case WM_DRAWITEM에서 이미지 그려줌
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT)lParam;
if(lpdis->itemState & ODS_SELECTED) // 버튼이 눌린 상태(BUTTONDOWN)
{
memDC = CreateCompatibleDC(lpdis->hDC);
SelectObject(memDC,hBitmap[1]);
BitBlt(lpdis->hDC, 0,0,100,50,memDC,0,0,SRCCOPY);
DeleteDC(memDC);
}
else // 버튼이 UP되어 있는 상태(BUTTONUP)
{
memDC = CreateCompatibleDC(lpdis->hDC);
SelectObject(memDC,hBitmap[0]);
BitBlt(lpdis->hDC, 0,0,100,50,memDC,0,0,SRCCOPY);
DeleteDC(memDC);
}
break;
- 버튼을 눌렀을 때와, 누르지 않고 있을 때 이미지 변경
/************************* 참고
* Owner draw의 값으로 여러 경우에서 버튼 이미지를 변경 가능 하다
*/
#define ODS_SELECTED 0x0001
#define ODS_GRAYED 0x0002
#define ODS_DISABLED 0x0004
#define ODS_CHECKED 0x0008
#define ODS_FOCUS 0x0010
#if(WINVER >= 0x0400)
#define ODS_DEFAULT 0x0020
#define ODS_COMBOBOXEDIT 0x1000
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define ODS_HOTLIGHT 0x0040
#define ODS_INACTIVE 0x0080
#endif /* WINVER >= 0x0500 */
//3.
static LPDRAWITEMSTRUCT lpdis;
static HDC memDC;
static HBITMAP hBitmap[2];
switch (message)
{
//1.
case WM_CREATE:
CreateWindow("button","",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_OWNERDRAW,
100,100,70,30,hWnd,(HMENU)IDC_BUTTON, hInst,NULL);
//2.
hBitmap[0] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
hBitmap[1] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
break;
//4.
case WM_DRAWITEM:
lpdis = (LPDRAWITEMSTRUCT)lParam;
if(lpdis->itemState & ODS_SELECTED) // 버튼이 눌린 상태(BUTTONDOWN)
{
memDC = CreateCompatibleDC(lpdis->hDC);
SelectObject(memDC,hBitmap[1]);
BitBlt(lpdis->hDC, 0,0,100,50,memDC,0,0,SRCCOPY);
DeleteDC(memDC);
}
else // 버튼이 UP되어 있는 상태(BUTTONUP)
{
memDC = CreateCompatibleDC(lpdis->hDC);
SelectObject(memDC,hBitmap[0]);
BitBlt(lpdis->hDC, 0,0,100,50,memDC,0,0,SRCCOPY);
DeleteDC(memDC);
}
break;
}