在VS 2013中如何给Windows应用程序添加自定义的图标?

哈利_蜘蛛侠 2014-03-19 01:04:21
看的是2002年出版的《Windows游戏变成大师技巧》,第三章说的那种方法在 VS 2013中好像不管用了。到底怎么办呢?搜了一下也没搜到满意的结果。我照着书给的代码进行了适当的修改,然后编译成功了,可是没有任何运行结果。
...全文
3103 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈利_蜘蛛侠 2014-04-26
  • 打赏
  • 举报
回复
在DX中可以用 LoadIconFromFile 这样的函数,也算是不错了。
哈利_蜘蛛侠 2014-04-11
  • 打赏
  • 举报
回复
引用 19 楼 wangting627 的回复:
你要只改一个图标 就把res文件夹下的ico覆盖替换掉不就OK了? (PS:VS2013没用过)
不同的地方需要不同的图标。我至少得知道如何引用这些图标吧。
哈利_蜘蛛侠 2014-04-10
  • 打赏
  • 举报
回复
引用 17 楼 supersayess 的回复:
这个的解决方案, 好像是在.res文档末尾加上一个空白行……
啊哈,原来是这样啊!真是高手啊!不过怎么会是因为这样的原因呢?这也未免太坑爹了吧!
幻夢之葉 2014-04-10
  • 打赏
  • 举报
回复
资源视图里面增加位图不可以吗?
不败的拿破仑 2014-04-10
  • 打赏
  • 举报
回复
你要只改一个图标 就把res文件夹下的ico覆盖替换掉不就OK了? (PS:VS2013没用过)
虚空梦影 2014-04-09
  • 打赏
  • 举报
回复
这个的解决方案, 好像是在.res文档末尾加上一个空白行……
赵4老师 2014-03-20
  • 打赏
  • 举报
回复
重起电脑或Explorer或注销再重新登录试试? 对所有图标资源,资源管理器内部有个Cache,这个Cache有时得不到适当的刷新,会导致图标资源更新了,但仍显示旧图标。 我猜。
哈利_蜘蛛侠 2014-03-20
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
重起电脑或Explorer或注销再重新登录试试? 对所有图标资源,资源管理器内部有个Cache,这个Cache有时得不到适当的刷新,会导致图标资源更新了,但仍显示旧图标。 我猜。
好吧,我终于解决了!我把心得写在了下面: 注意事项: 1、 创建.rc文件的方法:在Solution Explorer的Resource Files文件夹上点右键,然后创建一个.rc文件,名字就用默认的Resource.rc好了。 然后VS就会自动生成一个与之配套的.h文件:Resource.h 2、 如何编辑.rc文件?创建好.rc文件后,VS会自动跳转到Resource View视图;这个时候,返回Solution Explorer,然后右击Resource.rc,点击 View Code,忽略弹出的对话框,就可以看见并且编辑里面的代码了。 3、 注意:这两个生成的文件中都自动地带有代码。我们编辑的时候不要动原有的代码,直接在末尾加上新代码就好了。
哈利_蜘蛛侠 2014-03-20
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
重起电脑或Explorer或注销再重新登录试试? 对所有图标资源,资源管理器内部有个Cache,这个Cache有时得不到适当的刷新,会导致图标资源更新了,但仍显示旧图标。 我猜。
好吧,我将 LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS)) 改成 LoadIcon(hinstance, “ID_ICON_HS”) 才解决了。看来那两个#define语句不起作用啊!
哈利_蜘蛛侠 2014-03-20
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
重起电脑或Explorer或注销再重新登录试试? 对所有图标资源,资源管理器内部有个Cache,这个Cache有时得不到适当的刷新,会导致图标资源更新了,但仍显示旧图标。 我猜。
已经重启了一次了。结果是一样的。而且我觉得应该不可能有这么恐怖的bug吧。
哈利_蜘蛛侠 2014-03-20
  • 打赏
  • 举报
回复
引用 10 楼 unituniverse2 的回复:
右键工程里的那个rc文件,菜单中选择“编辑代码”,而不是直接双击它 rc的编辑方法从vc2002到2013一直都差不多。你是不是用了Express版本?那个版本是不支持rc文件的。只有专业版到旗舰版才支持
为了让你能够编译运行,从而帮忙查找原因,我把整个demo3_1.cpp放在这里了,可能有点长:

// DEMO3_1.CPP  - Demo of loading an icon and cursor resource
// 运行前要把项目属性中的 Character Set改为Multi-byte Character Set

// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN  // just say no to MFC

#include <windows.h>   // include all the windows headers
#include <windowsx.h>  // include useful macros
#include <mmsystem.h>
#include <cstdio>	// 原版是 #include <stdio.h>
#include <cstdlib>	// 原版是 #include <stdlib.h>
#include <cmath>	// 原版是 #include <math.h>
#include "resources.h" // include the resource header

// DEFINES ////////////////////////////////////////////////

// defines for windows 
#define WINDOW_CLASS_NAME "WINCLASS1"

// GLOBALS ////////////////////////////////////////////////


// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
	UINT msg,
	WPARAM wparam,
	LPARAM lparam)
{
	// this is the main message handler of the system
	PAINTSTRUCT		ps;		// used in WM_PAINT
	HDC				hdc;	// handle to a device context

	// what is the message 
	switch (msg)
	{
	case WM_CREATE:
	{
		// do initialization stuff here

		// return success
		return(0);
	} break;

	case WM_PAINT:
	{
		// simply validate the window
		hdc = BeginPaint(hwnd, &ps);
		// you would do all your painting here
		EndPaint(hwnd, &ps);

		// return success
		return(0);
	} break;

	case WM_DESTROY:
	{
		// kill the application, this sends a WM_QUIT message 
		PostQuitMessage(0);

		// return success
		return(0);
	} break;

	default:break;

	} // end switch

	// process any messages that we didn't take care of 
	return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinstance,
	HINSTANCE hprevinstance,
	LPSTR lpcmdline,
	int ncmdshow)
{

	WNDCLASSEX winclass; // this will hold the class we create
	HWND	   hwnd;	 // generic window handle
	MSG		   msg;		 // generic message

	// first fill in the window class stucture
	winclass.cbSize = sizeof(WNDCLASSEX);
	winclass.style = CS_DBLCLKS | CS_OWNDC |
		CS_HREDRAW | CS_VREDRAW;
	winclass.lpfnWndProc = WindowProc;
	winclass.cbClsExtra = 0;
	winclass.cbWndExtra = 0;
	winclass.hInstance = hinstance;
	winclass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS));
	//winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

	// 原版少了下面这个;当然这是不行的
	winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	winclass.lpszMenuName = NULL;
	winclass.lpszClassName = WINDOW_CLASS_NAME;
	winclass.hIconSm = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS));
	//winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

	// register the window class
	if (!RegisterClassEx(&winclass))
		return(0);

	// create the window
	if (!(hwnd = CreateWindowEx(NULL,                  // extended style
		WINDOW_CLASS_NAME,     // class
		"Demo of Custom Cursor and Icon", // title
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		0, 0,	  // initial x,y
		400, 400,  // initial width, height
		NULL,	  // handle to parent 
		NULL,	  // handle to menu
		hinstance,// instance of this application
		NULL)))	// extra creation parms
		return(0);

	// enter main event loop, but this time we use PeekMessage()
	// instead of GetMessage() to retrieve messages
	while (TRUE)
	{
		// test if there is a message in queue, if so get it
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			// test if this is a quit
			if (msg.message == WM_QUIT)
				break;

			// translate any accelerator keys
			TranslateMessage(&msg);

			// send the message to the window proc
			DispatchMessage(&msg);
		} // end if

		// main game processing goes here
		// Game_Main(); // or whatever your loop is called
	} // end while

	// return to Windows like this
	return(msg.wParam);

} // end WinMain

///////////////////////////////////////////////////////////
并且我还发现了巨诡异的事情:在项目文件夹里把HS.ico和bomb.ico的名字互换的话,那么它们显示在文件夹里的图标也会互换!但是打开看了后还是原样的……难道我的电脑成精了?
哈利_蜘蛛侠 2014-03-19
  • 打赏
  • 举报
回复
引用 10 楼 unituniverse2 的回复:
右键工程里的那个rc文件,菜单中选择“编辑代码”,而不是直接双击它 rc的编辑方法从vc2002到2013一直都差不多。你是不是用了Express版本?那个版本是不支持rc文件的。只有专业版到旗舰版才支持
你指的是View Code吗?选择打开的话,会切换到资源视图,那里的rc是一个文件夹形式。 这是我的resources.rc文件的代码:

// here are the icon defines, note the use of C++ comments
ID_ICON_BOMB	ICON	bomb.ico
ID_ICON_HS	ICON	HS.ico
这是相关的resources.h的代码:

// File name: resources.h
#define ID_ICON_BOMB	103	// these numbers are arbitrary
#define ID_ICON_HS	104
最后是最主要的代码文件demo3_1.cpp的头文件部分:

#include <windows.h>   // include all the windows headers
#include <windowsx.h>  // include useful macros
#include <mmsystem.h>
#include <cstdio>	// 原版是 #include <stdio.h>
#include <cstdlib>	// 原版是 #include <stdlib.h>
#include <cmath>	// 原版是 #include <math.h>
#include "resources.h" // include the resource header
然后该文件用到了图标的部分是这里:

winclass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS));
	// 中间省去无关代码
	winclass.hIconSm = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS));
可是运行的结果却是任务栏图标是ID_ICON_BOMB,而窗口的图标是默认图标!这个是为什么呀?
unituniverse2 2014-03-19
  • 打赏
  • 举报
回复
右键工程里的那个rc文件,菜单中选择“编辑代码”,而不是直接双击它 rc的编辑方法从vc2002到2013一直都差不多。你是不是用了Express版本?那个版本是不支持rc文件的。只有专业版到旗舰版才支持
哈利_蜘蛛侠 2014-03-19
  • 打赏
  • 举报
回复
引用 4 楼 titer1 的回复:
rc文件编辑,这个网上搜索一下就是
搜过了,没找到啊,搜到的都是不相关的。刚才我用记事本将rc文件打开,然后按照书上那样写了,不过还是没出窗口;不过我对照了一下以前的代码,发现少了一个调用LoadCursor函数的语句,就加上了,这次就有结果了,不过还是很奇怪,就是窗口上的小图标还是默认的图标;并且神奇的是,当我改变LoadIcon函数里的参数的时候,图标竟然没变!不过好歹我还是做到在任务栏上显示我的自定义图标了。 这就有问题了:我觉得VS不是让你用记事本去编辑rc文件的吧,应该有更科学的方法;另外问问有没有更新一点的Windows游戏编程的书,让我们这些适用VS 2008及其以后版本的新手能够学习?
哈利_蜘蛛侠 2014-03-19
  • 打赏
  • 举报
回复
引用 6 楼 buyong 的回复:
另外,你的问题和2013无关,从vc6-vc2013,都能弄
总不能让我用记事本打开rc文件然后编辑吧?好吧我确实这样做了,不过里面已经有一些代码了,总不能删掉自己写吧?
哈利_蜘蛛侠 2014-03-19
  • 打赏
  • 举报
回复
引用 5 楼 buyong 的回复:
[quote=引用 1 楼 u011873969 的回复:] 就是程序中有这么两行,怎么让它们生效?

        winclass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_BOMB));

	winclass.hIconSm = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS));
你的资源里有没有一个图标的ID是ID_ICON_BOMB?如果没有,就弄一个[/quote] 当然有啊。 VS 2013里的rc文件不是文本文件,而是一个类似对话框的东西,搞得我很郁闷。
buyong 2014-03-19
  • 打赏
  • 举报
回复
另外,你的问题和2013无关,从vc6-vc2013,都能弄
buyong 2014-03-19
  • 打赏
  • 举报
回复
引用 1 楼 u011873969 的回复:
就是程序中有这么两行,怎么让它们生效?

        winclass.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_BOMB));

	winclass.hIconSm = LoadIcon(hinstance, MAKEINTRESOURCE(ID_ICON_HS));
你的资源里有没有一个图标的ID是ID_ICON_BOMB?如果没有,就弄一个
titer1 2014-03-19
  • 打赏
  • 举报
回复
rc文件编辑,这个网上搜索一下就是
哈利_蜘蛛侠 2014-03-19
  • 打赏
  • 举报
回复
引用 2 楼 titer1 的回复:
找到对应的资源 res.就可以
可是我就是不知道如何生成res文件呀。主要是不知道rc文件里怎么弄代码。
加载更多回复(2)

65,207

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧