윈도우가 출력하는 사이즈 및 위치를 정의 할 수 있다.

 프로그램은 사각형을 만드는 방법을 총 2가지 방법이 있다.


 1. 두점을 알고 있을 경우.

 2. 한 점을 알고, 크기를 알고 있을 경우.


 1.은 사각형의 점으로 왼측 상단의 점과 우측 하단의 점 두개의 점을 알고 있다면, 쉽게 사각형을 만들 수 있다. (사각형을 그리는 프로그래밍을 할때, 사용한다.)


 2.는 기준이 되는 사각형의 점 1개를 만들고, 나머지는 넓이와 높이를 가지는 값을 가진다.


 1이든 2이든 모든 값은 4개씩 필요하다.(평면의 독립변수는 {x, y}로 2개이다.)


 윈도우 출력은 2.을 기준으로 작업한다.


 

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,
                        10,// X
                        100,// Y
                        400,// Width
                        400,// Height
                        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



 전과 다른 점은 기존 값을 가지고 처리하는 것이 아니라, 값을 정의해서 처리하는 것이다.


 X,Y, Width, Height로 나뉘고, 위치와 크기를 조절 할 수 있다.


 유동적으로 크기를 조절하는 경우는 다음과 같은 소스로 고치면 된다.

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,
                        10,// X
                        100,// Y
                        400,// Width
                        400,// Height
                        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:
            
            MoveWindow(hWnd, LOWORD(lParam),HIWORD(lParam), 5005001);
            
            break;
    }
    return DefWindowProc(hWnd,iMessage,wParam, lParam);
}
 
cs



 다음과 같이 하면, 클릭시 크기가 변하면서 이동할 것이다.


 lParam에서 마우스 클릭한 위치를 저장하고 있기 때문에, X와 Y가 들어가 있다.

 X, Y에 맞춰서 이동되기 때문에 클릭시 이동하는 현상이 있다.


 이 이동이 없길 원한다면, GetWindowRect()이라는 걸 이용해서 X, Y을 찾아 줘야한다.


 참조 : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633519.aspx


 Client(내부 윈도우)는 GetClientRect()을 이용해서 사용한다.

Posted by JunkMam
,