SetClassLong

¿øÇü

DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong);

MFC ¿øÇü

ÇØ´çÇÏ´Â ÇÔ¼ö ¾øÀ½

Àμö

¢º hWnd : ¼öÁ¤ÇÒ Å¬·¡½º°¡ ¼ÓÇØÀÖ´Â À©µµ¿ìÀÇ ÇÚµé. À©µµ¿ìÀÇ ÇÚµéÀ» ÅëÇØ À©µµ¿ì Ŭ·¡½º¸¦ °£Á¢ÀûÀ¸·Î ÁöÁ¤ÇÏ¸ç ¼öÁ¤´ë»óÀº ÀÌ À©µµ¿ì°¡ ¾Æ´Ï¶ó À©µµ¿ì°¡ ¼ÓÇØÀÖ´Â À©µµ¿ì Ŭ·¡½ºÀÌ´Ù.

¢º nIndex : ¼öÁ¤ÇÒ °ªÀ» ÁöÁ¤ÇÏ¸ç ´ÙÀ½ °ª Áß Çϳª¸¦ ÁöÁ¤ÇÑ´Ù. À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇÒ ¶§ »ç¿ëÇÏ´Â WNDCLASS ±¸Á¶Ã¼ÀÇ ¸â¹ö¿¡ ´ëÀÀµÈ´Ù.

°ª ¼³¸í
GCL_CBCLSEXTRA

cbClsExtra ¸â¹ö°ª. Ŭ·¡½ºÀÇ ¿©ºÐ ¸Þ¸ð¸® ¾çÀ» º¯°æÇϸç ÀÌ °ªÀ» º¯°æÇÏ´õ¶óµµ ±âÁ¸¿¡ µé¾î´Â °ªÀº º¯ÇÏÁö ¾Ê´Â´Ù.

GCL_CBWNDEXTRA

cbWndExtra ¸â¹ö°ª. À©µµ¿ìÀÇ ¿©ºÐ ¸Þ¸ð¸® ¾çÀ» º¯°æÇϸç ÀÌ °ªÀ» º¯°æÇÏ´õ¶óµµ ±âÁ¸¿¡ µé¾î´Â °ªÀº º¯ÇÏÁö ¾Ê´Â´Ù.

GCL_HBRBACKGROUND À©µµ¿ìÀÇ ¹è°æ ºê·¯½Ã ÇÚµé. hbrBackground ¸â¹ö
GCL_HCURSOR À©µµ¿ìÀÇ Ä¿¼­ ÇÚµé. hCursor ¸â¹ö
GCL_HICON À©µµ¿ìÀÇ ¾ÆÀÌÄÜ ÇÚµé. hIcon ¸â¹ö
GCL_HMODULE À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇÑ ÇÁ·Î±×·¥ÀÇ ÇÚµé. hInstance ¸â¹ö
GCL_MENUNAME ¸Þ´º ¸®¼Ò½º ¹®ÀÚ¿­. hMenu ¸â¹ö
GCL_STYLE À©µµ¿ì Ŭ·¡½ºÀÇ ½ºÅ¸ÀÏ. style ¸â¹ö
GCL_WNDPROC À©µµ¿ì ÇÁ·Î½ÃÀúÀÇ ÁÖ¼Ò. lpfnWndProc ¸â¹ö

¶Ç´Â À©µµ¿ì Ŭ·¡½º¿¡ ¿©ºÐ ¸Þ¸ð¸®°¡ µî·ÏµÇ¾î ÀÖÀ» °æ¿ì ¿©ºÐ ¸Þ¸ð¸®ÀÇ ¿ÀÇÁ¼ÂÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ °ªÀº ¹Ýµå½Ã ¾ç¼ö¿©¾ß Çϸç cbClsExtra-4º¸´Ù´Â ÀÛ¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¿©ºÐ ¸Þ¸ð¸®°¡ 16¹ÙÀÌÆ® ÁöÁ¤µÇ¾î ÀÖÀ¸¸é nIndex´Â 0~12±îÁö ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

¢ºdwNewLong : »õ·Î º¯°æÇÒ 32ºñÆ®°ªÀ̸ç nIndex¿¡ µû¶ó °ªÀÇ Àǹ̴ ´Þ¶óÁø´Ù.

¸®ÅÏ

¼º°øÇϸé ÀÌÀü¿¡ ¼³Á¤µÇ¾î ÀÖ´ø 32ºñÆ®°ªÀ» ¸®ÅÏÇÏ¸ç °ªÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê¾ÒÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù. ¶ÇÇÑ ¿¡·¯°¡ ¹ß»ýÇصµ 0À» ¸®ÅÏÇÑ´Ù.

¼³¸í

À©µµ¿ì Ŭ·¡½º´Â WNDCLASS(EX) ±¸Á¶Ã¼¿¡ ÀÇÇØ ¼Ó¼ºµéÀÌ ÁöÁ¤µÇ¸ç RegisterClass(Ex) ÇÔ¼ö¿¡ ÀÇÇØ ÀÌ ¼Ó¼ºµéÀÌ µî·ÏµÈ´Ù. ÀÏ´Ü µî·ÏµÈ Ŭ·¡½ºÀÇ ¼Ó¼ºÀ» º¯°æÇÏ°íÀÚ ÇÒ ¶§ SetClassLong ÇÔ¼ö°¡ »ç¿ëµÇ´Âµ¥ WNDCLASS ±¸Á¶Ã¼ÀÇ ¸â¹ö Áß ¾î¶² °ªÀ» º¯°æÇÒ °ÍÀΰ¡¸¦ nIndex Àμö·Î ÁöÁ¤ÇØ ÁÖ°í dwNewLong Àμö·Î »õ·Î¿î ¼Ó¼º°ªÀ» ÁöÁ¤ÇØ ÁÖ¸é µÈ´Ù. ´Ü À©µµ¿ì Ŭ·¡½ºÀÇ Á¤º¸ Áß À̸§Àº º¯°æÇÒ ¼ö ¾ø´Ù.

À©µµ¿ì Ŭ·¡½ºÀÇ ¼Ó¼º Áß ¾î¶² °ÍÀ» º¯°æÇϴ°¡¿¡ µû¶ó È¿°ú´Â ´Ù¾çÇÏ°Ô ³ªÅ¸³­´Ù. ¹è°æ ºê·¯½Ã¸¦ º¯°æÇÒ ¼öµµ ÀÖ°í Ä¿¼­ ¸ð¾çÀ» ¹Ù²Ü ¼öµµ ÀÖ°í À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ º¯°æÇÒ ¼öµµ ÀÖ´Ù. À̾îÁö´Â ¿¹Á¦·Î ÀÌ ÇÔ¼öÀÇ »ç¿ë¿¹¸¦ »ìÆ캸µµ·Ï ÇÏÀÚ.

¿¹Á¦ 1

´ÙÀ½ ¿¹Á¦´Â ÀÌ¹Ì ¸¸µé¾îÁø À©µµ¿ìÀÇ Ä¿¼­¸¦ º¯°æÇÑ´Ù. À©µµ¿ìÀÇ ÀÛ¾÷¿µ¿ª¿¡¼­ º¸¿©ÁÙ Ä¿¼­´Â À©µµ¿ì Ŭ·¡½ºÀÇ hCursor¸â¹ö¿¡¼­ ÁöÁ¤Çϴµ¥ ÀÌ ¸â¹ö¸¦ SetClassLong ÇÔ¼ö·Î ½ÇÇàÁß¿¡ º¯°æÇÏ´Â ¿¹¸¦ º¸ÀδÙ.

HCURSOR hArrow, hIBeam, hWait, hNow;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="¸¶¿ì½º ¹öÆ°À» ´©¸£¸é Ä¿¼­ ¸ð¾çÀÌ ¹Ù²ò´Ï´Ù";

	switch(iMessage) {
	case WM_CREATE:
		hArrow=LoadCursor(NULL,IDC_ARROW);
		hIBeam=LoadCursor(NULL,IDC_IBEAM);
		hWait=LoadCursor(NULL,IDC_WAIT);
		hNow=hArrow;
		return 0;
	case WM_LBUTTONDOWN:
		if (hNow==hArrow)
			hNow=hIBeam;
		else if (hNow==hIBeam)
			hNow=hWait;
		else
			hNow=hArrow;
		SetClassLong(hWnd, GCL_HCURSOR,(LONG)hNow);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

¼¼°³ÀÇ Ç¥ÁØ Ä¿¼­¸¦ ¹Ì¸® ¸¸µé¾î µÎ°í ¸¶¿ì½º ¹öÆ°À» ´©¸¦ ¶§¸¶´Ù À©µµ¿ì Ŭ·¡½ºÀÇ hCursor ¸â¹ö¸¦ º¯°æÇÔÀ¸·Î½á Ä¿¼­¸¦ ¹Ù²Ù°í ÀÖ´Ù. ÀÛ¾÷¿µ¿ª ÀüüÀÇ Ä¿¼­¸¦ º¯°æÇÒ ¶§´Â ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ°í È­¸éÀÇ Æ¯Á¤ ºÎÀ§¿¡¼­¸¸ Ä¿¼­¸¦ º¯°æÇÒ ¶§´Â WM_SETCURSOR ¸Þ½ÃÁö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

¿¹Á¦ 2

´ÙÀ½ ¿¹Á¦´Â À©µµ¿ì Ŭ·¡½º¿¡ µî·ÏµÇ¾î ÀÖ´Â ¸Þ½ÃÁö ó¸® ÇÔ¼ö¸¦ ½ÇÇàÁß¿¡ º¯°æÇÏ´Â Àü¿ª ¼­ºêŬ·¡½ÌÀ» º¸¿©ÁØ´Ù. À©µµ¿ì Ŭ·¡½ºÀÇ À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ º¯°æÇϸé ÀÌÈÄ ÀÌ À©µµ¿ì Ŭ·¡½º·ÎºÎÅÍ »ý¼ºµÇ´Â ¸ðµç À©µµ¿ìµéÀº º¯°æµÈ À©µµ¿ì ÇÁ·Î½ÃÀú°¡ ¸Þ½ÃÁö¸¦ ó¸®ÇÔÀ¸·Î½á ¸Þ½ÃÁö ó¸® ¹æ½ÄÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. ¸ðµç ÄÁÆ®·ÑÀÇ µ¿ÀÛ ¹æ½ÄÀ» ¹Ù²Ù°íÀÚ ÇÒ ¶§ ÀÌ ¹æ¹ýÀÌ »ç¿ëµÈ´Ù.

HWND hEdit1, hEdit2, hEdit3, hEditHidden;
WNDPROC OldEditProc;
LRESULT CALLBACK EditSubProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	char str[256];
	switch (iMessage) {
	case WM_KEYDOWN:
		if (wParam==VK_RETURN) {
			GetWindowText(hWnd,str,256);
			SetWindowText(GetParent(hWnd),str);
		}
		break;
	}
	return CallWindowProc(OldEditProc,hWnd,iMessage,wParam,lParam);
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	char Mes[]="¸ðµç ¿¡µðƮŰÀÇ EnterÅ° ÀÔ·ÂÀ» °ËÃâÇÕ´Ï´Ù";
	switch(iMessage) {
	case WM_CREATE:
		hEditHidden=CreateWindow("edit",NULL,WS_CHILD | WS_BORDER,
			10,10,200,25,hWnd,(HMENU)0,g_hInst,NULL);

		OldEditProc=(WNDPROC)SetClassLong(hEditHidden,GCL_WNDPROC,(LONG)EditSubProc);

		hEdit1=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			10,10,300,25,hWnd,(HMENU)1,g_hInst,NULL);
		hEdit2=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			10,50,300,25,hWnd,(HMENU)1,g_hInst,NULL);
		hEdit3=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			10,90,300,25,hWnd,(HMENU)1,g_hInst,NULL);
		SetFocus(hEdit1);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,120,Mes,strlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		SetClassLong(hEdit1,GCL_WNDPROC,(LONG)OldEditProc);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

4°³ÀÇ ¿¡µðÆ® ÄÁÆ®·ÑÀ» »ý¼ºÇϴµ¥ ÀÌ Áß hEditHidden´Â Àü¿ª ¼­ºê Ŭ·¡½ÌÀ» À§ÇØ »ç¿ëÇÒ ¼û°ÜÁø ¿¡µðÆ® ÄÁÆ®·ÑÀÌ´Ù. À©µµ¿ì Ŭ·¡½º´Â À©µµ¿ì ÇÚµé·Î °£Á¢ÀûÀ¸·Î ÁöÁ¤ÇÒ ¼ö Àֱ⠶§¹®¿¡ Àü¿ª ¼­ºê Ŭ·¡½ÌÀ» Çϱâ À§Çؼ­´Â ¹Ýµå½Ã ¸ÕÀú ¸¸µé¾îÁø À©µµ¿ì°¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¯³ª Àü¿ª ¼­ºê Ŭ·¡½ÌÀÇ È¿°ú´Â ¸ÕÀú ¸¸µé¾îÁø À©µµ¿ì¿¡´Â Àû¿ëµÇÁö ¾ÊÀ¸¹Ç·Î ¼û°ÜÁø À©µµ¿ì¸¦ ¸ÕÀú ¸¸µé°í ÀÌ À©µµ¿ì¸¦ ´ë»óÀ¸·Î Àü¿ª ¼­ºêŬ·¡½ÌÀ» ÇÑ´Ù.

Àü¿ª ¼­ºêŬ·¡½ÌÀº SetClassLong ÇÔ¼ö·Î GCL_WNDPROC°ªÀ» »õ·Î¿î À©µµ¿ì ÇÁ·Î½ÃÀú·Î ´ëüÇÔÀ¸·Î½á ±¸ÇöµÈ´Ù. ¿¹Á¦¿¡¼­´Â »õ·Î¿î À©µµ¿ì ÇÁ·Î½ÃÀú·Î »ç¿ëÇÒ EditSubProcÀ̶ó´Â Äݹé ÇÔ¼ö°¡ ¹Ì¸® Á¤ÀǵǾî ÀÖÀ¸¸ç ÀÌ ÇÔ¼ö´Â ¹Ýµå½Ã WndProc°ú °°Àº ¿øÇüÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. À©µµ¿ì ÇÁ·Î½ÃÀú¸¦ »õ·Î¿î ÇÔ¼ö·Î ´ëüÇÒ ¶§ ¹Ýµå½Ã ÀÌÀü¿¡ ¼³Á¤µÇ¾î ÀÖ´ø À©µµ¿ì ÇÁ·Î½ÃÀú ÁÖ¼Ò¸¦ ÀúÀåÇØ µÎ¾î¾ß µðÆúÆ® ¸Þ½ÃÁö 󸮸¦ ÇÒ ¼ö Àִµ¥ ¿¹Á¦¿¡¼­´Â OldEditProc À̶ó´Â º¯¼ö¿¡ SetClassLong ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â ÀÌÀü ÇÔ¼öÀÇ ¹øÁö¸¦ ÀúÀåÇØ µÎ¾ú´Ù.

Àü¿ª ¼­ºêŬ·¡½ÌÀ» ÇÑ ÈÄ ¸¸µé¾îÁø hEdit1, hEdit2, hEdit3 ÄÁÆ®·ÑÀº EditSubProcÀ̶ó´Â ÇÔ¼ö°¡ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ°Ô µÈ´Ù. ÀÌ ÇÔ¼ö¿¡¼­´Â ¿£ÅÍÅ° ÀÔ·ÂÀÌ ÀÖÀ» ¶§ ÀÚ½ÅÀÇ ÅؽºÆ®¸¦ ÀÐ¾î ¸ÞÀÎ À©µµ¿ìÀÇ Ä¸¼Ç¿¡ Ãâ·ÂÇÏ´Â ÀÏÀ» ÇÏ°í Àִµ¥ ÀÌ¿Ü¿¡ ¾î¶°ÇÑ ´Ù¸¥ ¸Þ½ÃÁö 󸮵µ °¡´ÉÇÏ´Ù.

¿¡µðÆ®¿¡ ¹®ÀÚ¿­À» ÀÔ·ÂÇÑ ÈÄ EnterÅ°¸¦ ´©¸£¸é ¸ÞÀÎ À©µµ¿ìÀÇ Ä¸¼ÇÀÌ Áï½Ã º¯°æµÈ´Ù.

¿¹Á¦ 3

´ÙÀ½ ¿¹Á¦´Â À©µµ¿ì Ŭ·¡½ºÀÇ ½ºÅ¸ÀÏÀ» ½ÇÇàÁß¿¡ º¯°æÇÑ´Ù.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char Mes[]="¸¶¿ì½º ¹öÆ°À» ´©¸¦ ¶§¸¶´Ù HREDRAW, VREDRAW ½ºÅ¸ÀÏÀ» Åä±ÛÇÕ´Ï´Ù";
	RECT rt;
	DWORD clsStyle;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		clsStyle=GetClassLong(hWnd,GCL_STYLE);
		if (clsStyle & CS_HREDRAW) {
			clsStyle=clsStyle & ~(CS_HREDRAW | CS_VREDRAW);
		} else {
			clsStyle=clsStyle | (CS_HREDRAW | CS_VREDRAW);
		}
		SetClassLong(hWnd,GCL_STYLE,clsStyle);
		InvalidateRect(hWnd,NULL,TRUE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		GetClientRect(hWnd,&rt);
		Ellipse(hdc,rt.left,rt.top+50,rt.right,rt.bottom);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

¸¶¿ì½º ¹öÆ°À» ´©¸¦ ¶§¸¶´Ù CS_HREDRAW, CS_VREDRAW ½ºÅ¸ÀÏÀ» Åä±ÛÇÔÀ¸·Î½á ÀÛ¾÷¿µ¿ª ±×¸®±â¿¡ ¿µÇâÀ» ÁØ´Ù. ÀÌ µÎ ½ºÅ¸ÀÏÀÌ ÁöÁ¤µÇ¾î ÀÖÀ¸¸é ÀÛ¾÷¿µ¿ª Å©±â°¡ ¹Ù²ð ¶§¸¶´Ù ´Ù½Ã ±×·ÁÁöÁö¸¸ ±×·¸Áö ¾ÊÀ¸¸é Å©±â°¡ ¹Ù²î¾îµµ ´Ù½Ã ±×·ÁÁöÁö ¾Ê±â ¶§¹®¿¡ ´ÙÀ½°ú °°ÀÌ È­¸éÀÌ ±úÁö°Ô µÈ´Ù.

ÀÌ¿Ü¿¡ ÀÌ ÇÔ¼ö´Â À©µµ¿ìÀÇ ¹è°æ ºê·¯½Ã¸¦ ¹Ù²Ù°Å³ª ¸Þ´º¸¦ ¹Ù²Ù´Â ¿ëµµ·Îµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

Âü°íÇÔ¼ö

GetClassLong : À©µµ¿ì Ŭ·¡½ºÀÇ ¼Ó¼º°ªÀ» Á¶»çÇÑ´Ù.

Ç÷§Æû

95ÀÌ»ó

ÂüÁ¶

À©µµ¿ì Ŭ·¡½º¿¡ ´ëÇؼ­´Â 10-2ÀýÀ» ÂüÁ¶ÇÏ°í ¼­ºêŬ·¡½Ì¿¡ ´ëÇؼ­´Â 11-2ÀýÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.


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