윈도우가 출력하는 사이즈 및 위치를 정의 할 수 있다.
프로그램은 사각형을 만드는 방법을 총 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), 500, 500, 1); 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()을 이용해서 사용한다.
'연습' 카테고리의 다른 글
Windows API 프로그래밍 -5. 윈도우 배경색 처리. - (0) | 2016.06.21 |
---|---|
Windows API 프로그래밍 -4. 윈도우 타이틀 처리. - (0) | 2016.06.20 |
Windows API 프로그래밍 -2. 윈도우 스타일 처리. - (0) | 2016.06.18 |
Windows API 프로그래밍 -1. 윈도우 메세지 처리. - (0) | 2016.06.17 |
Windows API 프로그래밍 -0. 초기 윈도우 작성 - (0) | 2016.06.16 |