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:
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>
static BYTE ANDmaskIcon[] = {
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[] = {
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);
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);
}
方式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 消息图标
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 | 销毁图标 |