- HOME
- Post in | c/c++/winapi
- Post at | 2012. 8. 1. 10:29 | by 밀크빵.
- View comment
[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; }
'c/c++ > winapi' 카테고리의 다른 글
[WINAPI] 콘솔 창 띄우고 싶을 때 (0) | 2012.10.18 |
---|---|
[API] 여러 가지 출력 - 그래픽 (0) | 2012.08.02 |
[API] 슬라이더에서 값 읽어오기 (0) | 2012.07.23 |
[API] 버튼에 이미지 씌우기 (0) | 2012.07.23 |
Win32 API에 버튼 추가하기 (0) | 2009.11.07 |