API

cbWndExtra 이용 윈도우 인스턴스 별로 개별적인 메모리 할당...

디버그정 2008. 8. 6. 15:29

cbWndExtra 이용 윈도우 인스턴스 별로 개별적인 메모리 할당...

LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong);
윈도우에 변경을 가하고자 할때 쓰는 api이다.
두번째는 변경하고자 하는 속성을 나타낸다.

윈도우 지정 디폴트 값 설명
GWL_EXSTYLE 확장 스타일
GWL_STYLE 윈도우 스타일
GWL_WNDPROC 윈도우 프로시저의 번지
GWL_HINSTANCE 인스턴스 핸들
GWL_ID 윈도우의 ID
GWL_USERDATA 윈도우와 관련된 사용자 데이터
DWL_DLGPROC 대화상자 프로시저의 주소
DWL_MSGRESULT 대화상자 프로시저의 리턴값
DWL_USER 사용자 데이터

그런데 사용자가 임의로 윈도우에 여분 메모리가 있을 경우
여분 메모리의 오프셋을 지정할 수도 있다.
윈도우 클래스 등록시에 사용되는 WNDCLASS(EX)구조체의
cbWndExtra 멤버 변수에 여기에 사용된다.
이 값은 반드시 양수여야 하며 cbWndExtra-4보다는 작아야 한다.
예를 들어 여분 메모리가 16바이트 지정되어 있으면 nIndex는 0~12까지 지정할 수 있다.

ex)
SetWindowLong(hWnd, 0, 10);
SetWindowLong(hWnd, 4, RGB(0,0,255));

int iCount=GetWindowLong(hWnd,0);
COLORREF cr=GetWindowLong(hWnd,4);
이런 식으로 사용가능


보통 GWL_USERDATA 를 지정핼 사용자 정의 데이터를 넘겨주는데
그것 말고도 위의 방법이 존재했다.
프로그래머가 컨트롤을 직접제작시 인스턴스별 넘겨줄 데이터를 세팅할 경우
사용하면 좋을 듯 싶다.


참고로 윈도우 디폴트 값은 다음과 같다.
Window field offsets for GetWindowLong()
#define GWL_WNDPROC         (-4)
#define GWL_HINSTANCE       (-6)
#define GWL_HWNDPARENT      (-8)
#define GWL_STYLE           (-16)
#define GWL_EXSTYLE         (-20)
#define GWL_USERDATA        (-21)
#define GWL_ID              (-12)
모두 음수로 처리함을 볼 수 있다.