2015.03.12. 15:51
#include <windows.h>
#include <tchar.h>
/*
<windows.h> : API 함수들의 원형과 사용하는 상수들이 정의되어 있음.
<tcahr.h> : 유니코드 기반의 코드 작성을 위한 헤더.
<Unicode>
wchar: Unicode
2byte:16bit
ex)TCHAR *szString = L"ABC"
char: ASCIIcode
1byte:8bit
ex) char *szString = "ABC"
*/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//LRESULT = long: OS에게 보고용자료
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd)
//
WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR strCmdLine, int nShowCmd )
프로그램(인스턴스) 핸들 / 이전 프로그램(인스턴스) 핸들 / 파일 경로? / 윈도우 출력 방법(숨긴다, 최소화, 활성화 ...)
/*
윈도우 클래스 객체 하나 생성
→ 만들려 하는 윈도우 속성을 설정(멤버에 값을 대입함으로써)
→ 이렇게 만든 클래스 이름을 “MyWindow”로 저장
→ 윈도우 클래스 등록(register).
→ 저장한 클래스를 이용해 윈도우 생성.
→ 생성한 윈도우를 디스플레이에 띄움.
→ 사용자 혹은 시스템으로부터 들어오는 메시지를 불러들여 WndProc으로 전달.
→ WM_QUIT 메시지가 들어오면 while문을 빠져나오고 메인 함수 종료.
WINAPI WinMain: Windows 실행방식
HINSTANCE hInstance: 프로그램 번호
*/
{
WNDCLASSEX wcex;
// 윈도우정보구조체
memset(&wcex, 0, sizeof(wcex));
wcex.cbSize = sizeof(wcex);
//윈도우구조체크기
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
// 윈도우 스타일
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//클라이언트 배경색
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
//커서모양
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
//아이콘모양
wcex.hInstance = hInstance;
//프로그램번호
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
/*
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
→윈도우즈 예역영역
*/
wcex.hIconSm = NULL;
//작은아이콘
wcex.lpszMenuName = NULL;
//메뉴. 리소스에디터로 제작
wcex.lpfnWndProc = WndProc;
//메시지처리함수
wcex.lpszClassName = L"MyWindow";
// 위 설정의 윈도우 클래스 이름
RegisterClassEx(&wcex);
//윈도우에 등록
HWND hWnd = CreateWindow(L"MyWindow", L"MyWindow", WS_OVERLAPPEDWINDOW,
/*
HWND CreateWindow( lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam)
클래스 이름 / 타이틀 바 문자열 / 윈도우 스타일 / x, y 좌표, 너비, 높이 / 부모 윈도우 핸들 / 메뉴 핸들 / 프로그램 핸들/ 파라미터?
CreateWindow 윈도우 생성함수
L"MyWindow" 첫번째는 생성하고자하는 클래스
L"MyWindow" 두번째는 윈도우캡션
WS_ 윈도우형태
*/
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
/* CW_USEDEFAULT, CW_USEDEFAULT: 윈도우 x, y 위치
CW_USEDEFAULT, CW_USEDEFAULT: 윈도우 width, height (길이)
NULL: 부모윈도우
NULL: 윈도우의 MENU ID값
hInstance: 프로그램번호와 윈도우 연결
NULL: 특수목적
*/
if(hWnd == NULL)
{
MessageBox(NULL, L"윈도우생성실패", L"에러", MB_ICONERROR | MB_OK);
//상자를 소유할 윈도우의 핸들(owner) / 출력할 문자열 / 타이틀 바 문자열 / 버튼 종류
return -1;
}
ShowWindow(hWnd, SW_SHOW);
/*
BOOL ShowWindow( hWnd , nCmdShow )
위에서 만든 윈도우의 핸들 / 윈도우 출력 방법
*/
MSG msg;
memset(&msg, 0, sizeof(msg));
while(GetMessage(&msg, NULL, 0, 0))
/*(메시지 구조체 포인터, 메시지 얻어올 장소, 메시지 최소값, 메시지 최대값)
(메시지 구조체 변수의 주소 / 대상 윈도우의 핸들* / 최소(범위) / 최대(범위) )
*대상 윈도우의 핸들값이 NULL이면 현재 메시지를 호출한 윈도우와 관련된 메시지를 보게 됨.
*대상 윈도우가 존재한다면 대상 윈도우와 그 자식 윈도우 관련 메시지를 보게 됨.
*/
{
TranslateMessage(&msg);
//키값 조사
DispatchMessage(&msg);
//메시지 처리
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/*
hWnd: 누가 핸들, void pointer
uMsg: 메시지 제목
wParam: 내용1
lParam: 내용2
*/
{
switch(uMsg)
//조사
{
case WM_DESTROY :
// 윈도우창이 파괴된 메시지
{
PostQuitMessage(0);
// WM_QUIT발생
break;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
//윈도우보고용
}
'프로그래밍 > WIN32 API' 카테고리의 다른 글
마우스좌표 나타내기 (0) | 2017.04.06 |
---|---|
Basic (0) | 2017.04.06 |
Pen, Brush (0) | 2017.04.06 |
Text Out (0) | 2017.04.06 |