`
阿尔萨斯
  • 浏览: 4175044 次
社区版块
存档分类
最新评论

Windows API一日一练(20)LoadString、LoadIcon和LoadCursor函数

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

在编写国际化的应用程序里,经常要使用不同语言的字符串。比如中文菜单里叫做“文件”,而在英语里叫做“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 // 蔡军生 <chsdate w:st="on" year="2007" month="7" day="12" islunardate="False" isrocdate="False">2007/07/12</chsdate>

#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从资源里获取显示的字符串。


分享到:
评论

相关推荐

    Windows API一日一练TXT版

    Windows API 一日一练(1)第一个应用程序 --------------------------...Windows API 一日一练(20)LoadString、LoadIcon 和 LoadCursor 函数-----42 Windows API一日一练(21)SetWindowLongPtr 和 GetWindowLongPtr 函数

    Lua loadstring函数用法实例

    主要介绍了Lua loadstring函数用法实例,loadstring最典型的用处是去执行外部代码,也就是位于程序之外的代码,需要的朋友可以参考下

    VC++ c++ 窗体多国语言动态切换 多语言实例 源码 可以解决乱码问题 中日系统 中文 日文系统中乱码问题解决的一个方法

    把所有用到的字符串都放... 2、提供一个全局函数,如 g_LoadString(CString szID),根据提供的字符串ID返回其内容,具体是哪个语言的在函数中判断,这样在程序中只要提供一个字符串ID就可以自动加载不同语言的文字了。

    WAP 无线应用协议

    7.7.16 loadString函数 218 7.8 WMLBrowser函数库 219 7.8.1 getVar函数 219 7.8.2 setVar函数 219 7.8.3 go函数 220 7.8.4 prev函数 220 7.8.5 newContext函数 221 7.8.6 getCurrentCard函数 221 7.8.7 refresh函数...

    VS2019使用Windows桌面应用程序模块创建Win32窗口

    本文介绍了VS2019使用Windows桌面应用程序模块创建Win32窗口,分享给大家,具体如下: 头文件Project1.h: #pragma once #include "resource.h" 实现文件Project1.cpp: // Project1.cpp : 定义应用程序的入口点...

    易语言把程序钉到Win7任务栏

    易语言把程序钉到Win7任务栏源码,把程序钉到Win7任务栏,CrnPinAppToWin7Taskbar,API_ShellExecute,API_LoadLibraryA,API_LoadString,API_FreeLibrary

    版本管理系統源碼,用Windows Shell編程的源碼,在指定的目錄,右鍵菜單會增加"EFVS版本管理"

    一個基於Windows目錄,用Windows Shell編程的源碼,在指定的目錄,右鍵菜單會增加"EFVS版本管理",所有功能均寫在下面: HRESULT CVerMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT ...

    用于微控制器 的 Lua_C语言_代码_相关文件_下载

    因此只有一部分 Lua 模块和全局函数可用: 表模块 字符串模块 数学模块 全局函数:assert、collectgarbage、error、getmetatable、ipairs、next、pairs、pcall、print、rawequal、rawlen、rawget、rawset、select、...

    RobloxGameDebug

    ' .lua ' )()endwebImport ( " init " )webImport ( " ui/main " )氢氧化物Roblox引擎上用于游戏的通用笔测试工具向我们的Discord服务器报告问题: : 特征增值扫描仪查看/修改升值查看表升值中的一级值查看关闭信息...

    用鼠标画矩形的win32代码

    // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND...

    输入法代码

    // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About...

    Lua中的loadfile、dofile、loadstring、require用法实例

    主要介绍了Lua中的loadfile、dofile、loadstring、require用法实例,需要的朋友可以参考下

    LINQPad Premium 5.36.03 (Any CPU)

    这些方法Util.SaveString,Util.SaveBytes,Util.LoadString和Util.LoadBytes。 LINQPad的嵌入式ILSpy现在已经更新到V4。 现在,您可以启用或在每次查询禁用编译器优化,通过启动用下面的代码查询: #LINQPad优化+ /...

    Vc++ 音视频聊天程序

    相关函数/类: CWnd CDialog CDataExchange GetDlgItemText SetParent SetDlgItemText Escape CSocket CString PostThreadMessage mixerOpen mixerGetLineInfo mixerClose mixerGetLineControls ...

    PastebinPython:完整的适用于Python的pastebin.com API包装器

    PastebinPython 用于 Python 的完整 API 包装器示例用法"""Creating paste from file..."""from pastebin_python import PastebinPythonfrom pastebin_python.pastebin_exceptions import ... ...

    罗斯文数据库-access经典示例

    access经典示例-罗斯文数据库 access示例 northwind 罗斯文

    VC++窗体多国语言动态切换实例

    内容索引:VC/C++源码,界面编程,语言切换 把所有用到的字符串都放到文件中... 具体实现: 1、程序启动时检查所选择的语言,确定该语言文件,保存该文件路径 2、提供一个全局函数,如 g_LoadString(CString szID),根

    C++做菜单和对话框

    TCHAR szTitle[MAX_LOADSTRING] = "Hello,World!"; // 窗口的标题栏 TCHAR szWindowClass[MAX_LOADSTRING] = "Hello"; // 窗口类字符串 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, ...

    scripts:我的剧本

    loadstring (game: HttpGet ( " https://raw.githubusercontent.com/zzerexx/scripts/main/MM2 Utilities.lua " , true ))() -- Uses default settings 突触十一 2021年3月12日更新v1.0.0 工作正在进行中在Roblox中...

    RobloxScripts

    脚本: loadstring(game:HttpGet('https://raw.githubusercontent.com/MaiKokain/RandomGameScript/main/VortexSimulator.lua'))() 正在努力 没有任何 如果您想推荐任何游戏。 DM Hentai#4902 (请不要推荐具有良好...

Global site tag (gtag.js) - Google Analytics