728x90
반응형
소스
>배경색 바꾸기
WndClass의 멤버중 배경색상을 지정하는 hbrBackground가 흰색 브러시로 지정.
WndClass.hbrBackground=GetStockObject(WHITE_BRUSH);
이 함수의 인수로 WHITE_BRUSH가 사용되었기 때문에 배경색을 칠하는 데 흰색 브러시가 사용되었다. 이 값을 BLACK_BRUSH로 변경하면 검정색이 배경색으로 사용되며 LTGRAY_BRUSH로 변경하면 옅은 회색 배경이 만들어진다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(92).png)
>커서 바꾸기
WndClass에서 커서를 지정하는 멤버가 다음과 같이 정의
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
hCursor 멤버는 윈도우가 기본적으로 사용할 커서를 지정하며 LoadCursor 함수는 커서를 읽어오는 함수이다.
HCURSOR LoadCursor( HINSTANCE hInstance, LPCTSTR lpCursorName );
첫번째 인수 hInstance는 커서를 가지고 있는 프로그램의 인스턴스 핸들이되 윈도우즈가 제공하는 디폴트 커서를 사용하려면 이 인수를 NULL로 지정하면 된다. 두번째 인수 lpCursorName은 사용하고자 하는 커서의 이름을 지정한다. 윈도우즈가 디폴트로 제공하는 커서에는 다음과 같은 종류가 있다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(93).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(94).png)
>윈도우의 타이틀 바꾸기
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(95).png)
First 를 컴파일 때 2byte 씩 유니코드로 읽는데, F 와 i 의 각각 값을 +해서 읽기 때문에 다른 값을 출력 할 경우가 있으므로, 컴파일 시 2byte 씩 Fi에 대한 유니로드로 읽을 수 있도록 L을 붙이거나 TEXT("First") , _T("First") 로 써준다.
<win32> <MFC> 권장
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(96).png)
>윈도우의 크기 바꾸기
윈도우의 크기를 지정하는 값은 CreateWindow의 4번째~7번째 인수까지이며 First예제에서는 모두 CW_USEDEFAULT를 사용하여 윈도우즈가 정해주는대로 크기와 위치를 사용
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(97).png)
>윈도우 스타일
CreateWindow함수의 네번째 인수 dwStyle은 윈도우즈의 여러가지 속성을 정의하는 32비트 정수값이며 이 값을 변경함에 따라 다양한 모양의 윈도우를 만든다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(98).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(99).png)
First예제에서 사용하는 WS_OVERLAPPEDWINDOW는 다음과 같이 정의되어 있다.
#define WS_OVERLAPPEDWINDOW ( WS_OVERLAPPED | \
WS_CAPTION | \
WS_SYSMENU | \
WS_THICKFRAME | \
WS_MINIMIZEBOX | \
WS_MAXIMIZEBOX)
>DC의 필요성
출력을 위한 모든 데이터를 가지는 구조체
DC는 출력에 필요한 모든 정보를 가지는 구조체이며 모든 출력 함수는 DC를 참조하여 출력을 내보낸다.
DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며 프로그램은 DC의 정보를 참조하여 그리기를 하고
DC의 정보를 조작하여 그리는 방법을 변경한다. 운영체제는 프로그램들끼리 상호 영역을 침법하지 않고 최대한
DC에는 그리기에 필요한 여러 가지 정보가 저장되어 있으며 프로그램은 DC의 정보를 참조하여 그리기를 하고
DC의 정보를 조작하여 그리는 방법을 변경한다. 운영체제는 프로그램들끼리 상호 영역을 침법하지 않고 최대한
효율적으로 그리기를 할 수 있도록 DC의 정보를 관리한다.
>문자열 출력
WidProc 함수에 추가.
우리가 사용하고자 하는 시스템 리소스들은 외부에서 직접적으로 제어가 불가능 하다.
그렇기 HANDLE 이라는 개념을 사용한다. 이떄 DC 를 제어하는 핸들이 HDC 이다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(100).png)
>WM_PAINT 메시지
윈도우를 다른 윈도우로 살짝 가렸다가 다시 드러나도록 하거나 윈도우의 크기를 변경시키면 출력되어 있던 문자열이 사라져간다.
운영체제인 윈도우즈가 화면을 보관 및 복구해 주지 않기 때문
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(101).png)
도스에서는 한번에 하나의 프로그램만 실행하며 화면을 혼자서 사용하므로 한번 출력해 놓으면 일부러 지우지 않는한 절대로 화면이 지워지지 않는다. 하지만 멀티태스킹 시스템인 윈도우즈에서는 여러 개의 윈도우가 겹칠 수 있으므로 한 번 출력해 놓은 문자열이 언제까지고 그대로 그 자리에 있는다는 보장이 없다. 다른 윈도우에 의해 가려졌다가 다시 나타나면 가려졌던 윈도우는 지워져 있게 된다
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(102).png)
WM_PAINT 로 항시 호출 한다는 개념.
>DC를 얻는 방법
화면으로 출력을 하기 위해서는 GetDC함수를 사용하여 DC를 얻고 사용 후 ReleaseDC로 해제해 주는 것
HDC GetDC(HWND hWnd);
int ReleaseDC(HWND hWnd,HDC hDC);
GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 반납, GetDC에 의해 얻어진 핸들은 사용 후에 반드시 ReleaseDC 함수에 의해 해제
DC도 메모리를 차지하므로 할당 후 해제 원칙을 반드시 준수
WM_PAINT 메시지 루틴에서만 사용
WM_PAINT 메시지 처리 루틴에서는 DC 핸들을 GetDC로 얻지 않고 BeginPaint 함수로 얻으며 핸들을 해제할 때는 EndPaint 함수를 사용.
GetDC는 DC 핸들을 얻는 일반적인 방법이며 BeginPaint는 WM_PAINT 메시지내에서 그림 그리기 준비를 하는 좀 더 전문적인 함수
HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
BOOL EndPaint(HWND hWnd,CONST PAINTSTRUCT *lpPaint);
BeginPaint 함수는 윈도우 핸들 외에도 페인트 정보 구조체를 인수로 요구하며 이 구조체는 그림 그리기에 필요한 정보를 담는다
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(103).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(106).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(107).png)
LONG top;
LONG right;
LONG bottom;![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(108).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(109).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(110).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(111).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(114).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(115).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(116).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(117).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(118).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(120).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(121).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(124).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(125).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(126).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(128).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(129).png)
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
WndProc 선두에서 PAINTSTRUCT형의 구조체를 지역 변수로 선언하고 BeginPaint 함수를 호출한 후 그 리턴값을 hdc라는 변수에 대입받아 GDI 함수에 사용하고 EndPaint로 그리기를 종료
>TextOut
문자열을 출력하는 TextOut 함수이며 도스의 printf에 해당하는 함수
BOOL TextOut(hdc, nXStart, nYStart, lpszString, cbString)
문자열이 출력될 좌표 문자 문자열 사이즈
문자열의 정렬 방법을 변경하는 함수는 SetTextAlign이라는 함수
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(103).png)
TA_CENTER 중앙 정렬
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(106).png)
A_UPDATECP 플레그를 사용하면 출력 위치를 지정하는 인수를 무시하고 항상 CP의 위치에 문자열을 출력하며 출력후에 CP를 문자열의 바로 다음 위치로 옮겨 준다. 그래서 이 플레그를 사용하면 다음과 같이 여러번 TextOut을 호출하여 문장을 이어서 출력.
TextOut의 인수에 좌표를 지정하는 값들이 있지만 이 좌표는 사용되지 않고 무시되며 무조건 CP위치에 일직선으로 세 개의 문자열이 출력된다.
>DrawText
조금 더 복잡한(=기능이 많은) 문자열 출력 함수로 DrawText라는 함수
int DrawText( HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat )
다섯 번째 인수 uFormat은 DrawText 함수가 문자열을 출력할 방법을 지정하는 플래그
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(107).png)
이 함수는 사각영역을 정의하여 영역안에 문자열을 출력할 수 있으며 여러가지 포멧을 설정할 수 있는 기능이 있다. 윈도우즈에서 사각영역을 정의할 때는 RECT구조체를 사용.
typedef struct _RECT { // 사각역역 rt를 (100,100)-(400,300)으로 정의
LONG left; LONG top;
LONG right;
LONG bottom;
} RECT;
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(108).png)
사각역역 rt를 (100,100)-(400,300)으로 정의하고 출력할 문자열 str에 긴 문자열을 대입해 두었다. 그리고 이 문자열의 끝까지 중앙 정렬 및 자동개행 플레그를 주어 출력하였다. 실행 결과는 다음과 같다. 어디에다가 L 을 넣어야 할까....
>그래픽 출력
그래픽 출력도 문자열 출력과 크게 다르지 않다. 다음과 같은 함수들을 사용
COLORREF SetPixel(hdc, nXPos, nYPos, clrref)
DWORD MoveToEx(hdc, x, y, lpPoint) 좌표에 점을 출력
BOOL LineTo(hdc, xEnd, yEnd) 지정한 좌표까지 선을 그으며 CP를 끝점으로 이동
BOOL Rectangle(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect)
BOOL Ellipse(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect)
선을 긋고 싶다면 다음과 같이 두 함수를 연속적으로 호출
MoveToEx(hdc, A, B, NULL);
LineTo(hdc, C, D);
LineTo(hdc, C, D);
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(109).png)
Rectangle 함수
대각선으로 하는 사각형을 그린다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(110).png)
Ellipse 함수
지정한 사각형에 내접하는 타원을 그린다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(111).png)
>메시지 박스
메시지 박스는 조그만 별도의 윈도우를 열어서 사용자에게 정보를 전달해 주거나 질문을 하는 장치
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
< 오너(Owner) 윈도우> <출력할 문자열> < 타이틀 바 제목 문자열> <버튼 종류>
< HWND hWnd > : 오너 윈도우란 메시지 상자를 소유한 윈도우를 말하며 메시지 박스는 오너 윈도우의 중앙에 나타나며 메시지 박스가 떠 있는 동안
오너 윈도우는 사용할 수 없는 상태가 된다. 메시지 박스를 닫아야만 오너 윈도우를 사용할 수 있다.
<버튼 종류>
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(114).png)
버튼의 종류를 지정하는 이런 값 외에 아이콘을 출력하도록 하는 다음과 같은 플레그도 사용할 수 있다.
버튼 종류 플레그와 아이콘 플레그를 OR 연산자로 연결하여 uType 인수에 지정해 준다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(115).png)
왼쪽 마우스 클릭 < 버튼 1개 , x 아이콘>
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(116).png)
<오른쪽 마우스 클릭 <버튼 3개 , ? 아이콘>
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(117).png)
DOS에서 출력 가능
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(118).png)
메시지 상자를 호출한 후 사용자가 어떤 버튼을 눌렀는지를 살펴보면 되는데 MessageBox 함수는 리턴값으로 사용자가 누른 버튼값을 돌려준다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(120).png)
만약 사용자에게 남자입니까를 묻고 싶다면 다음과 같이 코드를 작성하면 된다.
if (MessageBox(hWnd, "남자입니까?","질문",MB_YESNO)==IDYES)
{
// 게이 계속 처리
}else
{
// 중지
}>WM_CHAR 메시지 문자입력
컴퓨터의 가장 기본적인 입출력 장치는 아직까지는 키보드이다.
키보드로부터 문자를 입력받고자 할 경우는 WM_CHAR
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(121).png)
lParam에는 비트별로 다음과 같은 복잡한 정보가 전달된다.
필요한 정보가 있으면 lParam을 참조하여 사용하면 되고 필요없으면 wParam만 사용
아래 표를 보면, 키보드 입력시 32bit 안에 정보가 들어간다는 것을 알 수있다.
오른쪽 Alt,Ctrl를 눌러졌으면 특수 기능
>무효화 영역
InvalidateRect 함수를 호출하여 강제로 WM_PAINT 메시지를 발생시켰다. WM_PAINT 메시지는 윈도우가 다시 그려져야 할 필요가 있을 때마다 호출되는데 다시 그려져야 할 필요가 있다는 말은 무효 영역(Invalid Region)이 있다는 뜻
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(123).png)
BOOL InvlidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);
첫번째 인수 > hWnd는 무효화의 대상 윈도우, 다시 그려져야 할 윈도우의 핸들. 이 값은 WndProc이 호출될 때 전달되는 첫번째 인수 hWnd를 그대로 써 주면 된다.
두번째 인수 > lpRect는 무효화의 대상이 되는 사각 영역을 써 주되 이 값이 NULL이면 윈도우의 전 영역이 무효화. 실행속도는 늦어지게 된다.
세번째 인수 > bErase는 무효화되기 전에 배경을 모두 지운 후 다시 그릴 것인지 아니면 배경을 지우지 않고 그릴 것인지를 지정.
TRUE이면 배경을 지운 후 다시 그리고 FALSE이면 배경을 지우지 않은채로 다시 그린다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(124).png)
스페이스 키가 입력되었을 경우 문자열을 지운다.
배열에 0을 넣음으로, 싹다 지워진다.
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(125).png)
그림을 덮치거나, 새로밀고 다시 그리는 것은 최적화로, FALSE로 할 경우, 기본의 글자가 죽지않아. 솰아있네
>WM_KEYDOWN 문자 이외의 키
문자 이외의 키를 입력 받으려면, WM_KEYDOWN 메시지를 사용
WM_KEYDOWN 메시지는 wParam에 문자 코드가 아닌 가상 키코드라는 것을 전달해 준다. 가상키코드(Virtual Key Code)란 시스템에 장착된 키보드의 종류에 상관없이 키를 입력받기 위해 만들어진 코드값이며 다음과 같이 정의
문자 이외의 키 입력에 WM_KEYDOWN 메시지가 발생했고, wParam으로 VK_TAB가 전달되었으면 사용자가 TAB 키를 누른 것.
가상 키 코드는 지금까지 나온 모든 키보드는 물론이고 앞으로 만들어질 키보드까지 고려하여 만들어진 범용적인 코드이다. 코드표를 보면 VK_SELECT,VK_EXECUTE, VK_HELP 등과 같이 현재 101키에 없는 키값도 미리 정의되어 있으며 펑션키도 F16까지 미리 만들어 놓았다. 이외 한국과 일본 등의 2바이트 문자를 지원하기 위한 특수한 가상키까지 포함되어 있는데 가상 키 코드를 이렇게 범용적으로 만들어 놓은 이유는 앞으로 윈도우즈를 다른 시스템으로 이식하더라도 키 코드를 그대로 쓸 수 있도록 하기 위한 배려. WM_KEYDOWN 메시지 처리 루틴에서 wParam의 값과 가상 키코드값을 비교해 봄으로써 어떤 키가 눌러졌는지를 구분한다. lParam으로 전달되는 값은 WM_CHAR와 동일
커서 이동키를 검출하여 문자 "A"를 화면에서 상하좌우로 이동
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(126).png)
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(128).png)
InvalidataRect 함수에 TRUE 사용시
![](file:///C:/Users/it/AppData/Local/Temp/enhtmlclip/Image(129).png)
InvalidataRect 함수에 FALSE 사용시
728x90
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151116-김재홍-win32API_3일차 (2) | 2015.11.16 |
---|---|
2015.11.16 -권오민- WinAPI-3일차 (3) | 2015.11.16 |
20151116 22번 업무일지 우대희 API (3) | 2015.11.16 |
20151116 임현수 업무일지 WIN32API #3 (2) | 2015.11.16 |
2015-11-13 Win32 API 개인 업무일지 - 천정호 (6) | 2015.11.16 |
20151113_안향진_API_02 (5) | 2015.11.15 |
20151113 - 주재민 API 개인 업무일지 2일차 (4) | 2015.11.15 |
20151113 - 강동조 API 개인 업무일지 2일차 (5) | 2015.11.13 |