minigui[基础篇][11]—— 图标

1.图标

1.图标是一张小的图片,通常用来代表一个应用程序,或者用于警告消息框等窗口中
2.它是由一个位图和一个位屏蔽位图组合而成,可以在图片中产生透明图像区域
3.一个图标文件中可以包含一个以上的图标映像,应用程序可以根据各个图标映像的大小和颜色位数来选择其中之一来使用
4.MiniGUI 中提供了对单色和 16 色和 256 色 Windows 图标的载入、显示、创建和销毁的支持

2.加载图标的几种方式

在这里插入图片描述

方式1:用户自定义图标的加载

//装载图标  ----> 从文件
HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which);
@hdc: 设备上下文句柄
@filename: 图标文件名  一个 Windows 图标文件(*.ico)中载入图标,图标可以是单色、16 色或 256 色的 
@which: 所选择图标的索引值  某些 Windows图标文件包含两个不同大小的图标 0 是第一个,1 是第二个
@return: 图标句柄
说明:LoadIconFromFile 函数从图标文件中读入图标的大小、颜色位数和位图映像数据等信息,并调用 CreateIcon
函数创建一个图标对象

//装载图标  -----> 从内存
HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which);
@hdc: 设备上下文句柄
@area: area 所指的内存区域应该和 Windows ICO 文件具有相同的布局
@which: 所选择图标的索引值
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
static int DrawiconWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    static HICON myicon_small, myicon_large;
    HDC hdc;
    switch (message) {
        case MSG_CREATE:
            /* 调用 LoadIconFromFile 函数从 myicon.ico 文件中装载大小两个图标 */
            myicon_small = LoadIconFromFile(HDC_SCREEN, "myicon.ico", 0);
            if (myicon_small == 0)
                fprintf (stderr, "Load icon file failure!");
            
            myicon_large = LoadIconFromFile(HDC_SCREEN, "myicon.ico", 1);
            if (myicon_large == 0)
                fprintf (stderr, "Load icon file failure!");
            break;
        case MSG_PAINT:
            /* 在窗口不同位置显示两个图标 */
            hdc = BeginPaint(hWnd);
            if (myicon_small != 0)
                DrawIcon(hdc, 10, 10, 0, 0, myicon_small);
            if (myicon_large != 0)
                DrawIcon(hdc, 60, 60, 0, 0, myicon_large);
            EndPaint(hWnd, hdc);
            return 0;
        case MSG_CLOSE:
            /* 销毁图标及主窗口本身 */
            DestroyIcon(myicon_small);
            DestroyIcon(myicon_large);
            DestroyMainWindow (hWnd);
            PostQuitMessage (hWnd);
            return 0;
    }
    return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
/* 以下创建窗口的代码从略 */

在这里插入图片描述

方式2:用户在程序中创建的图标

//创建图标
MG_EXPORT HICON GUIAPI CreateIconEx (HDC hdc, int w, int h,const BYTE* AndBits, const BYTE* XorBits, int colornum,const RGB* pal);
@hdc:设备上下文句柄
@w,h: 图像的宽和高  如 16x16 像素或 32x32 像素
@AndBits: 位屏蔽图标位图映像指针 AND 位屏蔽位图是一个单色位图
@XorBits: 位屏蔽图标位图映像指针 指向一个包含图标的 XOR 位屏蔽位图映像数据的字节数组,XOR 位屏蔽位
          图可以是单色位图,也可以是彩色位图 MiniGUI 目前支持单色、16 色和 256 色的三种图标
@colornum: 位屏蔽图标位图映像的颜色位数,说 XOR 位屏蔽位图(彩色位图)的颜色位数。对于单色图标,它应该为 			1,对于16色图标,它应该为4,对于 256 色图标,它应该是 8
@pal: 图标调色板
@return: HICON图标对象

#define CreateIcon(hdc, w, h, AndBits, XorBits, colornum) \
CreateIconEx(hdc, w, h, AndBits, XorBits, colornum, NULL)
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
/* 定义图标的 AND 掩码数据和 XOR 掩码数据 */

static BYTE ANDmaskIcon[] = { //这里不理解 4 * 16 * 8 = 2 * 16 * 16 2位表示一个颜色 
    0xff, 0x9f, 0x00, 0x00,
    0xff, 0x1f, 0x00, 0x00,
    0xfc, 0x1f, 0x00, 0x00,
    0xf0, 0x1f, 0x00, 0x00,
    0xe0, 0x0f, 0x00, 0x00,
    0xc0, 0x07, 0x00, 0x00,
    0x80, 0x03, 0x00, 0x00,
    0x80, 0x03, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00,
    0x80, 0x03, 0x00, 0x00,
    0x80, 0x03, 0x00, 0x00,
    0xc0, 0x07, 0x00, 0x00,
    0xf0, 0x1f, 0x00, 0x00
};

static BYTE XORmaskIcon[] = { //这里不理解  32 * 8 = 16 * 16 * 1字节 //8位1个字节表示一个颜色吗
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x8f, 0xff, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x8f, 0xff, 0xff, 0x00, 0x00, 0x00,
    0x00, 0x08, 0xff, 0xf8, 0xff, 0xf8, 0x00, 0x00,
    0x00, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xf0, 0x00,
    0x00, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf0, 0x00,
    0x0f, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x00,
    0x0f, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0x00,
    0x0f, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0x00,
    0x0f, 0xff, 0xf0, 0x0f, 0x00, 0xff, 0xff, 0x00,
    0x00, 0xff, 0xf8, 0x00, 0x08, 0xff, 0xf0, 0x00,
    0x00, 0x8f, 0xff, 0x80, 0x8f, 0xff, 0xf0, 0x00,
    0x00, 0x00, 0x8f, 0xff, 0xff, 0xf0, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0xff, 0x9f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00,
    0xfc, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00,
    0xe0, 0x0f, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00,
    0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
    0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
    0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
    0xc0, 0x07, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00,
    0x26, 0x00, 0x00, 0x00, 0xf4, 0xd9, 0x04, 0x08,
    0xa8, 0xf8, 0xff, 0xbf, 0xc0, 0xf7, 0xff, 0xbf,
    0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
    0xc0, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00,
    0x28, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
    0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
    0xf0, 0x10, 0x04, 0x00, 0x70, 0xe1, 0x04, 0x08,
    0xd8, 0xf8, 0xff, 0xbf, 0x41, 0x90, 0x04, 0x08
};

static int CreateiconWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    static HICON new_icon;
    HDC hdc;
    switch (message) {
        case MSG_CREATE:
            /* 用自定义数据创建图标 */
            new_icon = CreateIcon(HDC_SCREEN, 16, 16, ANDmaskIcon, XORmaskIcon, 4); //16色
            break;
        case MSG_PAINT:
            hdc = BeginPaint(hWnd);
            if (new_icon != 0) {
                /* 用实际大小显示图标 */
                DrawIcon(hdc, 0, 0, 0, 0, new_icon);
                /* 放大显示图标 */
                DrawIcon(hdc, 50, 50, 64, 64, new_icon);
            }
            EndPaint(hWnd, hdc);
            return 0;
        case MSG_CLOSE:
            /* 销毁图标和主窗口 */
            DestroyIcon(new_icon);
            DestroyMainWindow (hWnd);
            PostQuitMessage (hWnd);
            return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
/* 以下创建主窗口的代码从略 */

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRA9cIV9-1665240270826)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221008221316951.png)]

方式3:从系统加载图标

//加载系统图标 从内存
HICON GUIAPI GetLargeSystemIcon (int id);
HICON GUIAPI GetSmallSystemIcon (int id);
@id: 系统图标id号
IDI_APPLICATION 应用程序图标
IDI_STOP / IDI_HAND 停止图标
IDI_QUESTION 问号图标
IDI_EXCLAMATION 惊叹号图标
IDI_INFORMATION / IDI_ASTERISK 消息图标

//从配置文件加载系统图标 Minigui.cfg
HICON GUIAPI LoadSystemIcon (const char* szItemName, int which);
@szItemName:icon0  加载到的就是form.ico文件
@which:所选择图标的索引值  某些 Windows图标文件包含两个不同大小的图标 0 是第一个,1 是第二个
#if 0
[classic]
# Note that max number defined in source code is 5.
iconnumber=5
icon0=form.ico
icon1=failed.ico
icon2=help.ico
icon3=warning.ico
icon4=excalmatory.ico
#endif
系统所使用图标的最大数目为 5 ,这是在MiniGUI的源代码中定义的。所以,如果你要修改配置文件中的iconnumber
项的话,它的值只能小于或等于 5 ,大于5以后的图标将被忽略掉

3.将图标从内存显示到显示器上

//显示图标
void GUIAPI DrawIcon (HDC hdc, int x, int y, int w, int h, HICON hicon);
@hdc: 设备上下文句柄
@x,y: 图标所在矩形的左上角坐标
@w,h: 矩形的宽和高
@hicon: 图标对象的句柄

4.销毁图标

方式1:用户自定义图标加载和方式2:用户在程序中创建的图标需要销毁
//销毁图标
BOOL GUIAPI DestroyIcon(HICON hicon);
@hicon:图标对象的句柄 
    
方式3:由系统加载的图标不需要销毁
由 GetLargeSystemIcon 和 GetSmallSystemIcon 函数获取的图标为系统预定义的图标,属于系统共享资源,不需要由应用程序来销毁
LoadSystemIcon 实际上是通过调用 LoadIconFromFile 来载入图标的。显然,由它所创建的图标在不再需要的时候也必须使用 DestroyIcon 函数来销毁    

5.图标相关API

函数说明
LoadIconFromFile从文件加载图标
LoadIconFromMem从内存加载图标
CreateIconEx用户程序创建图标
CreateIcon用户程序创建图标
GetLargeSystemIcon从系统加载大图标
GetSmallSystemIcon从系统加载小图标
LoadSystemIcon从配置文件加载
DrawIcon画图标 显示到屏幕上
DestroyIcon销毁图标
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值