WIN32学习——资源学习

1 在使用任何资源的时候都要加上头文件:#include "resource.h"

2 资源的分类(部分):

菜单资源

图标资源

光标资源

字符串资源

加速键资源

位图、对话框资源等等

3 菜单资源总结:

加载菜单资源有两种方式:

1)在注册窗口类的时候进行挂载,用到宏MAKEINTRESOURCE

2)在创建窗口函数中可以挂载,用到的函数为LoadMenu

4 图标资源总结:

1)加载图标用到的函数为LoadIcon

2)在窗口中挂载图标的两种方式:

a、在注册窗口类中挂载,需要用到MAKEINTRESOURCE

b、可以发送WM_SETICON消息,该消息的附加参数说明:WPARAM - 图标的类型(ICON_BIG/ICON_SMALL)大图标还是小图标;LPARAM - 图标的句柄(LoadIcon)

5 光标资源总结:

1)每一个光标都要设置热点(HotSpot)

2)加载光标函数LoadCursor

3)窗口中挂载光标的两种方式:

a、在注册窗口类时,挂载

b、可以发送WM_SETCURSOR消息,在该消息处理函数中调用SetCursor函数来设置光标

6 字符串资源总结:

1)加载字符串函数LoadString

7 加速键使用总结:

1)加载加速键,LoadAccelerators

2)处理加速键消息,TranslateAccelerator

int TranslateAccelerator(

HWND hWnd, //处理消息的窗口句柄

HACCEL hAccTable, //加速键句柄

LPMSG lpMsg //消息

);如果是加速键返回非0

3)加速键处理过程:

1 检测消息是否是WM_KEYDOWN/WM_SYSKEYDOWN获取按键状态

2 根基按键状态,从HACCEL中查找对应命令ID

3 把对应ID封装在WM_COMMAND消息中并发送,处理ID所对应的命令

注:TranslateAccelerator函数既封装消息,又会发送消息,所以不需要DispatchMessage。

附加以上学习代码:

/*
说明:实现了资源的练习,包括菜单资源、光标资源、图标资源、字符串资源和加速键资源的练习。
		菜单资源的加载有两种方式,分别是在注册窗口类和创建窗口的时候,加载菜单
功能:点击“关于”可以更改图标,光标在客户区内左右两半边切换
*/

#include <Windows.h>
#include "resource.h"

HINSTANCE g_hInstance;
HCURSOR g_hCursor[2];

void OnCommand(HWND hWnd,WPARAM wParam)
{
	//SHORT uMenuID = LOWORD(wParam);
	switch(LOWORD(wParam))
	{
	case ID_NEW:
		MessageBox(hWnd,__TEXT("点击了新建"),__TEXT("提示"),MB_OK);
		break;
	case ID_QUIT:
		PostQuitMessage(0);
		break;
	case ID_ABOUT:
		HICON hIc = LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1));
		SendMessage(hWnd,WM_SETICON,ICON_BIG,(LPARAM)hIc);
		MessageBox(hWnd,__TEXT("点击了关于"),__TEXT("提示"),MB_OK);
		break;
	}
}

void OnCreate(HWND hWnd,WPARAM wParam)
{
	g_hCursor[0] = LoadCursor(g_hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
	g_hCursor[1] = LoadCursor(g_hInstance,MAKEINTRESOURCE(IDC_CURSOR2));
}

BOOL OnSetCursor(HWND hWnd,LPARAM lParam)
{
	if(LOWORD(lParam) == HTCLIENT )
	{
		//获取窗口大小
		RECT rt = {0};
		GetClientRect(hWnd,&rt);
		//获取鼠标的位置
		POINT pt = {0};
		GetCursorPos(&pt);
		//屏幕坐标向窗口坐标转换
		ScreenToClient(hWnd,&pt);
		if (pt.x < rt.right / 2)
		{
			SetCursor(g_hCursor[0]);
		}
		else if(pt.x >= rt.right / 2)
		{
			SetCursor(g_hCursor[1]);
		}
		return TRUE;
	}
	return FALSE;
}
LRESULT CALLBACK MyProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_SETCURSOR:
		if(OnSetCursor(hWnd,lParam))
			return 0;
		//return 0;
		break;
	case WM_CREATE:
		OnCreate(hWnd,wParam);
		break;
	case WM_COMMAND:
		OnCommand(hWnd,wParam);
		break;
	case WM_SYSCOMMAND:
		if (wParam == SC_CLOSE)
		{
			PostQuitMessage(0);
		}
		break;
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

ATOM Register(LPCWSTR className)
{
	WNDCLASSEX wc = {0};
	wc.cbClsExtra = 0;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.hCursor = LoadCursor(g_hInstance,MAKEINTRESOURCE(IDC_CURSOR1));//NULL;
	wc.hIcon = LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON1));//NULL;
	wc.hIconSm = LoadIcon(g_hInstance,MAKEINTRESOURCE(IDI_ICON2));//NULL;
	wc.hInstance = g_hInstance;
	wc.lpfnWndProc = MyProc;
	wc.lpszClassName = className;
	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);//NULL;
	wc.style = CS_VREDRAW | CS_HREDRAW;
	return RegisterClassEx(&wc);
}

HWND Create(LPCWSTR className,LPCWSTR windowName)
{
	//在创建窗口中,只能用来修改菜单
	return CreateWindowEx(0,className,windowName,WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,g_hInstance,NULL);
}

void Show(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

void Message(HWND hWnd)
{
	MSG ms = {0};
	HACCEL hAC = LoadAccelerators(g_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
	while (GetMessage(&ms,NULL,0,0))
	{
		  if(!TranslateAccelerator(hWnd,hAC,&ms))
		  {
			  TranslateMessage(&ms);
			  DispatchMessage(&ms);
		  }
	}
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	g_hInstance = hInstance;
	Register(__TEXT("Main"));
	//字符串资源的使用
	TCHAR szText[256] = {0};
	LoadString(g_hInstance,IDS_STRWINDOW,szText,256);
	//HWND hWnd = Create(__TEXT("Main"),__TEXT("This is test"));
	HWND hWnd = Create(__TEXT("Main"),szText);
	Show(hWnd);
	Message(hWnd);
	return 0;
}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 、如何替换默认的类厂? 2 、如何让 COM 组件支持 Web 事件? 3 、如何动态创建要求 License 的 ActiveX 控件? 4 、如何在 Web 页面上生成基于 XML 的树形菜单? 5 、如何在 Web 页面上创建动态表格? 6 、如何为 Win32 服务程序提供事件源消息文件? 7 、如何创建单实例(静态) COM 组件? 8 、如何在 Delphi 6 及以上版本中使用可变常量(类型常量)? 9 、几个有用的 ANSI C 和 VC++ 预定义宏 10 、如何在自己的程序中使用脚本语言? 11 、如何在基于 CHtmlView 的程序中使用 HTML 事件映射? 12 、如何得到 Web 页面中的 COM 组件的原始接口? 13 、如何生成全球唯一标识( UID )? 14 、如何重写 MFC 的缺省控件容器( IOleContainer )? 15 、如何重写 WebBroswer 控件的缺省安全处理功能? 16 、如何重写 WebBroswer 控件的缺省下载管理器? 17 、如何定制 IE 或 WebBroswer 控件的缺省打印和打印预览框? 18 、如何扩展 IE 或 WebBroswer 控件提供的文档对象模型( DOM )? 19 、如何给 WebBroswer 控件的扩展文档对象(文档 .external )提供事件能力 ? 20 、如何打开流中的 HTML 文档? 21 、如何使 Web 页面中的对象可以拖动? 22 、如何把 Web 页面中用到的图像等外部文件嵌入 DLL 或 Exe ? 23 、如何使用 #import 指令从文件定位特定类型库资源 ID ? 24 、如何让你的 MFC 类实现 IDispatch 接口? 25 、如何自行管理 IE 缓存目录里的内容? 26 、 Windows Mobile 里如何使用 WebBrowser 控件? 27 、为什么在 Windows Mobile 里无法使用宿主在 exe 里的 COM 组件? 28 、如何扩展 IE 的协议,使其支持自定义的协议?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值