《Windows API每日一練》9.1 資源-圖標

本節講述圖標、鼠標指針位圖、字符串資源表、自定義資源的添加和應用。

本節必須掌握的知識點:

??? ????圖標

??? ????第56練:ICON圖標資源

??? ????鼠標指針位圖

??? ????字符串資源表

??? ????自定義資源

??? ????第57練:字符串資源表和自定義資源

9.1.1 圖標

在 Windows 窗口編程中,圖標(Icon)是用于表示應用程序、窗口或文件的小圖像。Windows 提供了幾種不同尺寸和顏色深度的圖標,用于在窗口標題欄、任務欄、文件資源管理器等地方顯示。

以下是一些與圖標相關的常見任務和概念:

●創建圖標文件:

1.圖標文件通常使用 .ico 擴展名,可以包含多個圖標資源。

2.可以使用圖標編輯器(如 Visual Studio、Visual Studio Code、GIMP 等)創建或編輯圖標文件。

●加載和顯示圖標:

1.使用 LoadIcon 函數從 .ico 文件或資源中加載圖標。

2.使用 DrawIcon 函數將圖標繪制到設備上下文(DC)中的指定位置。

●獲得圖標的大小:

cxIcon = GetSystemMetrics (SM_CXICON) ;

cyIcon = GetSystemMetrics (SM_CYICON) ;

●設置窗口圖標:

1.使用 WM_SETICON 消息或 SetClassLongPtr 函數設置窗口的大圖標和小圖標。

2.大圖標通常在窗口的標題欄和任務欄中顯示,小圖標顯示在窗口的任務欄按鈕中。

●資源文件中的圖標:

1.可以將圖標資源添加到應用程序的資源文件(.rc)中。

2.在應用程序啟動時,可以使用 LoadIcon 或 LoadIconEx 函數加載資源文件中的圖標。

在應用程序中使用圖標

Windows程序可以在定義一個帶有WNDCLASS結構并使用RegisterClass注冊的窗口類中指定圖標。當圖標文件同時包含標準大小和小號圖像時。在需要顯示圖標圖像時,Windows會在圖標文件中選擇大小最合適的圖像。

RegisterClass有一個增強版本,名為RegisterClassEx,它使用一個名為WNDCLASSEX 的結構。WNDCLASSEX結構有兩個額外的字段:cbSize和blconSm。cbSize字段表示 WNDCLASSEX結構的大小,而hlconSm應該被設為小圖標的句柄。因此,在WNDCLASSEX結構中你需要設定與兩個圖標文件相關聯的兩個圖標句柄—— 一個是標準圖標而另一個是小圖標。

因為Windows可以從單個圖標文件中提取了正確尺寸的圖標圖像。RegisterClassEx似乎沒有必要。如果hlconSm字段引用的是一個包含多個圖像的圖標文件,那么只有第一個會被使用。這可以是一個標準尺寸的圖標,只不過之后會被縮小。RegisterClassEx似乎是為使用多個圖標圖像設計的,這些圖像每個只包含一個圖標尺寸。因為可以在同一個文件中包含多個圖標尺寸,所以使用 WNDCLASS 和 RegisterClass也是可以的。

如果想在程序運行時動態改變程序的圖標,可以通過調用SetClassLong函數來實現。 比如,如果有另一個和標識符IDI_ALTICON 相關聯的圖標文件,便可以使用下面的語句 切換到那個圖標:

SetClassLong (hwnd, GCL_HICON,

?????? LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ALTICON))) ;

如果不想保存程序圖標的句柄,而是使用Drawlcon函數來在某處顯示它,那么你可以 調用GetClassLong函數來獲得句柄。比如:

DrawIcon (hdc, x, y, GetClassLong (hwnd, GCL_HICON)) ;

在Windows文檔的某些地方,LoadIcon被描述為“已過時”,而Loadlmage被推薦使 用。LoadImage當然更靈活,但它目前還無法代替Loadlcon的簡潔性。你會注意到在 ICONDEMO中Loadlcon對同一圖標被調用了兩次。這不是個問題,不會因此有更多內存被使用。Loadlcon是少有的這樣幾個函數之一:它獲得一個句柄,但不要求該句柄被銷毀。 實際上確實存在一個DestroyIcon函數,但它是和Createlcon、Createlconlndirect以及 CreateIconFromResource配套使用的。這些函數允許程序用算法動態生成圖標。

■下面是一個示例代碼片段,展示了如何加載和設置窗口圖標:

HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); //加載圖標資源

SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); //設置大圖標

SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); //設置小圖標

在上述示例中,hInstance 是應用程序的實例句柄,IDI_ICON1 是圖標資源的 ID。可以使用資源編輯器將圖標資源添加到應用程序的資源文件中,并分配一個唯一的 ID 給它。

VS添加資源步驟:

1.選中資源文件,鼠標右鍵>添加>資源

圖9-1 添加資源

??2.點擊添加后,自動生成ICONDEMO.rc和resource.h文件。選擇Icon,點擊新建或導入現有的Icon圖標資源。

?圖9-2 新建或導入圖標資源

?3.資源視圖窗口,選中已添加的資源ID_ICON1,鼠標右鍵選擇屬性或者ALT+ENTER鍵打開圖標編輯器修改ID。

?圖9-3 定義圖標資源屬性

4.修改ico文件名和ID并保存,或者按下ALT+ENTER鍵修改資源屬性。

?圖9-4 修改圖標文件名和ID

9.1.2 第56練:ICON圖標資源

/*------------------------------------------------------------------------

?056 WIN32 API 每日一練

???? 第56個例子ICONDEMO.C:ICON圖標資源

???? LoadIcon 函數

???? MAKEINTRESOURCE

???? DrawIcon函數

??? ?按下ALT+ENTER鍵修改資源屬性

?(c) www.bcdaren.com 編程達人

-----------------------------------------------------------------------*/

#include <windows.h>

#include "resource.h" //編譯器添加資源時自動創建的頭文件

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

TCHAR szAppName[] = TEXT("IconDemo");//程序名

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

?PSTR szCmdLine, int iCmdShow)

{

???? //TCHAR szAppName[] = TEXT("IconDemo");

???? HWND hwnd;

???? MSG msg;

???? WNDCLASSEX wndclass;

??? ?wndclass.cbSize = sizeof(WNDCLASSEX);? //新增

??? ?wndclass.hIconSm = NULL;?????????????? //新增

???? wndclass.style = CS_HREDRAW | CS_VREDRAW;

???? wndclass.lpfnWndProc = WndProc;

???? wndclass.cbClsExtra = 0;

???? wndclass.cbWndExtra = 0;

???? wndclass.hInstance = hInstance;

???? //szAppName為字符串ID,對應資源中的位圖ID需要修改為字符串ID"IconDemo"

??? // wndclass.hIcon = LoadIcon(hInstance, szAppName);

??? ?wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));//數字ID

???? wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

???? wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);

???? wndclass.lpszMenuName = NULL;

???? wndclass.lpszClassName = szAppName;

???? if (!RegisterClassEx(&wndclass))?? //RegisterClassEx

???? {

????????? MessageBox(NULL, TEXT("This program requires Windows NT!"),

?????????????? szAppName,

?????????????? MB_ICONERROR);

????????? return 0;

???? }

???? hwnd = CreateWindow(szAppName, TEXT("Icon Demo"),

????????? WS_OVERLAPPEDWINDOW,

????????? CW_USEDEFAULT, CW_USEDEFAULT,

????????? CW_USEDEFAULT, CW_USEDEFAULT,

????????? NULL, NULL, hInstance, NULL);

???? ShowWindow(hwnd, iCmdShow);

???? UpdateWindow(hwnd);

???? while (GetMessage(&msg, NULL, 0, 0))

???? {

????????? TranslateMessage(&msg);

????????? DispatchMessage(&msg);

???? }

???? return msg.wParam;

}

LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM

lParam)

{

???? static HICON hIcon;

???? static int cxIcon,cyIcon,cxClient,cyClient;

???? HDC hdc;

???? HINSTANCE hInstance;

???? PAINTSTRUCT ps;

???? int x,y;

???? switch (message)

???? {

???? case WM_CREATE:

????????? hInstance = ((LPCREATESTRUCT)lParam)->hInstance;

????????? //hIcon = LoadIcon(hInstance,szAppName);//字符串ID

??????? ? hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));//數字ID

??????? ?

????????? cxIcon = GetSystemMetrics(SM_CXICON);//獲取圖標尺寸

????????? cyIcon = GetSystemMetrics(SM_CYICON);

????????? return 0;

???? case WM_SIZE:

????????? cxClient = LOWORD(lParam);//圖標位置

????????? cyClient = HIWORD(lParam);

????????? return 0;

???? case WM_PAINT:

????????? hdc = BeginPaint(hwnd,&ps);

????????? //繪制圖標

????????? for (y = 0;y < cyClient;y += cyIcon)

????????? {

?????????????? for (x = 0;x < cxClient;x += cxIcon)

?????????????? {

??????????????????? DrawIcon(hdc,x,y,hIcon);//顯示圖標

?????????????? }

????????? }

????????? EndPaint(hwnd,&ps);

????????? return 0;

???? case WM_DESTROY:

????????? PostQuitMessage(0);

????????? return 0;

???? }

???? return DefWindowProc(hwnd,message,wParam,lParam);

}

/******************************************************************************

LoadIcon 函數:從與應用程序實例關聯的可執行(.exe)文件中加載指定的圖標資源。

HICON LoadIconA(

? HINSTANCE hInstance,//模塊實例的句柄,其可執行文件包含要加載的圖標。加載標準圖標時,此參數必須為NULL。

? LPCSTR??? lpIconName//要加載的圖標資源的名稱。或者,此參數可以在低位字中包含資源標識符,在高位字中包含零。

????????????????????? //使用MAKEINTRESOURCE宏來創建此值。

);

返回值

類型:HICON

如果函數成功,則返回值是新加載的圖標的句柄。

*******************************************************************************

MAKEINTRESOURCEA宏:將整數值轉換為與資源管理功能兼容的資源類型。使用此宏代替包含資源名稱的字符串。

void MAKEINTRESOURCEA(

?? i //要轉換的整數值。

);

*******************************************************************************

DrawIcon函數:將圖標或光標繪制到指定的設備上下文中。若要指定其他繪圖選項,請使用DrawIconEx函數。

BOOL DrawIcon(

? HDC?? hDC,?? //設備上下文的句柄,將在其中繪制圖標或光標。

? int?? X,???? //圖標左上角的邏輯x坐標。

? int?? Y,???? //圖標左上角的邏輯y坐標。

? HICON hIcon? //要繪制的圖標的句柄。

);

*/

●Resource文件:

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ 生成的包含文件。

// 供 056_ICONDEMO.rc 使用

//

#define IDI_ICON1?????????????????????? 101

// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE??????? 102

#define _APS_NEXT_COMMAND_VALUE???????? 40001

#define _APS_NEXT_CONTROL_VALUE???????? 1001

#define _APS_NEXT_SYMED_VALUE?????????? 101

#endif

#endif

●056_ICONDEMO.rc:

// Microsoft Visual C++ generated resource script.

//

#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS

/

//

// Generated from the TEXTINCLUDE 2 resource.

//

#include "winres.h"

/

#undef APSTUDIO_READONLY_SYMBOLS

/

// 中文(簡體,中國) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED

/

//

// TEXTINCLUDE

//

1 TEXTINCLUDE

BEGIN

??? "resource.h\0"

END

2 TEXTINCLUDE

BEGIN

??? "#include ""winres.h""\r\n"

??? "\0"

END

3 TEXTINCLUDE

BEGIN

??? "\r\n"

??? "\0"

END

#endif??? // APSTUDIO_INVOKED

/

//

// Icon

//

// Icon with lowest ID value placed first to ensure application icon

// remains consistent on all systems.

IDI_ICON1?????????????? ICON??????????????????? "icon1.ico"

#endif??? // 中文(簡體,中國) resources

/

#ifndef APSTUDIO_INVOKED

/

//

// Generated from the TEXTINCLUDE 3 resource.

//

/

#endif??? // not APSTUDIO_INVOKED

?????? 運行結果:

圖9-5 圖標資源

?

總結

實例ICONDEMO.C添加了一個圖標資源,并且在窗口客戶區內填充圖標位圖。圖標位圖文件icon1.ico位于當前編譯目錄。

添加圖標資源的方法在上一小節中已經講述,在解決方案的“資源文件”目錄下點擊鼠標右鍵,選擇添加>資源>ICON,導入icon1.ico位圖文件。然后VS自動創建re’source資源頭文件和056_ICONDEMO.rc資源腳本文件。re’source資源頭文件中包含圖標資源的數字ID 101,056_ICONDEMO.rc資源腳本文件的資源類型為ICON,將圖標資源ID綁定圖標位圖文件:

IDI_ICON1?????????????? ICON??????????????????? "icon1.ico"

實例的WinMain主程序中,定義了一個擴展窗口類WNDCLASSEX,對比WNDCLASS結構新增了“cbSize”結構大小字段和“hIconSm”小圖標字段。在hIcon字段添加圖標:

wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));//數字ID

【注意】由于添加圖標資源時使用的是數字ID,所以這里需要使用MAKEINTRESOURCE宏將IDI_ICON1轉換為字符串ID。

請讀者測試:如果我們將資源中的圖標位圖ID修改為字符串ID"IconDemo",則不需要轉換:

wndclass.hIcon = LoadIcon(hInstance, szAppName);

窗口過程:

處理WM_CREATE消息:調用LoadIcon函數加載圖標資源,獲取圖標資源句柄。然后調用GetSystemMetrics函數獲取圖標資源尺寸。

處理WM_SIZE消息:獲取窗口客戶區寬和高。

處理WM_PAINT消息:調用DrawIcon函數在窗口客戶區內填充圖標。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42211.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

知識付費系統3.0整站源碼知識付費網課平臺網創資源付費帶自動采集同步插件

程序說明&#xff1a; 1.修復更新到最新版本 2.自動采集插件重寫 3.關閉采集授權域名直接對接 4.更新插件主動請求同步資源 5.帶自動采集插件 原始功能 支持分類替換 將主站同步過來的文章分類進行替換 支持自定義文章作者&#xff08;選擇多個作者則同步到的文章作者將會隨機分…

java中==和equals()的區別探究

目錄 一、Object對象 二、 三、String類的equals()方法 四、示例 4.1直接定義兩個相同的值比較 4.2直接定義兩個值不同的字符串進行比較 4.3直接定義一個字符串和new一個字符串進行比較&#xff08;兩者值相同&#xff09; 4.4直接定義一個字符串和new一個字符串進行…

Halcon Ean13 一維碼讀取

一 EAN碼介紹 1 EAN碼定義: EAN碼是國際物品編碼協會制定的一種商品用條碼&#xff0c;通用于全世界。EAN碼符號有標準版&#xff08;EAN-13&#xff09;和縮短版&#xff08;EAN-8&#xff09;兩種。標準版表示13位數字&#xff0c;又稱為EAN13碼&#xff0c;縮短版表示8位數…

VScode免密鏈接ubuntu

Ubuntu 下載&#xff1a; sudo apt-get install openssh-serverps -e | grep sshd參考IP &#xff1a; ifconfig VScode配置 重新嘗試連接&#xff0c;輸入的密碼是虛擬機用戶密碼 免密鏈接 Windows生成公鑰 1、打開CMD 2、輸入命令ssh-keygen 3、連續回車確認即可生成 …

正態、威布爾、指數分布、伽馬分布、對數正態分布介紹

目錄 正態、威布爾、指數分布、3.1 概念介紹概率密度函數&#xff08;PDF&#xff09;累積分布函數&#xff08;CDF&#xff09;性質應用 3.2 參數及繪圖參數概率密度函數&#xff08;PDF&#xff09;累積分布函數&#xff08;CDF&#xff09;繪圖圖像解讀 3.3 指數分布擬合代碼…

Emacs有什么優點,用Emacs寫程序比IDE更方便嗎?

Emacs 是一款歷史悠久且功能強大的文本編輯器&#xff0c;它以其高度的可定制性和豐富的功能而聞名。在討論 Emacs 的優點以及它是否比 IDE 更方便時&#xff0c;我們需要從多個角度進行深入分析。以下是對 Emacs 優點的詳細闡述&#xff0c;以及它與 IDE 的比較。 Emacs 的優…

第11章 規劃過程組(二)(11.10制訂進度計劃)

第11章 規劃過程組&#xff08;二&#xff09;11.10制訂進度計劃&#xff0c;在第三版教材第395~397頁&#xff1b;文字圖片音頻方式 第一個知識點&#xff1a;定義及作用 分析活動順序、持續時間、資源需求和進度制約因素&#xff0c;創建項目進度模型&#xff0c;從而落實項目…

Docker定時清理

一、循環調度執行 1、檢查cron狀態 systemctl status crond 2、創建要執行的shell腳本 vim /home/cleanup_docker.sh #! /bin/bash # 清理臨時文件 echo $(date "%H:%M:%S") "執行docker清理命令..." docker system prune -af-a 清理包括未使用的鏡像 …

Android EditText+ListPopupWindow實現可編輯的下拉列表

Android EditTextListPopupWindow實現可編輯的下拉列表 &#x1f4d6;1. 可編輯的下拉列表?步驟一&#xff1a;準備視圖?步驟二&#xff1a;封裝顯示方法?步驟三&#xff1a;獲取視圖并監聽 &#x1f4d6;2. 擴展上下箭頭?步驟一&#xff1a;準備上下箭頭icon圖標?步驟二&…

Redisson分布式鎖、可重入鎖

介紹Redisson 什么是 Redisson&#xff1f;來自于官網上的描述內容如下&#xff01; Redisson 是一個在 Redis 的基礎上實現的 Java 駐內存數據網格客戶端&#xff08;In-Memory Data Grid&#xff09;。它不僅提供了一系列的 redis 常用數據結構命令服務&#xff0c;還提供了…

力扣56.合并區間

力扣56.合并區間 按左端點排序 判斷左端點是否小于等于當前右端點**&#xff08;可以合并&#xff09;** class Solution {public:vector<vector<int>> merge(vector<vector<int>>& intervals) {ranges::sort(intervals);vector<vector<i…

北森銳途人才競聘盤點管理測評:高管領導力六大評判標準深度解析萬達商管中國綠發等

北森銳途人才管理測評&#xff1a;高管領導力評判標準深度解析 在企業高管的盤點與競聘測評領域&#xff0c;眾多管理人才面臨評估自身領導力的挑戰。面對能力卓越、職級顯赫的同僚&#xff0c;許多管理者感到缺乏一套權威且專業的評價體系。然而&#xff0c;無論是天賦異稟的領…

vue+cesium之加載天地圖影像底圖與注記

目錄 1.創建地圖容器2.疊加天地圖影像底圖與矢量注記 關鍵代碼3.示例效果圖 Cesium是默認加載了微軟公司的Bing地圖&#xff0c;并提供了BingMapslmageryProvider類來加載Bing地圖。也就是說&#xff0c;在創建Viewer時&#xff0c;如果不指定lmageryProvider類就默認加載Bing地…

一體化預制泵站如何選擇廠家及設備選型

諸城市鑫淼環保小編帶大家了解一下一體化預制泵站如何選擇廠家及設備選型 一體化預制泵站是由玻璃鋼筒體、格柵系統、水泵、內部管道、閥門、液位控制儀、進出水管道、檢修平臺、照明系統、不銹鋼爬梯等組成。該設備的型號是多種多樣的&#xff0c;設備的型號不同&#xff0c;其…

2024年7月2日~2024年7月8日周報

目錄 一、前言 二、完成情況 2.1 吳恩達機器學習系列課程 2.1.1 分類問題 2.1.2 假說表示 2.1.3 判定邊界 2.2 學習數學表達式 2.3 論文寫作情況 2.3.1 題目選取 2.3.2 摘要 2.3.3 關鍵詞 2.3.4 引言部分 2.3.4 文獻綜述部分 三、下周計劃 3.1 存在的問題 3.2 …

C語言之數據在內存中的存儲(1),整形與大小端字節序

目錄 前言 一、整形數據在內存中的存儲 二、大小端字節序 三、大小端字節序的判斷 四、字符型數據在內存中的存儲 總結 前言 本文主要講述整型包括字符型是如何在內存中存儲的&#xff0c;涉及到大小端字節序這一概念&#xff0c;還有如何判斷大小端&#xff0c;希望對大…

2、需求工具 - 編程實戰工具系列文章

需求分析工具 筆者對于需求分析工具的應用&#xff0c;主要是思維導圖軟件和Word。思維導圖用來理清需要的需求功能&#xff0c;而Word用來記錄每個需求功能的實際內容。 對于思維導圖軟件&#xff0c;筆者用過幾個&#xff0c;但是有些需要注冊碼&#xff0c;有些需要費用&…

谷粒商城學習-09-配置Docker阿里云鏡像加速及各種docker問題記錄

文章目錄 一&#xff0c;配置Docker阿里云鏡像加速二&#xff0c;Docker安裝過程中的幾個問題1&#xff0c;安裝報錯&#xff1a;Could not resolve host: mirrorlist.centos.org; Unknown error1.1 檢測虛擬機網絡1.2 重設yum源 2&#xff0c;報錯&#xff1a;Could not fetch…

Redis基礎教程(十五):Redis GEO地理信息查詢與管理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;歡迎各位來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里不僅可以有所收獲&#xff0c;同時也能感受到一份輕松歡樂的氛圍&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

絕區伍--2024年AI發展路線圖

2024 年將是人工智能具有里程碑意義的一年。隨著新模式、融資輪次和進步以驚人的速度出現&#xff0c;很難跟上人工智能世界發生的一切。讓我們深入了解 2024 年可能定義人工智能的關鍵事件、產品發布、研究突破和趨勢。 2024 年第一季度 2024 年第一季度將推出一些主要車型并…