CHAP. 9
윈도우 스타일
1
2
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg)
{
case WM_CREATE:
hWnd2 = CreateWindow(
"WND2",
"World",
WS_OVERLAPPEDWINDOW,
320, 0, 320, 240,
hWnd, NULL,
hInstance,
NULL
);
ShowWindow(hWnd2, SW_SHOW);
break;
} …
}
이거 빼면 화면에 윈도우 안
나타난다
3
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg) {
case WM_CREATE:
hWnd2 = CreateWindow(
"WND2",
"World",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
320, 0, 320, 240,
hWnd, NULL,
hInstance,
NULL
);
ShowWindow(hWnd2, SW_SHOW);
break;
} …
}
다음과 같이 하면 생략할 수 있다
생성과 동시에 화면출력
옵션 (스타일) 지정
4
CreateWindow(…, DWORD dwStyle,…)
윈도우 생성
윈도우 생성 함수: 3번째 인자
5
꼭 알아두어야 할 스타일
WS_BORDER 윈도우 테두리 나타남
WS_CHILD 자식 윈도우로 설정
WS_POPUP 팝업 윈도우로 설정
WS_VISIBLE 윈도우를 생성과 동시에 화면에 표시
WS_OVERLAPPEDWINDOW 일반 속성 모두 포함
WS_CHILD 는 WS_POPUP과 함께 사용 불가 (반대 속성)
어떤 속성은 다른 속성들의 조합
기타 속성은 MSDN을 참고
WS_OVERLAPPED WS_CAPTION
WS_SYSMENU WS_THICKFRAME
WS_MINIMIZEBOX WS_MAXIMIZEBOX
※ MSDN 참고
6
스타일 추가 및 제거
WS_OVERLAPPEDWINDOW에서 WS_SYSMENU
제거해 보자
7
style = style & (~WS_SYSMENU);
스타일 추가: OR ( | )
스타일 제거: Negation ( ~ ) 및 AND ( & ) 연산 적용
DWORD style;
style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
style = _______________________ ;
hWnd2 = CreateWindow(
"WND2",
"WORLD",
style,
320, 0, 320, 240,
hWnd, NULL, _hInstance, NULL
);
비트 연산 잘 이해가 안되면 다음 참조
8
#include <stdio.h>
#define SW1 1 // 0001
#define SW2 2 // 0010
#define SW3 4 // 0100
#define SW4 8 // 1000
main()
{
int sw = 0; // 모든 스위치가 꺼져 있다
sw = SW1; // 1번 스위치 ON
sw = sw | SW2; // 2번 스위치 ON
sw = sw | SW3; // 3번 스위치 ON
if (sw & SW2) // 2번 스위치 ON인지 검사
printf(“ON”);
}
9
int sw = 0;
sw = SW1;
sw = sw | SW2;
sw = sw | SW3;
sw = sw & (~WS2);
if (sw & SW3) printf(“ON”);
0 0 0 0 0 0 0 1
sw
0 0 0 0 0 0 1 0 SW2
0 0 0 0 0 0 1 1
|
sw2 sw1
10
int sw = 0;
sw = SW1;
sw = sw | SW2;
sw = sw | SW3;
sw = sw & (~WS2);
if (sw & SW3) printf(“ON”);
0 0 0 0 0 0 1 1
sw
0 0 0 0 0 1 0 0 SW3
0 0 0 0 0 1 1 1
|
sw2 sw1sw3
11
int sw = 0;
sw = SW1;
sw = sw | SW2;
sw = sw | SW3;
sw = sw & (~WS2);
if (sw & SW3) printf(“ON”);
0 0 0 0 0 1 1 1
sw
1 1 1 1 1 1 0 1 ~SW2
0 0 0 0 0 1 0 1
&
SW2: OFF
12
int sw = 0;
sw = SW1;
sw = sw | SW2;
sw = sw | SW3;
sw = sw & (~WS2);
if (sw & SW3) printf(“ON”);
0 0 0 0 0 1 0 1
0 0 0 0 0 1 0 0 SW3
0 0 0 0 0 1 0 0 → 4 > 0
&
SW3: ON true
13
WS_CHILD 테스트
WS_CHILD 스타일 추가해 보자
부모 윈도우의 안쪽에 위치한다
부모 윈도우 벗어날 수 없음
14
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
static HWND hWnd2;
switch(mesg) {
case WM_CREATE:
hWnd2 = CreateWindow(
"WND2",
"World",
WS_OVERLAPPEDWINDOW | WS_VISIBLE |
WS_CHILD,
320, 0, 320, 240,
hWnd,
NULL,
_hInstance,
NULL
);
break;
} …
}
다른 윈도우의 안쪽에 위치 하므로
반드시 부모 윈도우가 있어야 한다

09 윈도우스타일

  • 1.
  • 2.
    2 LRESULT CALLBACK WndProc(HWNDhWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hWnd2; switch(mesg) { case WM_CREATE: hWnd2 = CreateWindow( "WND2", "World", WS_OVERLAPPEDWINDOW, 320, 0, 320, 240, hWnd, NULL, hInstance, NULL ); ShowWindow(hWnd2, SW_SHOW); break; } … } 이거 빼면 화면에 윈도우 안 나타난다
  • 3.
    3 LRESULT CALLBACK WndProc(HWNDhWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hWnd2; switch(mesg) { case WM_CREATE: hWnd2 = CreateWindow( "WND2", "World", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 320, 0, 320, 240, hWnd, NULL, hInstance, NULL ); ShowWindow(hWnd2, SW_SHOW); break; } … } 다음과 같이 하면 생략할 수 있다 생성과 동시에 화면출력 옵션 (스타일) 지정
  • 4.
    4 CreateWindow(…, DWORD dwStyle,…) 윈도우생성 윈도우 생성 함수: 3번째 인자
  • 5.
    5 꼭 알아두어야 할스타일 WS_BORDER 윈도우 테두리 나타남 WS_CHILD 자식 윈도우로 설정 WS_POPUP 팝업 윈도우로 설정 WS_VISIBLE 윈도우를 생성과 동시에 화면에 표시 WS_OVERLAPPEDWINDOW 일반 속성 모두 포함 WS_CHILD 는 WS_POPUP과 함께 사용 불가 (반대 속성) 어떤 속성은 다른 속성들의 조합 기타 속성은 MSDN을 참고 WS_OVERLAPPED WS_CAPTION WS_SYSMENU WS_THICKFRAME WS_MINIMIZEBOX WS_MAXIMIZEBOX ※ MSDN 참고
  • 6.
    6 스타일 추가 및제거 WS_OVERLAPPEDWINDOW에서 WS_SYSMENU 제거해 보자
  • 7.
    7 style = style& (~WS_SYSMENU); 스타일 추가: OR ( | ) 스타일 제거: Negation ( ~ ) 및 AND ( & ) 연산 적용 DWORD style; style = WS_OVERLAPPEDWINDOW | WS_VISIBLE; style = _______________________ ; hWnd2 = CreateWindow( "WND2", "WORLD", style, 320, 0, 320, 240, hWnd, NULL, _hInstance, NULL ); 비트 연산 잘 이해가 안되면 다음 참조
  • 8.
    8 #include <stdio.h> #define SW11 // 0001 #define SW2 2 // 0010 #define SW3 4 // 0100 #define SW4 8 // 1000 main() { int sw = 0; // 모든 스위치가 꺼져 있다 sw = SW1; // 1번 스위치 ON sw = sw | SW2; // 2번 스위치 ON sw = sw | SW3; // 3번 스위치 ON if (sw & SW2) // 2번 스위치 ON인지 검사 printf(“ON”); }
  • 9.
    9 int sw =0; sw = SW1; sw = sw | SW2; sw = sw | SW3; sw = sw & (~WS2); if (sw & SW3) printf(“ON”); 0 0 0 0 0 0 0 1 sw 0 0 0 0 0 0 1 0 SW2 0 0 0 0 0 0 1 1 | sw2 sw1
  • 10.
    10 int sw =0; sw = SW1; sw = sw | SW2; sw = sw | SW3; sw = sw & (~WS2); if (sw & SW3) printf(“ON”); 0 0 0 0 0 0 1 1 sw 0 0 0 0 0 1 0 0 SW3 0 0 0 0 0 1 1 1 | sw2 sw1sw3
  • 11.
    11 int sw =0; sw = SW1; sw = sw | SW2; sw = sw | SW3; sw = sw & (~WS2); if (sw & SW3) printf(“ON”); 0 0 0 0 0 1 1 1 sw 1 1 1 1 1 1 0 1 ~SW2 0 0 0 0 0 1 0 1 & SW2: OFF
  • 12.
    12 int sw =0; sw = SW1; sw = sw | SW2; sw = sw | SW3; sw = sw & (~WS2); if (sw & SW3) printf(“ON”); 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 SW3 0 0 0 0 0 1 0 0 → 4 > 0 & SW3: ON true
  • 13.
    13 WS_CHILD 테스트 WS_CHILD 스타일추가해 보자 부모 윈도우의 안쪽에 위치한다 부모 윈도우 벗어날 수 없음
  • 14.
    14 LRESULT CALLBACK WndProc(HWNDhWnd, UINT mesg, WPARAM wParam, LPARAM lParam) { static HWND hWnd2; switch(mesg) { case WM_CREATE: hWnd2 = CreateWindow( "WND2", "World", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CHILD, 320, 0, 320, 240, hWnd, NULL, _hInstance, NULL ); break; } … } 다른 윈도우의 안쪽에 위치 하므로 반드시 부모 윈도우가 있어야 한다