posted by nsakura 2010. 7. 21. 00:04

윈도우에서는 문자열도 리소스로 취급한다.

많은 문자열을 사용하는 프로그램은

문자열 테이블을 사용하는게 효율적일것이다.


코드는 그냥 이전 포스트에서 사용했던 리소스 예제의 코드를 사용했다.



LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 TCHAR str[256];

 switch(iMessage){
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_COMMAND:
  switch(LOWORD(wParam)){
  case ID_NSAKURA:
   MessageBox(hWnd,TEXT("Nsakura 입니다."),TEXT("NSAKURA"),MB_OK);
   break;
  case ID_EXIT:
   MessageBox(hWnd,TEXT("종료 합니다.."),TEXT("EXIT"),MB_OK);
   DestroyWindow(hWnd);
  }
  case WM_PAINT:
   hdc=BeginPaint(hWnd,&ps);
   LoadString(g_Inst,IDS_NSAKURA,str,lstrlen(str));
   TextOut(hdc,10,10,str,lstrlen(str));
   EndPaint(hWnd,&ps);
  return 0;
 }
 
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

이렇게 코드를 추가하였는데 이번에도 뜸금없이 새로운 함수가 눈에 띄인다.

LoadString함수인데 간단하게 설명하겠다. 그냥 리소스의 문자열 테이블로부터 문자를 가지고 오는 함수이다.

그럼 원형을 살펴보자.

int LoadString(HINSTANCE hInstance, UINT uID, LPSTR lpBuffer, int nBufferMax);

엇! 첫번째 인자가 이상하다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){

프록 함수를 보면 인자가 없지만.

우리는 HINSTANCE변수 하나를 전역으로 만들어 두었음을 잊지말며.

WinMain

g_Inst=hInstance;

이부분을 기억해야할 것이다.

요는 첫 번째 인자는 문자열 리소스를 가진 인스턴스 핸들

두 번째 인자는 읽어드릴 문자열 테이블의 ID를

세 번째 인자는 받아온 문자열을 저장할 변수

네 번째 인자는 저장할 변수의 크기를 말한다.

그런데 이렇게 문자열 테이블을 사용하는 이유는 뭘까 그냥 코드상으로 쓰면 안되나.

그냥 교재에서는 이러저래 설명은 되어있지만.

몇 가지 이유를 간추려보면 프로그램이라는건 혼자서 만들수있는 단위는 극히 적다. 있다고하더라도 난잡하다.

왜 난잡할까 특히 이런 문자열 같은경우 안내문인 경우가 많은데. 코딩하랴 저런 사용자적인 부분도 신경쓰랴

그렇다고 전문디자이너보고 코드를 줄수있는 노릇은 아니지 않은가.

그렇기 때문에 이렇게 일의 분담을 효율적으로 할수있으며 두번째는 언어의 버젼을 다르게 만들기 유용하다.

언어의 버젼은 [외국어]를 지칭한다. 지금 a라는 프로그램을 일본에 판다고 했을때 단순히 문자열 테이블만 수정하면

되기 때문이다.

'Computer > Win API' 카테고리의 다른 글

WinApi 그래픽 [색상][펜][브러쉬]  (0) 2010.07.21
WinApi 그래픽 [GetStockObject]  (0) 2010.07.21
WinApi 리소스 [액셀러레이터]  (0) 2010.07.20
WinApi 리소스 [아이콘][커서]  (2) 2010.07.20
WinApi 리소스 [메뉴]  (0) 2010.07.20