Windows API一日一練(20)LoadString、LoadIcon和LoadCursor函數

來源:互聯網
上載者:User
 在編寫國際化的應用程式裡,經常要使用不同語言的字串。比如中文菜單裡叫做“檔案”,而在英語裡叫做“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從資源裡擷取顯示的字串。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.