win32学习笔记(八) 图标资源、光标资源、字符串资源、加速键资源

图标资源
添加资源
注意图标的大小,一个图标文件中可以有多个不同大小的图标。
加载图标:
HICON LoadIcon(
    HINSTANCE hInstance
    LPCTSTR lpIconName          
);
设置图标:注册窗口类时。

光标资源:
添加光标资源:每个光标有HotSpot;
加载资源:
HCURSOR LoadCursor( 
    HINSTANCE hInstance,
    LPCTSTR lpCursorName
); hInstance 可以为NULL,获取系统默认Cursor
设置资源:
在注册窗口时设置光标,使用SetCursor设置光标。
HCURSOR SetCursor(HCURSOR hCursor);
WM_SETCURSOR消息
wParam:当前使用的光标句柄
LPARAM:LOWORD:当前区域的代码HTCLIENT(客户区)/HTCAPTION(标题栏)...
              HIWORD:    当前鼠标消息ID

字符串资源
    添加字符串表,在表中增加字符串
字符串资源的使用
int LoadSting(
    HINSTANCE hInstance,
    UINT uIN, //字符串ID
    LPTSTR lpBuffer,//接收你想得到的这个字符串的缓冲区
    int nBufferMax//缓冲区大小
);成功返回字符串长度,失败返回0.

加速键资源:
添加:添加加速键表,增加命令ID对应的加速键
使用:
加载加速键表:
HACCEL LoadAccelerators(
    HINSTANCE hInstance,
    LPCTSTR lpTableName
);返回加速键表句柄
翻译加速键
int TranslateAccelerator(
    HWND hWnd,
    HACCEL hAccTable,加速键表句柄
    LPMSG lpMsg//消息
);如果是加速键,返回非零。       
TranslateAccelerator伪代码:
TranslateAccelerator(hWnd, hAccel, &nMsg) {
    if (nMsg.message != WM_KEYDOWN)
        return 0;
    根据nMsg.wParam(键码值), 获知哪些按键被按下(例如ctrl + M)
    拿着(ctrl + M)到hAccel(加速键表) 中去匹配查找
    if(没找到) return 0;
    if (找到) {
        SendMessage(hWnd, WM_COMMAND, wParam(低两个字节是加速键ID, 高字是1),lParam没用);
        return 非零;
    }
}
加速键和菜单都可以发命令,发WM_COMMAND消息,WM_COMMAND消息的wParam的HIWORD如果是1表示来自加速键,0表示来自菜单项
LOWORD是命令ID。

#include <windows.h>
#include "resource.h"
#include "resource1.h"
HINSTANCE g_hInstance;
//窗口处理函数(自定义,处理消息)

void OnCommand(HWND hWnd, WPARAM wParam) {
	switch (LOWORD(wParam)) {
	case ID_NEW:
		/*if (HIWORD(wParam) == 0) MessageBox(hWnd, "新建菜单项被点击", "Infor", MB_OK);
		else
		MessageBox(hWnd, "ctrl + M被点击", "infor", MB_OK);*/
		MessageBox(hWnd, "新建命令已执行", "通知", MB_OK);
		break;
	}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
	switch (msgId) {
	case WM_COMMAND:
		OnCommand(hWnd, wParam);
		break;
	case WM_SETCURSOR:
	{
		HCURSOR hCur = LoadCursor(g_hInstance, (char*)IDC_CURSOR2);
		if (LOWORD(lParam) == HTCLIENT) {
			SetCursor(hCur);
			return 0; 
		} 
	}
	break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, msgId, wParam, lParam);
}

//入口函数
int  CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
	g_hInstance = hIns;
	//注册窗口类
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor = NULL;//LoadCursor(hIns, (char*)IDC_CURSOR1);
	wc.hIcon = LoadIcon(hIns, (char*)IDI_ICON1);
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	TCHAR name[] = TEXT("Main");
	wc.lpszClassName = name;
	wc.lpszMenuName = (char*)IDR_MENU1;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
	//在内存中创建窗口
	char szTitle[256] = { 0 };
	LoadString(hIns, IDS_WND, szTitle, 256);
	HWND hWnd = CreateWindow(name, TEXT(szTitle), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);
	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	HACCEL hAccel = LoadAccelerators(hIns, (char*)IDR_ACCELERATOR1);
	//消息循环
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, NULL, 0, 0)) {
		if (TranslateAccelerator(hWnd, hAccel, &nMsg)) continue;
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的。本书首先对Win32 API函数做完整的概述;然后收录五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 Win32 API作为 Microsoft 32位平台(包括:Windows 9x,Windows NT3.1/4.0/5.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。 从事Windows应用程序开发,离不开对Win32 API函数的调用。只有充分理解和利用API函数,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。 近年来,随着Microsoft 32位平台的版本升级, Win32 API函数的构成、功能与调用方式都有很大的发展变化,然而,国内很少有相关的新版资料出版。为了满足广大开发人员的迫切需求,我们经过认真收集、整理素材,组织编写了这本与各种Microsoft 32位平台最新版本同步的Win32 API参考手册。 全书收录了五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务。所有函数均附有功能说明、参数说明、返回值说明、备注以及引用说明。另外,在本书的第一章,我们对WiN32 API函数作了完整的概述;在附录部分,讲解了如何在Visual Basic和Delphi中对其调用。 由于篇幅较大,涉及技术内容广泛,加之时间仓促,书中难免存在不少错误或疏漏,希望广大读者给与批评指正。 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API函数。这些函数在程序员手中犹如"积木块"一样,可搭建出各种界面丰富、功能灵活的应用程序。不过,由于这些函数结构复杂,所以往往难以理解,而且容易误用。 随着软件技术的不断发展,在Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用"所见即所得"的编程方式来开发具有精美用户界面和功能的应用程序。这些可视化编程环境操作简便、界面友好,比如:Visual C++,Delphi,Visual Basic等等。在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能。事实上,这些类库和控件都是构筑在Windows API的基础上的,但它们使用方便,加速Windows应用程序的开发,所以受到程序员的普遍采用。有了这些类库和控件,程序员们便可以把主要精力放在整体功能的设计上,而不必过于关注具体细节。不过,这也导致了非常多的程序员在类库面前"固步自封",对下层API函数的强大功能一无所知。 实际上。程序员要想开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数。虽然类库和控件使应用程序的开发容易得多,但它们只提供Microsoft Windows的一般功能,对于一些比较复杂和特殊的功能来说,单使用类库和控件是难以实现的,必须直接使用API函数来编写。API函数是构筑整个Windows框架的基石,只有充分理解和利用API函数,才能深入到Windows的内部,充分发挥各种32位平台的强大功能和灵活性,才能成功地扩展和突破类库、控件和可视开发环境的限制。 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。 使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。 在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。 标准Win32 API函数可以分为以下几类: 窗口管理 窗口通用控制 Shell特性 图形设备接口 系统服务 国际特性 网络服务 在下面各节中,我们分别介绍这7种类型的API函数。 窗口管理函数向应用程序提供了一些创建和管理用户界面的方法。你可以使用窗口管理函数创建和使用窗口来显示输出、提示用户进行输入以及

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值