윈도우에 관련 함수와 메시지
1. 윈도우 관련 함수
1) 파괴
DestroyWindow(HWND hWnd)
윈도우를 파괴하는 함수로 키보드 포커스를 버리고 메뉴를 파괴하고 메시지 큐를 비우고 타이머도 파괴해주는 함수입니다.
CloseWindow(HWND hWnd)
윈도우를 최소화하기만 하는데 기본적으로 ShowWindow(hWnd, SW_MINIMIZE)와 동일합니다.
2) 윈도우의 좌표 구하기
GetWindowRect(HWND, hWnd, LPRECT lpRect)
대상 윈도우의 좌표를 구해 RECT 구조체에 리턴합니다.
GetClientRect(HWND, hWnd, LPRECT lpRect)
대상 윈도우의 작업 영역 좌표를 구해 RECT 구조체에 리턴합니다.
3)윈도우의 이동과 크기 변경
MoveWindow(HWND hWnd, int x, int y, int nWidth, int nHeight, BOOL bRepaint)
윈도우 핸들과 x,y 좌표와 폭과 높이를 주며 마지막 인수는 TRUE이면 윈도우를 다시 그리게 됩니다.
예제) 마우스를 따라다니는 버튼
4) SetWindowPos
윈도우의 배치 순서까지 조정할 수 있는 함수
BOOL SetWindowPos(
HWND hWnd, // 윈도우 핸들
HWND hWndInsertAfter, // 윈도우 핸들(현재 윈도우 앞에 있을 윈도우)
int X, // x 좌표
int Y, // y좌표
int cx, // 폭
int cy, // 높이
UINT uFlags // 함수의 동작 방식
);
hWndInsertAfter
값 설명
HWND_BOTTOM: 제일 아래에 위치
HWND_NOTOPMOST: 항상 위 속성을 가지지 않은 윈도우 중 제일 앞쪽에 배치
HWND_TOPMOST: 항상 앞
HWND_TOP: 제일 앞에 위치
uFlags
SWP_DRAWFRAME |
윈도우 주변에 프레임을 그림 |
SWP_HIDEWINDOW |
윈도우를 숨김 이동과 크기 무시 |
SWP_NOMOVE |
이동하지 않고 크기만 변경, x,y 무시 |
SWP_NOREDRAW |
크기와 위치를 변경한 후 그리기를 다시 하지 않는다. |
SWP_NOSIZE |
크기는 변경하지 않음 cx,cy 무시 |
SWP_SHOWWINDOW |
윈도우를 보임 이동과 크기 무시 |
앞쪽의 예제 추가하기
5) DeferWindowPos
윈도우의 배치를 다시하는 함수
HDWP BiginDeferWindowPos(윈도우 개수)
윈도우의 크기와 위치를 저장하기 위한 메모리 할당 함수
단지 크기만 입력해주면 됩니다.
DeferWindowPos(윈도우 위치와 크기, 위치를 수정할 윈도우 핸들, 배치 순서, x좌표, y좌표, 폭, 높이, 옵션)
2번째 부터는 SetWindowPos와 동일
EndDeferWindowPos(윈도우 위치와 크기)
윈도우를 재배치
예제)
6) ScreenToClient(윈도우 핸들, 포인트)
기준 윈도우의 핸들을 주고 포인트 구조체의 주소를 전달하면 구조체의 좌표를 반대 좌표로 바꾸어 주는 함수
예제) 마우스가 위치한 곳에 스페이스 바를 누르면 원을 그려주는 예제
2. 실행 중 윈도우 변경
1) SetClassLong
실행 중에도 윈도우의 모양을 변경할 수 있도록 해주는 함수로 함수의 원형은 다음과 같습니다.
ULONG_PTR SetClassLong(HWND hWnd, int nIndex, LONG dwNewLong)
첫 번째 인수는 변경하고자 하는 윈도우 클래스이고 2번째 인수는 변경하고자 하는 윈도우구조체의 값입니다.
GCL_CBCLSEXTRA
GCL_CBWNDEXTRA
GCLP_ HBRBACKGROUND
GCLP_HCURSOR
GCLP_HICON
GCLP_HICONSM
GCLP_HMODULE
GCLP_MENUNAME
GCL_STYLE
GCLP_WNDPROC
3번째는 실제로 변경할 옵션이나 값입니다.
예제)실행 중 커서 바꾸기
2) 윈도우 스타일
WS_BORDER : 단선으로 된 경계선을 만들며 크기 조정은 되지 않습니다.
WS_CAPTION: 제목 표시줄을 가진 윈도우를 생성
WS_CHILD : 차일드 윈도우를 만들고 WS_POPUP과 같이 사용할 수 없습니다.
WS_CHILDWINDOW : WS_CHILD 와 동일
WS_CLIPCHILDREN :차일드가 위치한 영역은 그리기 영역에서 제외
WS_CLIPSIBLINGS: 차일드 끼리 겹친 영역은 그리기에서 제외
WS_DISABLED : 사용금지된 상태
WS_DLGFRAME : 두꺼운 경계선을 가지며 제목 표시줄을 가질 수 없습니다.
WS_GROUP: 그룹화에 이용
WS_HSCROLL : 수평 스크롤 바를 가진 윈도우를 생성
WS_ICONIC : 최초 아이콘화 시켜서 생성
WS_MAXIMIZE : 최초 최대화된 윈도우로 생성
WS_MAXIMIZEBOX: 최대화 버튼
WS_MINIMIZE :최초 최소화된 윈도우로 생성
WS_OVERLAPPED: 디폴트 윈도우
WS_MINIMIZEBOX : 최소화 버튼
WS_OVERLAPPEDWINDOW : WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX 스타일
WS_POPUP : 팝업 윈도우를 생성하며 WS_CHILD와 같이 사용할 수 없습니다.
WS_POPUPWINDOW : 일반적인 팝업 윈도우로 WS_BORDER, WS_POPUP, WS_SYSMENU 스타일 포함
WS_TABSTOP: 탭키를 이용해서 멈출 수 있음
WS_THICKFRAME: 크기 조정이 가능한 두꺼운 경계선을 가지는 윈도우를 생성
WS_SYSMENU: 시스템 메뉴를 가진 윈도우를 생성
WS_OVERLAPPEDWINDO: 가장 일반적인 윈도우
WS_VISIBLE: 화면에 출력
WS_VSCROLL : 수직 스크롤 바를 가진 윈도우를 생성
예제)팝업 윈도우 만들기
3. 특수한 모양의 윈도우
1) SetWIndowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw)
hWnd 윈도우를 hRgn 값에 따라 bRedraw에 따라 다시 그릴것인지 아닌지를 수행해주는 함수 입니다.
예제) 원형 모양의 윈도우 생성하기
2) SetLayeredWindowAttributes(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)
레이어드 윈도우의 투명 및 반투명 속성을 설정하는 함수로 hWnd는 대상 윈도우이고 crKey는 투명으로 처리할 색상이며 bAlpha는 반투명 정도로 0이면 완전 투명이고 255이면 불투명 128이면 반투명이 됩니다.
dwFlags는 LWA_COLORKEY를 주면 투명 색상 지정을 LWA_ALPHA는 반투명 정도를 지정합니다.
예제) 6.0에서는 동작하지 않음
다이얼로그를 추가한 후 다이얼로그에 3개의 버튼을 배치 합니다.
4. 윈도우 관련 메시지
1) WM_GETMINMZXINFO
윈도우의 사이즈를 제한 하는 메시지
lParam 에 전달되는 부가 정보
MINMAXINFO 구조체가 전달되는데 MINMAXINFO 구조체의 형식은 아래와 같습니다.
typedef struct tagMINMAXINFO { // mmi
POINT ptReserved; // 사용하지 않음
POINT ptMaxSize; //최대화 되었을 때의 크기
POINT ptMaxPosition; //최대화 되었을 때의 위치
POINT ptMinTrackSize; //경계선을 드래그 했을 때의 최소 크기
POINT ptMaxTrackSize; // 경계선을 드래그 했을 때의 최대 크기
} MINMAXINFO;
예제)
2) WM_ACTIVATEAPP 와 WM_ACTIVATE
응용 프로그램이 활성화 되거나 비 활성화 되었을 때 발생하는 메시지
부가 정보
wParam
TRUE: 활성화
FALSE: 비활성화
WM_ACTIVATE는 활성화 상태가 변경되는 윈도우에게 보내는 메시지 입니다.
LOWORD(wParam)에는 윈도우의 활성화 여부를 나타내는 값들이 전달됩니다.
WA_INACTIVE: 윈도우가 활성화
WA_CLICKACTIVE: 마우스 클릭에 의해 활성화
WA_ACTIVE: 마우스 클릭 이외의 방법에 의해 활성화
스레드
프로세스 내에서 실행되는 각각의 작업.
프로세스 내에서 실행되는 세부 작업단위(여러 개의 스레드가 모여서 하나의 프로세스를 이룸.)
수행 중 또 다른 수행을 할 수 있습니다.
프로세스는 동시에 움직이지는 않고 서로 병행적으로 움직입니다.
1. 스레드의 생성
CreateThread( SEC_ATTRS SecurityAttributes, ULONG StackSize, SEC_THREAD_START StartFunction, PVOID ThreadParameter, ULONG CreationFlags, PULONG ThreadId)
첫 번째 인수는 스레드의 보안 속성을 지정하는 인수인데 프로세스로 핸들을 상속하지 않는 한 NULL로 지정하면 됩니다.
두 번째 인수는 스택의 크기입니다.
0으로 지정하면 자동으로 스택의 크기를 늘려줍니다.
세번째는 스레드가 수행할 함수입니다.
네번째는 스레드가 수행할 함수에게 전달할 매개변수이고 다섯번 째는 스레드가 수행할 옵션입니다.
CREATE_SUSPEND이면 스레드를 만들기만 하고 실행은 하지 않으며 ResumeThread로 실행합니다.
여섯번째는 스레드의 ID를 넘겨주기 위한 출력용 인수입니다.
2. 스레드가 수행할 함수
DWORD WINAPI 함수명(LPVOID lpParameter)
스레드가 수행할 함수의 결과형은 DWORD이고 매개 변수는 LPVOID형 1개입니다.
'C & C++ > C & C++' 카테고리의 다른 글
CFileDialog(파일 선택,저장,파일명,경로 읽기) (0) | 2011.04.26 |
---|---|
[Tip] ESC 로 종료 안되게 (0) | 2011.04.25 |
API 대화상자 (0) | 2011.04.25 |
[API] 리소스 사용 (0) | 2011.04.25 |
[API] API 메시지 처리 (0) | 2011.04.25 |
댓글