设置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, 0);
    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】【原创】

时间: 2024-07-31 09:48:53

设置windows窗口ICON 【windows 编程】【API】【原创】的相关文章

重温WIN32 API ------ 最简单的Windows窗口封装类

1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C++作为C的超集,能实现所有C能实现的功能.其实反之亦然,C本身也能完成C++超出的那部分功能,只是可能需要更多行的代码.就本人理解而言, 对于巨大型项目,还是使用纯C来架构更加稳妥: 对于中小型项目来说,C++可能更方便快捷.由于目前做的是中小项目,所以决定把C++作为主要开发语言. 1.2 关于C

windows界面程序设计,设置一个窗口始终在屏幕最前,SetWindowPos函数

有时这种需求还是很必须的,比如现在做的一个登录验证系统,如果在windows登录界面点击到窗口外面,那窗口就会永远隐藏掉没法再启用了.这种情况必须设置该窗口一直在最前. 使用函数SetWindowPos. 例如: SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE); 首先第一个参数是窗口句柄. 之后是设置窗口层级: 然后设置窗口坐标和新的高度宽度. 最后一个参数: 这个函数的使用的位置,就是在CreateWindow函数之后,立即调用即可. hW

windows客户端开发--windows api大全

网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialo

Windows Phone 8 蓝牙编程

蓝牙是手机的近距离无限传输的技术,在之前的Windows Phone 7系统手机里面仅支持蓝牙耳机功能,并不支持蓝牙文件信息传输,那么在Windows Phone 8手机里面将全面支持蓝牙技术,并且提供了相关的API来给开发者使用.开发者可以利用蓝牙的相关API来创建应用程序,在应用程序里面使用手机的蓝牙技术来进行近距离的文件传输和发送接收消息,创造出更加有趣和方便的应用软件. 在Windows Phone 8里面可以在应用程序里面利用蓝牙进行通信,使用蓝牙相关的API,可以让应用程序连接到另外

Windows窗口消息大全

Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #include "AFXPRIV.H"//消息值的定义来源 #include "Dde.h"//DDE消息值的定义来源 #include "CPL.H"//控制面板消息值的定义来源 #include "WFEXT.H"//文件管理器的消

windows批处理(cmd/bat)编程详解

reference: http://blog.csdn.net/bingjie1217/article/details/12947327 http://www.cnblogs.com/doit8791/archive/2012/05/20/2511001.html 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共用的,只是cmd文件中允许使用的命令要比bat文件多.cmd文件只有在windo

OpenGL学习笔记:Console工程下如何不显示控制台黑窗口只显示Windows窗口

刚学习OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口. 其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows,程序的入口点改成mainCRTStartup. 下面我先把几中解决办法列举出来,再解释下我的理解. 方法一:在程序中加入一句#pragma comment(linker, “/subsystem:\”windows\” /entry:\”mainCRTStartup\””),建议加在include的后面. 方法二:修

在windows下的QT编程中的_TCHAR与QString之间的转换

由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef UNICODE #define QStringToTCHAR(x)     (wchar_t*) x.utf16() #define PQStringToTCHAR(x)    (wchar_t*) x->utf16() #define TCHARToQString(x)     QString:

Windows客户端C/C++编程规范“建议”——函数

1 函数 1.1 代码行数控制在80行及以内 等级:[要求] 说明:每个函数的代码行数控制应该控制在80行以内.如果超过这个限制函数内部逻辑一般可以拆分.如果试图超过这个标准,请列出理由.但理由不包含如下: 无法拆分. 流程内部逻辑复杂,无需拆分,即使拆分了,拆分的函数也不会被其他地方用到.(解释:拆分可以减少代码行数,提炼后的函数可以方便读者快速理解函数逻辑并定位问题.) 1.2 代码列数控制在100字符及以内 等级:[要求] 说明:每行代码不可以超过100字符.如果超过这个字符数,代码的美观