設置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消息即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM