在編寫國際化的應用程式裡,經常要使用不同語言的字串。比如中文菜單裡叫做“檔案”,而在英語裡叫做“File”。開發這種軟體的功能是一樣的,只是介面上顯示的文字不一樣而已。為了方便這種軟體的開發,在Windows裡經常使用的方法就是替換掉顯示的字串,比如指定在中文裡就顯示“檔案”,在英語裡就顯示“File”,是通過函數LoadString從不同的資源裡載入不同的字串顯示來實現的。其實所有可變的字串,都可以使用函數LoadString從資源裡載入字串顯示。
映像的資訊是非常方便人們記憶的,像交通訊號一樣,就是使用各種各樣的表徵圖,每個人看了就會明白是什麼東西,因此在程式裡使用表徵圖來標識程式。只要看到這個表徵圖,就知道是這個軟體做什麼用的。比如在程式的左上方顯示的表徵圖,就需要調用函數LoadIcon從資源裡載入到記憶體裡,然後再顯示出來。
游標更是最常用的表徵圖了,時時刻刻都可以看到它。當你在編輯檔案時,游標顯示為一個“I”字形表徵圖,當你在案頭操作檔案時,顯示為一個箭頭。這樣變化的游標,就是因為設定了不同的表徵圖。游標的使用,就是根據不同的地區來作不同的指示。更換游標的函數是LoadCursor。
函數LoadString聲明如下:
WINUSERAPI
int
WINAPI
LoadStringA(
__in_opt HINSTANCE hInstance,
__in UINT uID,
__out_ecount(cchBufferMax) LPSTR lpBuffer,
__in int cchBufferMax);
WINUSERAPI
int
WINAPI
LoadStringW(
__in_opt HINSTANCE hInstance,
__in UINT uID,
__out_ecount(cchBufferMax) LPWSTR lpBuffer,
__in int cchBufferMax);
#ifdef UNICODE
#define LoadString LoadStringW
#else
#define LoadString LoadStringA
#endif // !UNICODE
hInstance是應用程式執行個體控制代碼。
uID是資源中的字串編號。
lpBuffer是接收從資源裡拷貝字串出來的緩衝區。
cchBufferMax是指明緩衝的大小。
函數LoadIcon聲明如下:
WINUSERAPI
HICON
WINAPI
LoadIconA(
__in_opt HINSTANCE hInstance,
__in LPCSTR lpIconName);
WINUSERAPI
HICON
WINAPI
LoadIconW(
__in_opt HINSTANCE hInstance,
__in LPCWSTR lpIconName);
#ifdef UNICODE
#define LoadIcon LoadIconW
#else
#define LoadIcon LoadIconA
#endif // !UNICODE
hInstance是應用程式執行個體控制代碼。
lpIconName是指向表徵圖的名稱。
函數LoadCursor聲明如下:
WINUSERAPI
HCURSOR
WINAPI
LoadCursorA(
__in_opt HINSTANCE hInstance,
__in LPCSTR lpCursorName);
WINUSERAPI
HCURSOR
WINAPI
LoadCursorW(
__in_opt HINSTANCE hInstance,
__in LPCWSTR lpCursorName);
#ifdef UNICODE
#define LoadCursor LoadCursorW
#else
#define LoadCursor LoadCursorA
#endif // !UNICODE
hInstance是應用程式執行個體控制代碼。
lpCursorName是游標的名稱。
調用這三個函數的例子如下:
#001 //
#002 // 函數: MyRegisterClass()
#003 //
#004 // 目的: 註冊一個視窗類別型.
#005 //
#006 // 蔡軍生 2007/07/12
#007 //
#008 ATOM MyRegisterClass(HINSTANCE hInstance)
#009 {
#010 WNDCLASSEX wcex;
#011
#012 wcex.cbSize = sizeof(WNDCLASSEX);
#013
#014 wcex.style = CS_HREDRAW | CS_VREDRAW;
#015 wcex.lpfnWndProc = WndProc;
#016 wcex.cbClsExtra = 0;
#017 wcex.cbWndExtra = 0;
#018 wcex.hInstance = hInstance;
#019 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWIN));
#020 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
#021 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
#022 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TESTWIN);
#023 wcex.lpszClassName = szWindowClass;
#024 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
#025
#026 return RegisterClassEx(&wcex);
#027 }
第19行就是載入顯示的表徵圖,使用宏MAKEINTRESOURCE來轉換為合適的類型,它的定義如下:
#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE MAKEINTRESOURCEA
#endif // !UNICODE
第20行是載入箭頭的游標來顯示。
// 載入全域字串。
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING);
上面兩行就是調用函數LoadString從資源裡擷取顯示的字串。