'FrameWork'에 해당되는 글 2건

  1. 2012.07.20 메인 윈도우 생성 by 똘이 임덕규
  2. 2012.07.16 핸들(Handle) by 똘이 임덕규

가장 처음 만들 수 있는 윈도우 창이다. 처음에 입력해야 할 코드가 많아서 미리 아래와 같이 기본 소스를 만들어 놓고 작업을 시작하는 편이 효율적이다. 만약 시간이 많이 남고 아래의 것을 그냥 통채로 외워 보겠다면 복사를 해서 쓰기보단 따라 쳐 보도록 하자.

<기본 메인 화면>

 아래 소스는 아무런 기능도 없으며 단지 윈도우 하나를 띄워주는 '기본 소스 코드' 이다. 이 소스를 바탕으로 WIN API 프로그래밍을 시작을 하면 된다. 

 C언어는 대·소문자의 구분을 하므로 정확히 입력을 해야 할 필요가 있다. int_a 와 int_A는 완벽하게 다르다.

 컴파일러는 소스의 확장자에 따라 어떤 형식으로 컴파일을 진행할 것 인지를 정한다. C 보다는 C++가 좀 더 엄격하게 문법을 검사하므로 가능한 cpp 확장자를 사용하도록 한다.
 #include 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); /* 메세지 처리함수 */

HWND hWndMain;
HINSTANCE g_hInst;              /* instance의 전역변수 선언 */
LPCTSTR lpszClass = TEXT("Class"); /* 윈도우 클래스의 이름 정의 */

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevlnstance, 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; /* 메세지 처리 함수를 지정 */
    WndClass.lpszClassName = lpszClass; /* 윈도우 클래스 이름이 들어감 */
    WndClass.lpszMenuName = NULL;       /* 여기선 메뉴 사용 안함 */
    WndClass.style =  CS_HREDRAW | CS_VREDRAW;
    
    RegisterClass(&WndClass);	/* 윈도우 클래스 등록 */

	/* 메모리상에 윈도우 생성 */
	hWnd = CreateWindow(
		lpszClass,					/*생성하고자 하는 윈도우 클래스 지정*/
		TEXT("My first Windows API Program. Hello World"),	/*윈도우의 타이틀 바에 나타날 문자열*/
		WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME,	/*만들고자 하는 윈도우의 형태를 지정*/
		0,	/*생성 위치 X*/
		0,	/*생성 위치 Y*/
		640,	/*생성 윈도우의 폭*/
		480,	/*생성 윈도우의 높이*/
		NULL,
		(HMENU)NULL, 
		hInstance, 
		NULL);

    /* 화면에 윈도우 표시 */
    ShowWindow(hWnd, nCmdShow); /* CreateWindow 함수가 리턴한 핸들을 이용하여 출력 */

    /* 사용자로부터의 메시지 처리  */
    while(GetMessage(&Message, NULL, 0, 0)) /* 메시지 큐에서 메시지 읽어옴. WM_QUIT면 False 리턴 */
    {
        TranslateMessage(&Message); /* 키보드 입력 처리 */
        DispatchMessage(&Message);  /* 큐에서 꺼낸 메시지를 WndProc함수의 iMessage로 전달하는 것이지 직접호출하지 않는다. */
    }
    return (int)Message.wParam; /* 메세지 루프 종료 후 이 프로그램을 실행시킨 OS로 리턴 */
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)	/*운영체제가 호출하는 CALL BACK 함수*/
{
	HDC hdc;
	PAINTSTRUCT ps;

    switch(iMessage)
    {
		case WM_CREATE:
			hWndMain = hWnd;
			return 0;

		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			EndPaint(hWnd, &ps);
			return 0;
	
		case WM_KEYDOWN:		/*키 입력이 들어왔을 때 여기로 들어 온다.*/
			return 0;

		case WM_DESTROY:
			PostQuitMessage(0);	/*종료 메세지인 WM_DESTROY를 만든다.*/
			return 0;
	}
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

저작자 표시
신고

'FrameWork > Win32 API' 카테고리의 다른 글

메인 윈도우 생성  (0) 2012.07.20
핸들(Handle)  (0) 2012.07.16
  • 핸들이란 구체적인 어떤 대상에 붙여진 번호이며 문법적으로는 32bit의 정수값.
  • 만들어진 윈도우에는 윈도우 핸들을 붙여 번호로 관리하며 DC외 펜과 브러쉬에서도 핸들을 붙여 관리한다.
  • 핸들의 특징
    • 핸들은 정수값이며 대부분의 경우 32bit값이다. 목적은 오로지 구분을 위한 것.
    • 핸들은 운영체제가 발급하여 사용자는 사용하기만 한다. 사용자가 핸들을 만드는 경우는 없다.
    • 같은 종류의 핸들끼리는 절대 같은 값을 가지지 않는다. 다를 종류의 핸들끼리는 중복된 값을 가질 수 있다.
    • 핸들은 정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관 없다.
    • 핸들값을 저장하기 위해 별도의 데이터 형까지 정의해 두고 있다. HWND, HPEN, HBURSH, HDC 등이 핸들을 담기 위한 데이터 형들이며 모두 부호없는 정수(unsigned int) 이다.
저작자 표시
신고

'FrameWork > Win32 API' 카테고리의 다른 글

메인 윈도우 생성  (0) 2012.07.20
핸들(Handle)  (0) 2012.07.16


티스토리 툴바