WM_DRAWITEM

Àμö

wParam : ÀÌ ¸Þ½ÃÁö¸¦ º¸³½ ÄÁÆ®·ÑÀÇ IDÀÌ´Ù. ¸Þ´º Ç׸ñÀÇ °æ¿ì´Â 0ÀÌ Àü´ÞµÈ´Ù.

lParam : ±×·ÁÁú Ç׸ñ¿¡ ´ëÇÑ Á¤º¸°¡ ´ã±ä ´ÙÀ½ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ¿À³Ê´Â ÀÌ ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ÂüÁ¶ÇÏ¿© ÄÁÆ®·ÑÀ̳ª ¸Þ´º Ç׸ñÀ» ±×¸°´Ù.

typedef struct tagDRAWITEMSTRUCT {
  UINT      CtlType; 
  UINT      CtlID; 
  UINT      itemID; 
  UINT      itemAction; 
  UINT      itemState; 
  HWND      hwndItem; 
  HDC       hDC; 
  RECT      rcItem; 
  ULONG_PTR itemData; 
} DRAWITEMSTRUCT; 

CtlType : ÄÁÆ®·ÑÀÇ Å¸ÀÔ°ª

°ª

¼³¸í

ODT_BUTTON

¹öÆ°

ODT_COMBOBOX

ÄÞº¸ ¹Ú½º

ODT_LISTBOX

¸®½ºÆ® ¹Ú½º

ODT_LISTVIEW

¸®½ºÆ® ºä ÄÁÆ®·Ñ

ODT_MENU

¸Þ´º Ç׸ñ

ODT_STATIC

½ºÅÂƽ

ODT_TAB

ÅÇ ÄÁÆ®·Ñ

CtlID : ÄÁÆ®·ÑÀÇ IDÀÌ¸ç ¸Þ´º Ç׸ñÀº ÀÌ ¸â¹ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

itemID : ¸Þ´º Ç׸ñÀÇ ID ¶Ç´Â ¸®½ºÆ® ¹Ú½º³ª ÄÞº¸ ¹Ú½ºÀÇ Ç׸ñ À妽ºÀÌ´Ù. ¸®½ºÆ® ¹Ú½º³ª ÄÞº¸ ¹Ú½º°¡ ºñ¾î ÀÖÀ» °æ¿ì ÀÌ °ªÀº -1ÀÌ Àü´ÞµÇ´Âµ¥ ÀÌ´Â Ç׸ñÀÌ ¾ø´õ¶óµµ Æ÷Ä¿½º »ç°¢ÇüÀÌ¶óµµ ±×·Á Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖÀ½À» º¸¿© ÁÖ±â À§Çؼ­ÀÌ´Ù.

itemAction : Ç׸ñÀ» ±×¸± ¹æ¹ýÀ» ÁöÁ¤ÇÑ´Ù.

°ª

¼³¸í

ODA_DRAWENTIRE

ÄÁÆ®·Ñ Àüü¸¦ ´Ù ±×¸°´Ù.

ODA_FOCUS

Æ÷Ä¿½º¸¦ ¾ò¾ú°Å³ª ÀÒ¾ú´Ù. itemState °ªÀ» ÂüÁ¶ÇÏ¿© º¯°æµÈ Æ÷Ä¿½º¸¦ ¹Ý¿µÇØ ÁÖ¾î¾ß ÇÑ´Ù.

ODA_SELECT

¼±Åà »óÅ°¡ ¹Ù²î¾ú´Ù. itemState°ªÀ» ÂüÁ¶ÇÏ¿© ¼±Åà »óŸ¦ ¹Ý¿µÇØ ÁÖ¾î¾ß ÇÑ´Ù.

itemState : Ç׸ñÀÌ ¾î¶»°Ô º¸¿©Á®¾ß ÇÒ Áö¸¦ ÁöÁ¤ÇÏ¸ç ´ÙÀ½ °ªÀÇ Á¶ÇÕ°ªÀ¸·Î Ç¥ÇöµÈ´Ù.

Ç÷¡±×

¼³¸í

ODS_CHECKED

¸Þ´º Ç׸ñÀÌ Ã¼Å© µÇ¾ú´Ù. ¸Þ´º¿¡¼­¸¸ ÀÌ °ªÀÌ »ç¿ëµÇ¸ç ´Ù¸¥ ÄÁÆ®·Ñ¿¡¼­´Â »ç¿ëµÇÁö ¾Ê´Â´Ù.

ODS_COMBOBOXEDIT

ÄÞº¸ ¹Ú½ºÀÇ ¿¡µðÆ® ÄÁÆ®·ÑÀÇ ¼±Åà ¿µ¿ª¿¡¼­ ±×·ÁÁø´Ù.

ODS_DEFAULT

µðÆúÆ® Ç׸ñÀÌ´Ù.

ODS_DISABLED

»ç¿ë ±ÝÁöµÈ Ç׸ñÀÌ´Ù.

ODS_FOCUS

Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖ´Â Ç׸ñÀÌ´Ù.

ODS_GRAYED

±×·¹ÀÌµÈ Ç׸ñÀÌ´Ù. ¸Þ´º¿¡¼­¸¸ ÀÌ °ªÀÌ »ç¿ëµÈ´Ù.

ODS_HOTLIGHT

98/2000 ÀÌ»ó : ÇÖ Æ®·¡Å· Ç׸ñÀÌ´Ù.

ODS_INACTIVE

98/2000 ÀÌ»ó : ºñÈ°¼ºÈ­µÈ Ç׸ñÀÌ´Ù.

ODS_NOACCEL

2000 ÀÌ»ó : ¾×¼¿·¯·¹ÀÌÅÍ Ç¥½Ã¾øÀÌ ±×·ÁÁ®¾ß ÇÑ´Ù.

ODS_NOFOCUSRECT

2000 ÀÌ»ó : Æ÷Ä¿½º Ç¥½Ã¾øÀÌ ±×·ÁÁ®¾ß ÇÑ´Ù.

ODS_SELECTED

¸Þ´º Ç׸ñÀÌ ¼±ÅõǾî ÀÖ´Ù.

hwndItem : ÄÁÆ®·ÑÀÇ ÇÚµéÀÌ´Ù. ¸Þ´ºÀÇ °æ¿ì ¸Þ´º Ç׸ñÀ» °¡Áø ¸Þ´º ÇÚµéÀÌ µÈ´Ù.

hDC : ±×¸®±â¿¡ »ç¿ëÇÒ DC ÇÚµéÀÌ¸ç ¹Ýµå½Ã ÀÌ DC¸¦ »ç¿ëÇÏ¿© ±×·ÁÁ®¾ß ÇÑ´Ù.

rcItem : ÄÁÆ®·ÑÀÌ ±×·ÁÁ®¾ßÇÒ »ç°¢ ¿µ¿ªÀ» ÁöÁ¤ÇÑ´Ù. ¿À³Ê´Â ÀÌ ¿µ¿ª ¾È¿¡¼­¸¸ ±×¸®±â¸¦ ÇØ¾ß Çϸç ÀÌ ¿µ¿ªÀ» ¹þ¾î³­ Ãâ·ÂÀº Àß·Á ³ª°£´Ù. ´Ü, ¸Þ´º Ç׸ñÀÇ °æ¿ì´Â Àß·Á ³ª°¡Áö ¾ÊÀ¸¹Ç·Î ÀÌ ¿µ¿ª ¿ÜºÎ¿¡ ±×¸®Áö ¾Êµµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù.

itemData : ¸Þ´º Ç׸ñ¿¡ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¤ÀÇÇÑ Ç׸ñ µ¥ÀÌÅÍÀÌ´Ù. ¸®½ºÆ® ¹Ú½º, ÄÞº¸ ¹Ú½ºÀÇ °æ¿ì LB(CB) _SETITMEDATA ¸Þ½ÃÁö·Î Ç׸ñ¿¡ Ãß°¡ÇÑ Ç׸ñ µ¥ÀÌÅÍÀÌ´Ù. ¹öÆ°À̳ª ½ºÅà ÄÁÆ®·ÑÀº Ç׸ñ µ¥ÀÌÅ͸¦ °¡ÁöÁö ¾ÊÀ¸¹Ç·Î ÀÌ ¸â¹ö´Â Ç×»ó 0ÀÌ´Ù.

¼³¸í

¿À³Ê µå·Î¿ì ¹öÆ°, ¸®½ºÆ® ¹Ú½º, ÄÞº¸ ¹Ú½º, ¸Þ´º°¡ ±×·ÁÁ®¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§ ¿À³Ê À©µµ¿ì¿¡°Ô ÀÌ ¸Þ½ÃÁö°¡ Àü´ÞµÈ´Ù. ¿À³Ê´Â lParamÀ¸·Î Àü´ÞµÈ ÄÁÆ®·ÑÀÇ Á¾·ù¿Í »óÅ¿¡ µû¶ó ÄÁÆ®·ÑÀ» ÀûÀýÈ÷ ±×·Á ÁÖ¾î¾ß ÇÒ Ã¥ÀÓÀÌ ÀÖ´Ù. ¸¸¾à ¿À³Ê µå·Î¿ì ¸®½ºÆ® ¹Ú½º¸¦ °¡Áø À©µµ¿ì°¡ ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁö ¾Ê°í DefWindowProcÀ¸·Î º¸³»¸é Æ÷Ä¿½º »ç°¢Çü¸¸ ±×·ÁÁø´Ù.

lParamÀÇ DRAWITEMSTRUCT¿¡´Â Ç׸ñ ±×¸®±â¿¡ »ç¿ëÇÒ DCÀÇ ÇÚµé°ú Ãâ·Â ¿µ¿ªÀÌ Àü´ÞµÇ´Âµ¥ ÀÌ Á¤º¸¸¦ ÂüÁ¶ÇÏ¿© ±×¸®µÇ DC´Â ¹Ýµå½Ã ¿ø·¡ »óÅ´ë·Î À¯ÁöÇØ ÁÖ¾î¾ß ÇÑ´Ù. DC¿¡ Ä¿½ºÅÒ ÆæÀ̳ª ºê·¯½Ã¸¦ ¼±ÅÃÇØ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ±× ÀÌÀü °´Ã¼¸¦ ¹Ýµå½Ã º¹±¸½ÃÄÑ ÁÖ¾î¾ß ÇÑ´Ù.

¸®ÅÏ

ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇßÀ¸¸é TRUE¸¦ ¸®ÅÏÇØ¾ß ÇÑ´Ù.

¿¹Á¦

¿¹Á¦ 1

´ÙÀ½ ¿¹Á¦´Â °íÁ¤ ³ôÀÌÀÇ ¿À³Ê µå·Î¿ì ¸®½ºÆ® ¹Ú½º¸¦ ±×¸°´Ù.

HWND hList;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	LPMEASUREITEMSTRUCT lpmis;
	LPDRAWITEMSTRUCT lpdis;
	HBRUSH bkBrush, hBrush, OldBrush;

	switch(iMessage) {
	case WM_CREATE:
		hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
			WS_VSCROLL | LBS_NOTIFY | LBS_OWNERDRAWFIXED,
			10,10,110,200,hWnd,(HMENU)0,g_hInst,NULL);
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)RGB(255,0,0));
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)RGB(0,255,0));
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)RGB(0,0,255));
		return 0;
	case WM_MEASUREITEM:
		lpmis=(LPMEASUREITEMSTRUCT)lParam;
		lpmis->itemHeight=30;
		return TRUE;
	case WM_DRAWITEM:
		lpdis=(LPDRAWITEMSTRUCT)lParam;

		if (lpdis->itemState & ODS_SELECTED) {
			bkBrush=CreateSolidBrush(RGB(255,255,0));
		}
		else {
			bkBrush=CreateSolidBrush(RGB(255,255,255));
		}
		FillRect(lpdis->hDC, &lpdis->rcItem, bkBrush);

		if (lpdis->itemState & ODS_FOCUS) {
			DrawFocusRect(lpdis->hDC,&lpdis->rcItem);
		}

		hBrush=CreateSolidBrush(lpdis->itemData);
		OldBrush=(HBRUSH)SelectObject(lpdis->hDC,hBrush);
		Rectangle(lpdis->hDC,lpdis->rcItem.left+5,lpdis->rcItem.top+5,
			lpdis->rcItem.right-5,lpdis->rcItem.bottom-5);
		SelectObject(lpdis->hDC,OldBrush);
		DeleteObject(hBrush);
		DeleteObject(bkBrush);
		return TRUE;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

¸®½ºÆ® ¹Ú½º¿¡´Â ¼¼°¡Áö »ö»óÀÇ »ç°¢ÇüÀÌ µî·ÏµÇ¾î ÀÖÀ¸¸ç »ö»ó°ªÀ» °¢ Ç׸ñÀÇ Ç׸ñ µ¥ÀÌÅÍ¿¡ ±â¾ï½ÃÄÑ ÁÖ¾ú´Ù. LBS_OWNERDRAWFIXED ½ºÅ¸ÀÏÀ» ÁöÁ¤ÇßÀ¸¹Ç·Î ¸®½ºÆ® ¹Ú½ºÀÇ °¢ Ç׸ñµéÀº ¸ðµÎ ³ôÀÌ°¡ °°À¸¸ç ÀÌ ³ôÀÌ´Â WM_MEASUREITEM ¸Þ½ÃÁö¿¡¼­ 30Çȼ¿·Î ´ëÀÔÇØ ÁÖ¾ú´Ù. °¢ Ç׸ñÀ» ±×·Á¾ß ÇÒ ¶§ ¸®½ºÆ® ¹Ú½º´Â ºÎ¸ð À©µµ¿ì¿¡°Ô WM_DRAWITEM ¸Þ½ÃÁö¸¦ º¸³»ÁÖ¸ç ºÎ¸ð À©µµ¿ì´Â ÀÌ ¸Þ½ÃÁöÀÇ lParamÀ¸·Î Àü´ÞµÈ DRAWITEMSTRUCTURE¸¦ Âü°íÇÏ¿© Ç׸ñÀ» ±×¸°´Ù.

Ç׸ñÀÌ ¼±ÅõǾî ÀÖÀ¸¸é ³ë¶õ»ö ¹è°æÀ» ±×¸®µµ·Ï ÇßÀ¸¸ç Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖÀ¸¸é Æ÷Ä¿½º »ç°¢Çüµµ °°ÀÌ ±×·Á ÁÖ¾ú´Ù. ±×¸®±â°¡ ³¡³ª¸é DC´Â ¹Ýµå½Ã ¿ø·¡´ë·Î µ¹·Á ³õ¾Æ¾ß ÇÑ´Ù.

¿¹Á¦ 2

´ÙÀ½ ¿¹Á¦´Â °¡º¯ ³ôÀ̸¦ °¡Áö´Â ¿À³Ê µå·Î¿ì ¸®½ºÆ® ¹Ú½º¸¦ ±×¸°´Ù.

HWND hList;
struct tagItem
{
	COLORREF col;
	int height;
} Items[3]={
	{RGB(255,0,0),20},
	{RGB(0,255,0),30},
	{RGB(0,0,255),40},
};

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	LPMEASUREITEMSTRUCT lpmis;
	LPDRAWITEMSTRUCT lpdis;
	HBRUSH bkBrush, hBrush, OldBrush;

	switch(iMessage) {
	case WM_CREATE:
		hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
			WS_VSCROLL | LBS_NOTIFY | LBS_OWNERDRAWVARIABLE,
			10,10,110,200,hWnd,(HMENU)0,g_hInst,NULL);
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)&Items[0]);
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)&Items[1]);
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)&Items[2]);
		return 0;
	case WM_MEASUREITEM:
		lpmis=(LPMEASUREITEMSTRUCT)lParam;
		lpmis->itemHeight=((tagItem *)lpmis->itemData)->height;
		return TRUE;
	case WM_DRAWITEM:
		lpdis=(LPDRAWITEMSTRUCT)lParam;

		if (lpdis->itemState & ODS_SELECTED) {
			bkBrush=CreateSolidBrush(RGB(255,255,0));
		}
		else {
			bkBrush=CreateSolidBrush(RGB(255,255,255));
		}
		FillRect(lpdis->hDC, &lpdis->rcItem, bkBrush);

		if (lpdis->itemState & ODS_FOCUS) {
			DrawFocusRect(lpdis->hDC,&lpdis->rcItem);
		}

		hBrush=CreateSolidBrush(((tagItem *)lpdis->itemData)->col);
		OldBrush=(HBRUSH)SelectObject(lpdis->hDC,hBrush);
		Rectangle(lpdis->hDC,lpdis->rcItem.left+5,lpdis->rcItem.top+5,
			lpdis->rcItem.right-5,lpdis->rcItem.bottom-5);
		SelectObject(lpdis->hDC,OldBrush);
		DeleteObject(hBrush);
		DeleteObject(bkBrush);
		return TRUE;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

°¢ Ç׸ñÀº ÀÚ½ÅÀÇ ³ôÀÌ¿Í »ö»ó¿¡ ´ëÇÑ Á¤º¸¸¦ Ç׸ñ µ¥ÀÌÅÍ·Î Á¤ÀÇÇÏ°í ÀÖÀ¸¸ç WM_MEASUREITEM ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ Ç׸ñÀÇ ³ôÀ̸¦ Á¶»çÇØ ÁÖ¾ú°í WM_DRAWITEM¿¡¼­´Â Àü´ÞµÈ ±×¸®±â ¿µ¿ª¿¡ Ç׸ñÀ» ±×¸°´Ù.

Ç÷§Æû

95ÀÌ»ó

ÂüÁ¶

 


written by http://www.winapi.co.kr