윈도우 32비트 프로그래밍 06 |
안녕하세요....돌팔이 황동준입니다... 이번에도 역시 윈도우를 제어하는 예제에 대해 알아 보겠습니다. 먼저 윈도우를 다른 크기로 윈도우를 생성할 때 CreateWindow() 함수를 사용했죠? 그 함수의 파라미터를 보면 BOOL MoveWindow( 두번째와 세번째 파라미터가 옮길 좌표를 의미하고 네번째와 다섯번째 파라미터가 윈도우의 크기를 그럼 이 함수를 이용한 예제를 보도록 합시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, MoveWindow(hWnd, 0, 0, 300, 150, case WM_DESTROY : PostQuitMessage(0); 위 예제는 윈도우가 생성될 때 그 위치를 (0, 0)으로 크기를 300, 150으로 바꾸는 자 이번에는 윈도우의 크기를 고정하는 예제를 보도록 합시다. 일반적으로 윈도우를 어떻게 못하게 하는지 알려면 우선 메시지 하나를 알아야 합니다. 유저가 윈도우의 크기나 그럼 먼저 소스를 보도록 합시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, MoveWindow(hWnd, 100, 100, 300, 150, case WM_GETMINMAXINFO : ((MINMAXINFO case WM_DESTROY : PostQuitMessage(0); 위 예제는 윈도우를 300, 150 크기로 생성하고 그 크기를 변경하지 못하게 하는 case WM_GETMINMAXINFO : ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = UINT형인 mesg에 주 메시지가 들어가고 wParam이나 lParam에 부수적인 메시지가 WM_GETMINMAXINFO 메시지가 발생됐을때 MINMAXINFO라는 구조체 형식으로 typedef struct tagMINMAXINFO { // mmi POINT 자료형은 x, y를 맴버로 가지는 구조체입니다. 우리가 위 맴버중 사용할것은 네번째, 다섯번째 맴버인데 ptMinTrackSize의 x, 자 이번에는 윈도우의 배경색을 바꾸는 예제를 알아 보도록 합시다. 어! 이거 앞 부분에 이미 우선 원하는 색깔로 배경색을 바꾸려면 SetClassLong()함수의 파라미터로 들어가는 HBRUSH CreateSolidBrush( 파라미터로 들어가는 색의 형식으로 브러쉬 핸들을 리턴하는 함수입니다. 자세한 것은 그래픽 BOOL DeleteObject( 자세한 것은 그래픽 부분에서 다룰테니 일단은 어떻게 구현했는지 봅시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, switch(mesg) hBrush = CreateSolidBrush(RGB(0, 0, case WM_DESTROY : PostQuitMessage(0); 위 예제는 파란색 계통의 배경색을 가진 윈도우를 생성하는 예제입니다. RGB를 어떻게 RGB(0, 0, 0)은 검정색이고 RGB(255, 255, 255)은 흰색이구요. R은 빨간색을 의미하고 G는 녹색을 B는 파란색을 의미합니다. 세 색깔을 조합해서 색을 case WM_CREATE : hBrush = CreateSolidBrush(RGB(0, 0, 위 부분이 실제적으로 배경색을 파란색 계통으로 바꾸는 부분인데 함수 두개 추가된 것 이외는 자 오늘 강좌는 여기까지 |
윈도우 32비트 프로그래밍 07 |
안녕하세요......돌팔이 황동준입니다.... 이번에는 유저가 그린 그림을 아이콘과 커서로 사용하는 방법에 대해 알아 보겠습니다. 그림 우선 리소스 파일에 대해 알아야 합니다. 리소스 파일은 윈도우즈에서 사용하는 여러가지 자료들을 모아서 정의 해 놓은 것을 의미합니다. 통합 환경에서 File메뉴의 New를 선택하시기 바랍니다. 그러면 대화상자가 생성되죠? 컴파일을 할 때 꼭 이 리소스 파일을 프로젝트 파일에 포함시켜 주어야 한다는 거죠. 자 그럼 실제적으로 소스를 보도록 합시다. 아래는 리소스 파일의 소스(test.rc)입니다. #include <windows.h> MyIcon ICON "my.ico" 아래는 프로그램 소스(test.c)입니다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, PostQuitMessage(0); 어때요? 정말로 아이콘과 커서가 그린 그림으로 바뀌었죠? 자 그러면 리소스 파일을 MyIcon ICON "my.ico" 뒤에 따옴표로 묶인 것이 실제 그림 파일의 이름이 되는 것입니다. WndClass.hIcon = LoadIcon(hInstance, 클래스 등록부분에 위와 같은 형식으로 기입하면 됩니다. 간단하죠. 자 여기까지 해서 윈도우에 오늘은 여기까지 |
윈도우 32비트 프로그래밍 08 |
안녕하세요...돌팔이 황동준입니다. 이번에는 윈도우의 작업영역에 문자열을 출력하는 방법에 대해 알아 보겠습니다. 먼저 출력에 대해 알아보기 전에 두가지를 알아야 합니다. 첫째로 디바이스 컨텍스트 핸들에 HDC BeginPaint( 위 함수를 이용해서 디바이스 컨텍스트 핸들을 얻을 수 있습니다. 리턴값을 보면 HDC라고 typedef struct _PAINTSTRUCT { 구체적으로 각 멤버가 어떤 역할을 하는 지는 알 필요 없습니다. 단지 작업영역의 좌표를 BeginPaint() 함수를 이용해서 디바이스 컨텍스트 핸들을 얻은 후 그 핸들을 이용해서 BOOL EndPaint( 꼭 주의하시기 바랍니다. 프로그램상에서 출력 루틴이 끝나면 반드시 위 함수로 핸들을 반환해야 자 핸들을 얻는 방법을 알아보았으니 출력하는 함수에 대해 알아 봅시다. BOOL TextOut( 윈도우의 작업영역에 출력을 할 때 위 함수를 이용해서 합니다. 첫번째 파라미터는 얻은 위 함수말고도 출력하는 다른 함수도 있는데 그것은 DrawText()라는 함수입니다. 이 int DrawText( 첫번째 파라미터는 디바이스 컨텍스트 핸들을 의미하고 두번째 파라미터는 출력할 문자열, 세번째 DT_BOTTOM 사각좌표의 아래부분을 의미합니다. 자 그럼 예제 소스를 보도록 합시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, switch(mesg) GetClientRect(hWnd, case WM_DESTROY : PostQuitMessage(0); 위 소스를 보면 못보던 메시지가 하나 있을 겁니다. 바로 WM_PAINT라는 메시지인데 이 case WM_PAINT : GetClientRect(hWnd, &rect); 윈도우를 화면에 그리고 바로 문자열을 작업영역에 출력하기 때문에 위 메시지하에 처리를 해 준 뭐 특별히 다시 설명 드릴부분은 없는것 같군요. 단지 위 예제에서는 DrawText()함수를 자 오늘은 여기까지 |
윈도우 32비트 프로그래밍 09 |
안녕하세요....돌팔이 황동준입니다. 이번에는 입력부분에 대해 알아보도록 합시다. 앞 부분에서 이미 약간 언급을 했지만 용어 HDC GetDC( 핸들을 반환할때에는 ReleaseDC() 함수를 사용하면 됩니다. int ReleaseDC( 우리는 출력하는 함수에 대해 이미 위에서 배웠을 겁니다. 추가로 폰트를 선택해서 출력하는 HGDIOBJ SelectObject( 어떤 객체의 핸들을 디바이스 컨텍스트 핸들에 선택되게 해주는 함수입니다. 우리는 이번 BOOL GetTextMetrics( 위 함수는 우리가 받은 디바이스 컨텍스트 핸들을 이용해서 문자(폰트)에 대한 정보를 얻을 때 이렇게 생각하면 간단합니다. 좌표 (0, 0)에 캐럿이 깜박이고 있는데 여기서 우리가 A라는 typedef struct _TEXTMETRIC { // tm } TEXTMETRIC; tmHeight가 선택된 문자의 높이를 저장할 멤버이고 tmAveCharWidth가 넓이를 캐럿이 원하는 좌표에 깜박이려면 먼저 캐럿을 생성해 주어야 하는데 캐럿을 생성할 때는 아래 BOOL CreateCaret( 두번째 파라미터에 보면 비트맵 핸들을 지정하게 되어 있는데 이 값을 NULL로 해주면 그냥 캐럿을 원하는 좌표에 놓을 때에는 아래 함수를 사용하면 됩니다. BOOL SetCaretPos( 파라미터 차례로 x, y좌표를 의미합니다. 실제적으로 생성하고 어느 곳에 위치한 캐럿을 눈에 보이려면 아래 함수를 사용합니다. BOOL ShowCaret( 캐럿을 보이지 않게 하려면 아래 함수를 이용하면 되구요. BOOL HideCaret( 자 대략적으로 이번 예제에서 사용할 함수에 대해 알아 보았는데 그러면 실제로 소스를 보도록 #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, switch(mesg) nX = nY = 0; case WM_SETFOCUS : CreateCaret(hWnd, NULL, cxChar, case WM_KILLFOCUS : HideCaret(hWnd); case WM_CHAR : HideCaret(hWnd); case WM_KEYDOWN : if(LOWORD(wParam) == case WM_DESTROY : PostQuitMessage(0); 자 그러면 구체적으로 각 메시지에서 어떤 직업들을 하는지 알아 봅시다. 먼저 윈도우가 생성될 case WM_CREATE : nX = nY = 0; 초기 좌표를 (0, 0)으로 초기화 하는 작업입니다. hDC = GetDC(hWnd); 디바이스 컨텍스트 핸들을 얻어 고정 폰트를 선택하고 그 고정 폰트에 대한 문자 길이와 넓이를 case WM_SETFOCUS : 흠 못보던 메시지가 있군요. 위 메시지는 윈도우가 입력 포커스를 얻었다는 것을 알리는 CreateCaret(hWnd, NULL, cxChar, 캐럿을 현재 고정 폰트의 크기만큼 생성하고 해당 좌표에 위치시켜 보이게 하는 작업을 하고 case WM_KILLFOCUS : 윈도우가 입력 포커스를 잃어 버렸을 때 위 메시지가 발생됩니다. HideCaret(hWnd); 캐럿을 보이지 않게 하고 없애는 구문이 들어가 있군요. DestroyCaret()함수는 위 case WM_CHAR : 자 이번에는 중요한 메시지에 대해 알아 봅시다. WM_CHAR 메시지는 유저가 시스템 키를 HideCaret(hWnd); 눌린키값을 화면에 출력해주는 구문입니다. 그렇게 특별한 것은 없고 단지 조건문을 잘 보기 ReleaseDC(hWnd, 문자를 출력했으니 그 다음 좌표로 캐럿을 이동해야 겠죠? 바로 그 작업입니다. case WM_KEYDOWN : 위에서도 몇번 언급을 했지만 일반키외에 특수키가 눌리면 WM_KEYDOWN이라는 메시지가 if(LOWORD(wParam) == Enter키가 눌리면 Y좌표를 증가하고 X좌표를 0으로 해주는 작업입니다. 물론 캐럿의 VK_CANCEL Ctrl+Break 오늘은 여기까지 |
윈도우 32비트 프로그래밍 10 |
안녕하세요...돌팔이 황동준입니다.. 이번에는 출력에 대한 부분을 좀더 보도록 하죠.. 전부 세가지 예제를 들어서 설명드릴 제일 첫번째 예제로 우리는 출력할 때 정렬 기준을 오른쪽으로 하게 하는 방법에 대해 알아 UINT SetTextAlign( 두번째 파라미터에 어떤 값을 넣어주느냐에 따라 정렬방식이 바뀝니다. 어떤 파라미터들이 들어갈 TA_BOTTOM 문자열의 사각 좌표 아래 부분이 정렬 기준이 됩니다. 자 그러면 이 함수를 이용해서 출력되는 문자열을 오른쪽으로 정렬하는 예제를 보도록 #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, switch(mesg) x = 100; case WM_PAINT : hDC = BeginPaint(hWnd, case WM_DESTROY : PostQuitMessage(0); 자 프로그램 내용을 살펴 보도록 합시다. case WM_CREATE : x = 100; 먼저 윈도우가 생성될때 문자열을 출력할 위치를 기억하고 있는 변수값을 초기화하는 작업을 하고 case WM_PAINT : hDC = BeginPaint(hWnd, 오른쪽 정렬방식을 사용하기 위해서 위 함수를 사용했네요. TextOut(hDC, x, y, "This", 4); 프로그램을 실행시켜 보면 알겠지만 X좌표가 전부 같은데도 정렬되는 기준은 왼쪽으로 되어 있지 이번에는 두번째 예제로 글자색과 배경색을 바꾸어서 출력하는 예제를 보도록 하겠습니다. COLORREF SetTextColor( 글자색을 바꿀때 사용하는 함수입니다. 두번째 파라미터로 바꿀색을 RGB로 조합해주면 COLORREF SetBkColor( 배경색을 바꿀때 사용하는 함수입니다. 두번째 파라미터로 바꿀 색을 RGB로 조합해주면 그러면 배경색을 파란색으로 하고 글자색을 흰색으로 해서 출력하는 예제를 봅시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, switch(mesg) x = 100; case WM_PAINT : hDC = BeginPaint(hWnd, case WM_DESTROY : PostQuitMessage(0); case WM_PAINT : hDC = BeginPaint(hWnd, 글자색을 흰색으로 하고 배경색을 파란색으로 설정하는 구문입니다.앞으로 이 디바이스 컨텍스트 TextOut(hDC, x, y, "This", 4); 마지막 예제로 배경 모드에 관한 예제에 대해 알아 보겠습니다. 배경모드는 크게 이 때 아래의 함수를 사용해서 배경모드를 바꿀 수 있습니다. int SetBkMode( 두번째 파라미터로 어떤 값을 지정하느냐에 따라 배경모드를 기본모드로 또는 배경에 영향을 주지 OPAQUE 기본적으로 세팅되어 있는 자 그러면 간단하게 예제를 들어서 이해해 보도록 합시다. #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain HWND hWnd; WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, switch(mesg) hDC = BeginPaint(hWnd, case WM_DESTROY : PostQuitMessage(0); 자 그러면 실제적으로 출력하는 루틴을 보도록 합시다. case WM_PAINT : hDC = BeginPaint(hWnd, 좌표 (10, 10)에 파란색의 배경, 흰색의 글자를 갖는 문자열을 출력하는군요. TextOut(hDC, 10, 30, " ", 14); 좌표 (10, 30)에 파란색의 배경, 흰색의 글자를 갖는 문자열을 출력하는데 출력하는데 SetTextColor(hDC, RGB(255, 255, 배경색을 바꾸었습니다. SetBkMode(hDC, TRANSPARENT); 배경 모드를 배경을 지우지 않는 것으로 바꾸었네요. TextOut(hDC, 10, 30, "This is a test", 14); 위와 똑같은 좌표에 문자열을 출력하고 있습니다. 정상적으로 배경 모드를 바꾸지 않고 EndPaint(hWnd, &ps); 오늘 알아본 세가지 예제는 그렇게 크게 어려운 것이 없을 겁니다. 함수만 알면 오늘은 여기까지 |