Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

codingfarm

2. 다양한 변형 본문

Windows/윈도우즈 API

2. 다양한 변형

scarecrow1992 2020. 11. 17. 23:47

 

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
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("First");
 
int APIENTRY 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 = lpszClass;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);
 
    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, (HMENU)NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
 
    while (GetMessage(&Message, 000)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    switch (iMessage) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
cs

 

 

배경색 꾸미기

  • 17번째 줄에서 hbrBackground에 흰색 브러시를 지정하여 배경색이 흰색이 되었다.

 

GetStockObject

  • 윈도우에서 기본적으로 제공하는 브러시, 펜 등의 핸들을 구하는 함수
  • 기본적으로 제공하는 브러시의 색은 흰색, 검정, 회색뿐이다.
  • 다른색을 칠하고 싶으면 별도의 방법을 써야 한다.

아래 코드는 파란색의 배경을 가지는 윈도우를 그린다.

WndClass.hbrBackground = CreateSolidBrush(RGB(0,0,255));

아래 코드는 빨간색의 기울어진 바둑판 배경을 그린다.

WndClass.hbrBackground = CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,0));

원칙대로 하려면 파괴도 해야하는데 여기서는 생략한다.

이방법에 대한 자세한 설명은 추후 알아가겠다.

 


커서 바꾸기

  • WndClass에서 커서를 지정하는 멤버가 아래와 같이 정의된다.
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  • 윈도우 위에 마우스 커서를 위치시키면 화살표 모양의 표준 커서가 나타난다.
  • hCursor 멤버는 윈도우가 기본적으로 사용할 커서를 지정한다.
  • LoadCursor 함수는 커서를 읽어 오는 함수이다.
HCURSOR LoadCursor ( 
HINSTANCE hInstance, 
LPCTSTR lpCursorName);
매개변수 기능
hInstance 커서를 가지고 있는 프로그램의 인스턴스 핸들
윈도우즈가 제공하는 표준커서를 사용하려면 NULL을 전달
lpCursorName 사용하고자 하는 커서의 이름을 지정

lpCursorName으로 전달 가능한, 윈도우즈가 디폴트로 제공하는 커서에는 다음과 같은 종류가 있다.

설명
IDC_ARROW 화살표 모양
IDC_CROSS 십자 모양
IDC_IBEAM I자 모양
IDC_NO 원안에 빗금이 쳐진 모양
IDC-WAIT 모래시계 모양

 


윈도우의 타이틀 바꾸기

  • CreateWindows 함수의 두번째 인수인 lpszClass 문자열에 윈도우즈의 타이틀바에 나오는 문자열을 바꿀 수 있다.
    • 실행중에 타이틀바의 문자열을 바꾸고 싶다면 wsprintf등의 서식 조립함수로 조립하여 사용하면 된다.
  • 4~7번째 인수로 윈도우의 크기와 위치를 지정할 수 있다.

 


윈도우 스타일

  • CreateWindow 함수의 세번째 인수 dwStyle로 윈도우의 모양과 동작 방식을 결정한다.
설명
WS_CAPTION 타이틀 바를 가진다.
WS_HSCROLL 수평 스크롤 바를 가진다.
WS_VSCROLL 수직 스크롤 바를 가진다.
WS_MAXIMIZEBOX 최대화 버튼을 가진다.
WS_MINIMIZEBOX 최소화 버튼을 가진다.
WS_SYSMENU 시스템 메뉴를 가진다.
WS_THICKFRAME 크기를 조절할 수 있는 경계선을 가진다.
  • 이 값들은 OR연산자로 연결하여 여러가지 속성을 한꺼번에 지정 가능하다.
Comments