[API]OWNERDRAW로 버튼 이미지 바꾸기

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;             }