하늘소프트SDK API 문서

Win32 샘플 1 - 단일 윈도우에 전자해도 그리기

설명

이 예제는 하늘소프트의 전자해도 커널 사용을 위한 최소 설정을 보여주는 것으로 전자해도 커널의 초기화/종료, ENC 파일의 로드 및 가장 기본적인 해도의 화면 표시에 대한 기본 코딩 과정을 보여준다. 마우스나 키보드 등의 입력 이벤트에 대한 처리는 이 예제에는 포함되어 있지 않다.

코드

커널 초기화

단순하게 hencInit() 함수를 실행하고 반환값을 체크하는 것으로 초기화는 마무리된다.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	if( 0 > hencInit() ) {
		MessageBox( GetDesktopWindow(), _T( "hnsEnc 초기화 실패" ), _T( "오류" ), MB_OK );
		return FALSE;
	}
    ...
    return TRUE;
}

해도 파일 로드

커널 초기화 후 해도 데이터 파일을 메모리에 로드한다. 카탈로그 파일을 통해 한 번에 로드할 수도 있지만 이 예제에서는 배경 지도 및 개별 해도 파일을 하나씩 불러오는 예를 보여 주도록 하였다.
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	if( 0 > hencInit() ) {
		MessageBox( GetDesktopWindow(), _T( "hnsEnc 초기화 실패" ), _T( "오류" ), MB_OK );
		return FALSE;
	}

    TCHAR szBaseDir[1024];
	getPgmDir( GetModuleHandle( NULL ), szBaseDir, 1000 );
	SetCurrentDirectory( szBaseDir );
	hencLoad( _T( "SHP\\CNTRY92.SENC" ) ); // Load 세계지도 배경 SENC. index=0
	hencLoad( _T( "SENC\\KR1A0000.SENC" ) ); // Load 한국 지도 SENC. index=1
	hencLoad( _T( "SENC\\KR1B0000.SENC" ) ); // Load 한국 지도 SENC. index=2
	hencLoad( _T( "SENC\\KR1C0000.SENC" ) ); // Load 한국 지도 SENC. index=3
	hencLoad( _T( "SENC\\KR1D0000.SENC" ) ); // Load 한국 지도 SENC. index=4
	hencLoad( _T( "SENC\\KR1E0000.SENC" ) ); // Load 한국 지도 SENC. index=5
	hencLoad( _T( "SENC\\KR1EN000.SENC" ) ); // Load 한국 지도 SENC. index=6
	hencLoad( _T( "SENC\\KR1ES000.SENC" ) ); // Load 한국 지도 SENC. index=7
	hencLoad( _T( "SENC\\KR1F0000.SENC" ) ); // Load 한국 지도 SENC. index=8
	hencLoad( _T( "SENC\\KR1G0000.SENC" ) ); // Load 한국 지도 SENC. index=9
	hencLoad( _T( "SENC\\KR1H0000.SENC" ) ); // Load 한국 지도 SENC. index=10
	hencLoad( _T( "SENC\\KR1I0000.SENC" ) ); // Load 한국 지도 SENC. index=11
	hencLoad( _T( "SENC\\KR1J0000.SENC" ) ); // Load 한국 지도 SENC. index=12
	hencLoad( _T( "SENC\\KR1K0000.SENC" ) ); // Load 한국 지도 SENC. index=13
	hencLoad( _T( "SENC\\KR1L0000.SENC" ) ); // Load 한국 지도 SENC. index=14
	hencLoad( _T( "SENC\\KR1M0000.SENC" ) ); // Load 한국 지도 SENC. index=15
	hencLoad( _T( "SENC\\KR1N0000.SENC" ) ); // Load 한국 지도 SENC. index=16
	hencLoad( _T( "SENC\\KR1O0000.SENC" ) ); // Load 한국 지도 SENC. index=17
	hencLoad( _T( "SENC\\KR1P0000.SENC" ) ); // Load 한국 지도 SENC. index=18

    ...
    return TRUE;
}

엔진 생성/초기화

hencCreate()를 사용하여 내부적으로 사용될 OpenGL 렌더링 컨텍스트와 DC 핸들을 생성하고, hencSelect() 함수를 사용하여 현재 윈도우와 커널을 연결한다. 어플리케이션 종료시에는 hencDelete() 함수를 사용하여 생성된 OpenGL 렌더링 컨텍스트와 DC 핸들을 제거해 주어야 한다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;

	switch (message) {
		case WM_CREATE :
			hencCreate( hWnd );
			hencSelect( hWnd );
			hencSetCenter( 132, 37 );
			hencSetScale( 1500000 );
			break;
        ...
        case WM_DESTROY:
			hencDelete( hWnd );
			PostQuitMessage(0);
			break;
    }
    ...
}

해도 표시

아래의 WM_PAINT 메시지의 처리코드와 같이 구현하도록 한다. hencRender() 후에 hencCopyBuffer()를 하면 전시된 화면에 HDC를 사용해서 GDI 함수를 바로 이용할 수 있어서 GDI에 익숙한 사용자들도 해도 위에 임의의 그래픽 오브젝트를 그릴 수 있다. 이 부분에 대한 실 구현 예는 "해도 위에 그래픽 객체 그리기" 예제를 통해 익힐 수 있다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;

	switch (message) {
        ...
		case WM_PAINT:
			{
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);

				RECT r;
				GetClientRect( hWnd, &r );
				hencSelect( hWnd );
				hencSetViewport( 0, 0, r.right - r.left, r.bottom - r.top );
				hencClearBackground();
				hencRender();
				hencCopyBuffer();
				EndPaint(hWnd, &ps);
			}
			break;
		case WM_ERASEBKGND :
			return TRUE;
		case WM_DESTROY:
			hencDelete( hWnd );
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

커널 종료

어플리케이션 종료 수 메시지 루프 아래 부분에 hencDeinit() 함수를 실행하여 커널을 종료한다.

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    ...

	// 응용 프로그램 초기화를 수행합니다.
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SAMPLE));

	// 기본 메시지 루프입니다.
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}


	hencDeinit();
	return (int) msg.wParam;
}
                    


캡처


스크린샷 원본 미보관

보관된 원본 이미지가 없어 표시할 수 없습니다. 위 코드와 설명을 참고해 주십시오.

win32_sample01_01.png