SetWindowLong 함수 정리

Acccdang·2021년 4월 28일
0

WinAPI

목록 보기
1/1

SetWindowLong 함수란?

특정 Window 의 속성을 변경하는 함수 매크로이다. 32bit 값으로 메모리에 추가한다.
(프로젝트에 설정된 문자 집합(유니코드 or 멀티바이트)에 따라 W, A 함수로 전개된다.)

공식 문서에 따르면 32, 64bit 모두 호환을 위해 SetWindowLongPtr 함수로 대체되었다고 한다. 처리 및 인자값은 동일하니 추후 이걸로 사용하면 될 것 같다.

Syntax는 아래와 같다.

LONG SetWindowLongA(
  HWND hWnd,
  int  nIndex,
  LONG dwNewLong
);

인자값들을 하나하나 살펴보자.

  • (HWND) hWnd : 속성을 변경하려는 Window, 또는 Window에 간접적으로 속하는 class의 핸들값

  • (int) nIndex : 변경할 속성을 설정한다.

    • GWL_EXSTYLE : 새로운 확장 윈도우 스타일을 설정한다.
    • GWL_HINSTANCE : 해당 window를 생성한 응용 프로그램의 인스턴스 핸들을 변경한다.
    • GWL_ID : 윈도우 컨트롤의 ID를 변경한다.
    • GWL_STYLE : 새로운 윈도우 스타일을 설정한다.
    • GWL_USERDATA : 해당 윈도우와 연관된 32bit 값을 변경한다. 이 값은 창을 만든 응용 프로그램에서 사용함.
    • GWL_WNDPROC : 윈도우 프로시저(WndProc)의 주소를 변경한다.

    아래 속성들은 Dialog box(대화상자) 전용으로 사용된다.

    • DWL_DLGPROC : 대화상자 프로시저(DlgProc)의 주소를 변경한다.
    • DWL_MSGRESULT : DlgProc에서 처리되는 메시지의 반환값을 변경한다.
    • DWL_USER : 응용 프로그램에 대한 추가정보를 새로 설정한다.
  • (LONg) dwNewLong : 해당 속성에 대해 실제 변경할 값을 상수 형태로 설정한다. or( | ) 로 여러 값을 설정할 수 있다.
    GWL_EXSTYLE, GWL_STYLE의 경우 여러개의 윈도우 스타일을 설정할 수 있기 때문에 필요할 때 마다 아래와 같이 기록하려 한다.
    (자세한 내용은 GWL_EXSTYLE, GWL_STYLE 을 참고)

    GWL_STYLE

    • WS_CHILD : child window로 설정함. 해당 값으로 설정하면 menu bar를 사용할 수 없다. WS_POPUP과 같이 사용할 수 없다. (= WS_CHILDWINDOW)
    • WS_CLIPCHILDREN : parent window를 그릴 때 child window와 겹치는 부분(이미 사용하고 있는 부분)은 그리기 영역에서 제외시킨다.
    • WS_CLIPSIBLINGS : child window에 WM_PAINT 이벤트가 들어와 그리기 작업을 하게 될 때, 해당 child window에 다른 child window(siblings)와 겹치는 부분은 그리기 영역에서 제외시킨다.

    ※ WM_SIZE 이벤트가 발생했을 때 크기 변경을 하다 보면 전체를 지우고 다시 그리는 작업을 하는 과정에서 flickering(깜빡임) 현상이 나타난다. 이를 방지하기 위해 WS_CLIPCHILDREN , WS_CLIPSIBLINGS를 설정할 수 있다.

profile
개발이 취미가 되고픈 개발자

0개의 댓글