设置windows窗口ICON 【windows 编程】【API】【原创】
1. ICON介绍
最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录。本文主要介绍了如何更改windows对话框窗口的ICON图标。这里首先介绍一下windows ICON定义。在我们使用的windows APP上,一般都存在两个ICON。一个是打开APP后显示与左上角的小的图标文件(SMALL ICON)以及按下Alt+Tab切换窗口时显示的一个大的图标文件(BIG ICON)。以windows自带的记事本程序为例,小的图标文件如下图1所示:
图1 记事本程序的SMALL ICON
大图标样式如图2所示:
图2 记事本程序的BIG ICON
2. 设置ICON实现
在上面的ICON定义介绍完后,进入本文的主要内容——通过windows 编程设置windows窗口的ICON。整个设置ICON过程分为以下几个步骤:
2.1 获取ICO资源文件
(1)首先可以到百度图片上搜“ico”找到合适的一个图标文件,另存到本地。(注意,这里保存下来的是gif或者png文件,需要在网上用转换工具转为ico文件)
(2)将上一步下载的图标文件(gif或者png等)转换为ico(下面的地址可以参考 http://www.img2ico.net/)本文示例采用的ICON图标如图3所示:
图3 示例ICON
2.2 新建空的win32工程,建立起基本的对话框以及加载ICON资源
(1)Resource Files -> Add -> Resource -> Dialog -> New // 新建对话框窗口,效果如下
图4 新建一个对话框窗口
(2)Resource Files -> Add -> Resource -> Icon -> Import // 引入步骤1中生成的ico文件
图5 引入ICON资源
(3)修改生成的对话框窗口ID为IDD_MAIN, 图标文件的ID为IDI_APPICON(改名后含义更加明确,且方便后续调用记忆方便)
2.3 程序实现:设置窗口的ICON
(1)设计测试窗口CTestDlg类,并定义窗口过程函数以及其他的初始化、关闭操作。首先定义了CTestDlg窗口,并且定义了相关的消息处理函数Test_Proc、Test_OnInitDlg、Test_OnCommand和Test_OnClose。
/************************************************************************/
/* file : 定义一个测试窗口类,用坐改变窗口ICON的示例窗口
* author : Huagang Li
* date : 2014-8-21 09:42:53
* tips : 1. 将窗口设置为一个统一的类,方便添加新的功能
* 2. 下面的ifndef 后面是一个guid生成器生成的字符串序列,保证唯一性
*
*/
/************************************************************************/
#ifndef _E159C66B_2CD4_4E0E_861E_9328E6E99B66_H_
#define _E159C66B_2CD4_4E0E_861E_9328E6E99B66_H_ #include <Windows.h> class CTestDlg
{
public:
static BOOL WINAPI Test_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); private:
static BOOL Test_OnInitDlg(HWND hWnd, HWND hWndFocus, LPARAM lParam);
static BOOL Test_OnCommand(HWND hWnd, int id, HWND hWndCtl, LPARAM lParam);
static BOOL Test_OnClose(HWND hWnd);
}; #endif // _E159C66B_2CD4_4E0E_861E_9328E6E99B66_H_
具体的接口实现如下:
#include "SetIcon.h"
#include "resource.h" #include <WindowsX.h> // 测试窗口的过程处理函数
BOOL WINAPI CTestDlg::Test_Proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Test_OnInitDlg);
HANDLE_MSG(hWnd, WM_COMMAND, Test_OnCommand);
HANDLE_MSG(hWnd, WM_CLOSE, Test_OnClose);
} return FALSE;
} // 测试窗口的初始化函数,设置窗口ICON就可以在这里进行
BOOL CTestDlg::Test_OnInitDlg( HWND hWnd, HWND hWndFocus, LPARAM lParam )
{
BOOL bRet = TRUE;
do
{
// 设置窗口图标为下载的ico
HINSTANCE hInstance = ::GetModuleHandle(NULL);
if (NULL == hInstance)
{
bRet = FALSE;
break;
}
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPICON));
if (NULL == hIcon)
{
bRet = FALSE;
break;
} // 设置窗口的大小图标
// 大图标:按下alt+tab键切换窗口时对应的图标
// 小图标:就是窗口左上角对应的那个图标
::SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
::SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); } while (false); return bRet;
} // 窗口其他命令响应函数
BOOL CTestDlg::Test_OnCommand( HWND hWnd, int id, HWND hWndCtl, LPARAM lParam )
{ return TRUE;
} // 关闭测试窗口
BOOL CTestDlg::Test_OnClose( HWND hWnd )
{
::EndDialog(hWnd, );
return TRUE;
}
(2)设置Icon图标核心代码如下(设置ICON最核心的部分)
//////////////////////////////////////////////////////////////////
// 核心代码区
HINSTANCE hInstance = ::GetModuleHandle(NULL);
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPICON));
// 设置窗口的大小图标
// 大图标:按下alt+tab键切换窗口时对应的图标
// 小图标:就是窗口左上角对应的那个图标
::SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
::SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
//////////////////////////////////////////////////////////////////
(3)编写主函数,并实例化测试窗口,运行观察实际效果。主函数如下所示:
/************************************************************************/
/* file : 程序的入口点
* author : Huagang Li
* date : 2014-8-21 10:01:11
* tips : 将窗口的定义实现在其他类中,main入口只保存窗口例化
*
*/
/************************************************************************/ #include <windows.h>
#include <CommCtrl.h>
#include "SetIcon.h"
#include "resource.h" // InitCommonControls倚赖的库,需要在这里加上
#pragma comment(lib, "comctl32.lib") int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
InitCommonControls();
::DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, CTestDlg::Test_Proc); return EXIT_SUCCESS;
}
最后,来看运行后的结果:
图6 运行结果—SMALL ICON
图7 运行结果—大图标
从图6和图7中可以看出,窗口的ICON均已发生了变化,证明了本文方法的可行性。
3. 总结
一句话总结,设置windows窗口ICON的方法就是:准备好ICON资源,然后发送给操作系统WM_SETICON消息即可。
设置windows窗口ICON 【windows 编程】【API】【原创】的更多相关文章
- WIN32 API ------ 最简单的Windows窗口封装类
1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C+ ...
- win32 api Windows窗口的创建
windows窗口的创建有以下几个步骤: 1.创建注册窗口类 2.创建窗口句柄 3.显示更新窗口 4.消息循环 1.创建注册窗口类 所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始 ...
- windows界面程序设计,设置一个窗口始终在屏幕最前,SetWindowPos函数
有时这种需求还是很必须的,比如现在做的一个登录验证系统,如果在windows登录界面点击到窗口外面,那窗口就会永远隐藏掉没法再启用了.这种情况必须设置该窗口一直在最前. 使用函数SetWindowPo ...
- delphi编程实现为Windows窗口标题栏添加新按钮
下面我们就讨论一下在delphi中如何给窗口的标题栏上添加新的按钮. 一.实现起来要定义以下过程: 1. 定义DrawCaptButton过程,这个过程的功能是在指定的位置画出按钮. 在过程中要使用w ...
- 【转】Windows 窗口层次关系
原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...
- 关于Windows窗口框架
我们知道Windows的窗口消息处理函数是C方式, 面向过程的, 所以窗口框架的基本任务就是将它转成面向对象的方式, 确切的说如何将消息处理函数第一参数HWND转成对象指针. 关于这个问题, 其实网上 ...
- Windows Phone 8 蓝牙编程
蓝牙是手机的近距离无限传输的技术,在之前的Windows Phone 7系统手机里面仅支持蓝牙耳机功能,并不支持蓝牙文件信息传输,那么在Windows Phone 8手机里面将全面支持蓝牙技术,并且提 ...
- VC菜菜鸟:建立第一个基于Visual C++的Windows窗口程序
建立第一个基于VisualC++的Windows窗口程序: 发表于:http://blog.csdn.net/it1988888/article/details/10306585 a)执行命令:新建 ...
- Windows窗口样式速查参考,Delphi窗口控件的风格都有它们来决定(附Delphi何时用到它们,并举例说明)good
/* 窗口样式参考列表(都是GetWindowLong的GWL_STYLE风格,都是TCreateParams.Sytle的一部分),详细列表如下:https://msdn.microsoft.com ...
随机推荐
- MySql的rpm安装
MySQL 5.5(rpm格式)在Linux 上安装 Linux系统上安装MySQL 5.5prm 1.准备工作 从MySQL官网上分别下载mysql服务器端于客户端包. 下载步骤:Downloads ...
- 【HDOJ】2487 Ugly Windows
暴力解. #include <cstdio> #include <cstring> #define MAXN 105 char map[MAXN][MAXN]; ]; int ...
- 【转】Android 菜单(OptionMenu)大全 建立你自己的菜单--不错
原文网址:http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html 菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中, ...
- 【转】java提高篇(二三)-----HashMap
原文网址: http://www.cnblogs.com/chenssy/p/3521565.html HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以 ...
- 【转】Java中字符串中子串的查找共有四种方法(indexof())
原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...
- 【最短路】BAPC2014 B Button Bashing (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- MVVM模式中WPF数据的完全绑定
一:截图,描述:将后台代码的姓名.年龄绑定到文本框,单击”增加年龄“--年龄自+1,单击”显示年龄“--弹出年龄的显示对话框,实现了从文本框修改年龄和后台更改年龄并显示到文本框 运行结果和解决方案管理 ...
- C#调用webservers实现天气预报
一:截图 二:实现步骤 1.引入Web服务.在VS中项目上右击→添加服务引用. 2.在弹出的添加服务引用窗口,录入web服务地址和引用后的命名空间. 三:源代码 using System; using ...
- 《University Calculus》-chape4-导数的应用-洛必达法则
在求解极限的时候,我们常会遇到0/0型的不定式而无法进一步的求解极限,而洛必达法则就是用于处理这样的特定情况. 洛必达法则: 其证明过程要基于柯西中值定理(在该专栏的微分中值定理中给出). 证明:
- hdu4696 想法题
就像1.2元人民币可以凑成任意你想要的面值一样.由于一定会有环,只要有C[i] == 1 就可以造成任何数.够坑吧 #include <cstdio> #include <cstri ...