Windows에서 Frame이 화면에 띄워지는 형태를 다양하게 정할 수 있다.


 이것을 Window Style이라고 하고, Style의 종류는 다음을 참조하면 알 수 있다.


 참조 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms632600(v=vs.85).aspx


 Windows의 스타일은 2가지로 개발 할 수 있는데, 첫번째로 Window 객체를 만들때 정의를 내릴 수 있다.


 객체를 만들때는 CreateWindow라는 함수를 사용하는데. 여기서 스타일을 적용할때, 저잘하는 방식을 bitdata형태로 저장한다.


 쉽게 말해서 이진법으로 되어있는 데이터들로 처리한다는 것이다.


 예을 들어서 이진수 4자리는 0000이 된다.

 여기서 첫번째 자리는 세로 스크롤바. 두번째 자리는 가로 스크롤바. 세번째 자리는 최소화 버튼 활성화. 네번째 자리는 타이틀바 존재 유무.


 이런식으로 각 자리에 대한 뜻이 존재하고, 0은 off/ 1은 on 이라는 식으로 관리하게 된다.


 이렇게 할 경우에 or 연산을 붙이게 되면 원하는 속성을 정할 수 있게 되기 때문에 개발의 편의성이 존재한다.


 맨 처음 글에서 사용되느 소스를 보면 알 수 가 있다.


1
2
3
4
5
6
7
8
9
10
11
    hWnd = CreateWindow("ApiBase",
                        "ApiBase",
                        WS_OVERLAPPEDWINDOW | WS_HSCROLL,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        (HMENU)NULL,
                        hInstance,
                        NULL);
cs


 여기서 WS_OVERLAPPDWINDOW 것과 WS_HSCROLL이라는 스타일을 정할 수 있다.

 이렇게 해서 HSCROLL(수평 스크롤)을 정할 수 있게 되는 것으며, 결과로 스크롤 바가 나오는 것을 알 수 있다.


 하지만, 이 방법은 윈도우 객체가 만들어질때 사용하는 방법이다.


 그러면, 중간에 윈도우 스타일을 바꾸고 싶어지면, 어떻게 해야될까?


 Windows에서는 다음과 같은 함수를 지원해 준다.


 GetWindowLong(), SetWindowLong()


 이 두 함수는 WIndow에 대한 정보를 받아들이고/수정하는 용도로 사용하는 함수이다. 즉, 스타일만 수정하는 함수가 아니다.


 참조 :

 GetWindowLong -> https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633584(v=vs.85).aspx


 SetWindowLong -> https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633591(v=vs.85).aspx



 여기서 GWL_EXSTYLE라는 것을 SetWindowLong에 사용하게 되면, 스타일에 관련된 정보를 수정할 수 있게 된다.


 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdlib.h>
 
#include <tchar.h>
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
 
int WINAPI WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpszCmdParam,
            int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst = hInstance;
    
    //윈도우 클래스 초기화
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName="ApiBase";
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
 
    //윈도우 클래스 생성.
    RegisterClass(&WndClass);
    
    //윈도우 객체 생성.
    hWnd = CreateWindow("ApiBase",
                        "ApiBase",
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        NULL,
                        (HMENU)NULL,
                        hInstance,
                        NULL);
    
    //윈도우 창 띄우기.
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    
    return Message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    long dwStyle;
    
    switch(iMessage)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_LBUTTONDOWN:
            dwStyle = GetWindowLong(hWnd, GWL_STYLE);//현재 윈도우 스타일 받아들이기.
            dwStyle = dwStyle | WS_HSCROLL;
            SetWindowLong(hWnd, GWL_STYLE, dwStyle);
            break;
    }
    return DefWindowProc(hWnd,iMessage,wParam, lParam);
}
 
cs


이렇게 하면, 좌 클릭시 수평 스크롤이 완성되는걸 알 수 있다.

Posted by JunkMam
,