设置windows窗口ICON 【windows 编程】【API】【原创】

 1. ICON介绍

      最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录。本文主要介绍了如何更改windows对话框窗口的ICON图标。这里首先介绍一下windows ICON定义。在我们使用的windows APP上,一般都存在两个ICON。一个是打开APP后显示与左上角的小的图标文件(SMALL ICON)以及按下Alt+Tab切换窗口时显示的一个大的图标文件(BIG ICON)。以windows自带的记事本程序为例,小的图标文件如下图1所示:ICON定义示例——小图标

 

图1 记事本程序的SMALL ICON

大图标样式如图2所示:

ICON定义-大窗口

图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所示:

logo

图3 示例ICON

 

2.2 新建空的win32工程,建立起基本的对话框以及加载ICON资源
   (1)Resource Files -> Add -> Resource -> Dialog -> New  // 新建对话框窗口,效果如下

IDD_MAIN图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)