Ikonok használata
Az alábbi témakörök az ikonokkal kapcsolatos bizonyos feladatok elvégzését ismertetik:
- Ikon létrehozása
- Ikonméret lekérése
- Ikon megjelenítése
- Az ikon-erőforrások megosztása
Ikon létrehozása
Ikon használatához az alkalmazásnak meg kell szereznie az ikon kezelését. Az alábbi példa bemutatja, hogyan hozhat létre két különböző ikonfogópontot: egyet a standard kérdésikonhoz, egyet pedig egy egyéni ikonhoz, amely erőforrásként szerepel az alkalmazás erőforrásdefiníciós fájljában.
HICON hIcon1; // icon handle
HICON hIcon2; // icon handle
// Create a standard question icon.
hIcon1 = LoadIcon(NULL, IDI_QUESTION);
// Create a custom icon based on a resource.
hIcon2 = LoadIcon(hinst, MAKEINTRESOURCE(460));
// Create a custom icon at run time.
Az alkalmazásoknak erőforrásokként egyéni ikonokat kell implementálniuk, és a LoadIcon vagy LoadImage függvényt kell használniuk ahelyett, hogy futásidőben létrehozzák az ikonokat. Ez a megközelítés elkerüli az eszközfüggőséget, leegyszerűsíti a honosítást, és lehetővé teszi az alkalmazások számára az ikonbitképek megosztását. Az alábbi példa azonban CreateIcon használatával hoz létre egyéni monokróm ikont futásidőben, bitkép bitmaszkok alapján; ez azt mutatja be, hogy a rendszer hogyan értelmezi az ikon bitkép bitmaszkokat.
HICON hIcon3; // icon handle
// Yang icon AND bitmask
BYTE ANDmaskIcon[] = {0xFF, 0xFF, 0xFF, 0xFF, // line 1
0xFF, 0xFF, 0xC3, 0xFF, // line 2
0xFF, 0xFF, 0x00, 0xFF, // line 3
0xFF, 0xFE, 0x00, 0x7F, // line 4
0xFF, 0xFC, 0x00, 0x1F, // line 5
0xFF, 0xF8, 0x00, 0x0F, // line 6
0xFF, 0xF8, 0x00, 0x0F, // line 7
0xFF, 0xF0, 0x00, 0x07, // line 8
0xFF, 0xF0, 0x00, 0x03, // line 9
0xFF, 0xE0, 0x00, 0x03, // line 10
0xFF, 0xE0, 0x00, 0x01, // line 11
0xFF, 0xE0, 0x00, 0x01, // line 12
0xFF, 0xF0, 0x00, 0x01, // line 13
0xFF, 0xF0, 0x00, 0x00, // line 14
0xFF, 0xF8, 0x00, 0x00, // line 15
0xFF, 0xFC, 0x00, 0x00, // line 16
0xFF, 0xFF, 0x00, 0x00, // line 17
0xFF, 0xFF, 0x80, 0x00, // line 18
0xFF, 0xFF, 0xE0, 0x00, // line 19
0xFF, 0xFF, 0xE0, 0x01, // line 20
0xFF, 0xFF, 0xF0, 0x01, // line 21
0xFF, 0xFF, 0xF0, 0x01, // line 22
0xFF, 0xFF, 0xF0, 0x03, // line 23
0xFF, 0xFF, 0xE0, 0x03, // line 24
0xFF, 0xFF, 0xE0, 0x07, // line 25
0xFF, 0xFF, 0xC0, 0x0F, // line 26
0xFF, 0xFF, 0xC0, 0x0F, // line 27
0xFF, 0xFF, 0x80, 0x1F, // line 28
0xFF, 0xFF, 0x00, 0x7F, // line 29
0xFF, 0xFC, 0x00, 0xFF, // line 30
0xFF, 0xF8, 0x03, 0xFF, // line 31
0xFF, 0xFC, 0x3F, 0xFF}; // line 32
// Yang icon XOR bitmask
BYTE XORmaskIcon[] = {0x00, 0x00, 0x00, 0x00, // line 1
0x00, 0x00, 0x00, 0x00, // line 2
0x00, 0x00, 0x00, 0x00, // line 3
0x00, 0x00, 0x00, 0x00, // line 4
0x00, 0x00, 0x00, 0x00, // line 5
0x00, 0x00, 0x00, 0x00, // line 6
0x00, 0x00, 0x00, 0x00, // line 7
0x00, 0x00, 0x38, 0x00, // line 8
0x00, 0x00, 0x7C, 0x00, // line 9
0x00, 0x00, 0x7C, 0x00, // line 10
0x00, 0x00, 0x7C, 0x00, // line 11
0x00, 0x00, 0x38, 0x00, // line 12
0x00, 0x00, 0x00, 0x00, // line 13
0x00, 0x00, 0x00, 0x00, // line 14
0x00, 0x00, 0x00, 0x00, // line 15
0x00, 0x00, 0x00, 0x00, // line 16
0x00, 0x00, 0x00, 0x00, // line 17
0x00, 0x00, 0x00, 0x00, // line 18
0x00, 0x00, 0x00, 0x00, // line 19
0x00, 0x00, 0x00, 0x00, // line 20
0x00, 0x00, 0x00, 0x00, // line 21
0x00, 0x00, 0x00, 0x00, // line 22
0x00, 0x00, 0x00, 0x00, // line 23
0x00, 0x00, 0x00, 0x00, // line 24
0x00, 0x00, 0x00, 0x00, // line 25
0x00, 0x00, 0x00, 0x00, // line 26
0x00, 0x00, 0x00, 0x00, // line 27
0x00, 0x00, 0x00, 0x00, // line 28
0x00, 0x00, 0x00, 0x00, // line 29
0x00, 0x00, 0x00, 0x00, // line 30
0x00, 0x00, 0x00, 0x00, // line 31
0x00, 0x00, 0x00, 0x00}; // line 32
hIcon3 = CreateIcon(hinst, // application instance
32, // icon width
32, // icon height
1, // number of XOR planes
1, // number of bits per pixel
ANDmaskIcon, // AND bitmask
XORmaskIcon); // XOR bitmask
Az ikon létrehozásához CreateIcon az alábbi igazságtáblát alkalmazza az AND és az XOR bitmaszkokra.
ÉS bitmaszk | XOR bitmaszk | Kijelző |
---|---|---|
0 | 0 | Fekete |
0 | 1 | Fehér |
1 | 0 | Képernyő |
1 | 1 | Fordított képernyő |
Színes ikon futásidőben való létrehozásához a CreateIconIndirect függvényt kell használnia, amely egy ICONINFO struktúra tartalma alapján hoz létre ikont.
A zárás előtt az alkalmazásnak DestroyIcon kell használnia a létrehozott ikonok elpusztításához CreateIcon vagy CreateIconIndirecthasználatával. Nem szükséges megsemmisíteni a más függvények által létrehozott ikonokat.
Az ikon méretének lekérése
Az alábbi példakód bemutatja, hogyan szerezheti be az ikonméretet a HICON leíróból:
// Also works for cursors
BOOL GetIconDimensions(__in HICON hico, __out SIZE *psiz)
{
ICONINFO ii;
BOOL fResult = GetIconInfo(hico, &ii);
if (fResult) {
BITMAP bm;
fResult = GetObject(ii.hbmMask, sizeof(bm), &bm) == sizeof(bm);
if (fResult) {
psiz->cx = bm.bmWidth;
psiz->cy = ii.hbmColor ? bm.bmHeight : bm.bmHeight / 2;
}
if (ii.hbmMask) DeleteObject(ii.hbmMask);
if (ii.hbmColor) DeleteObject(ii.hbmColor);
}
return fResult;
}
Ikon megjelenítése
Az alkalmazás betöltheti és létrehozhat ikonokat, hogy megjelenjenek az alkalmazás ügyfélterületén vagy gyermekablakaiban. Az alábbi példa bemutatja, hogyan rajzolhat ikont az ablak ügyfélterületén, amelynek eszközkörnyezetét (DC) a hdc paraméter azonosítja.
HICON hIcon1; // icon handle
HDC hdc; // handle to display context
DrawIcon(hdc, 10, 20, hIcon1);
A rendszer automatikusan megjeleníti az osztályikon(ok)t egy ablakhoz. Az alkalmazás hozzárendelhet osztályikonokat egy ablakosztály regisztrálása közben. Az alkalmazás lecserélhet egy osztályikont a SetClassLong függvénnyel. Ez a függvény módosítja egy adott osztály összes ablakának alapértelmezett ablakbeállításait. Az alábbi példa egy osztályikont lecserél arra az ikonra, amelynek erőforrás-azonosítója 480.
HINSTANCE hinst; // handle to current instance
HWND hwnd; // main window handle
// Change the icon for hwnd's window class.
SetClassLongPtr(hwnd, // window handle
GCLP_HICON, // changes icon
(LONG_PTR) LoadIcon(hinst, MAKEINTRESOURCE(480))
);
További információ az ablakosztályokról: Ablakosztályok.
Ikonerőforrások megosztása
Az alábbi kód a CreateIconFromResourceEx, DrawIconés LookupIconIdFromDirectoryExfüggvényeket és számos erőforrásfüggvényt használ egy ikonleíró létrehozásához egy másik végrehajtható fájl ikonadatai alapján. Ezután megjelenik az ikon egy ablakban.
biztonsági figyelmeztetés:LoadLibrary helytelen használata a helytelen DLL betöltésével veszélyeztetheti az alkalmazás biztonságát. A DLL-ek különböző Windows-verziókkal való helyes betöltéséről a LoadLibrary dokumentációjában olvashat.
HICON hIcon1; // icon handle
HINSTANCE hExe; // handle to loaded .EXE file
HRSRC hResource; // handle to FindResource
HRSRC hMem; // handle to LoadResource
BYTE *lpResource; // pointer to resource data
int nID; // ID of resource that best fits current screen
HDC hdc; // handle to display context
// Load the file from which to copy the icon.
// Note: LoadLibrary should have a fully explicit path.
//
hExe = LoadLibrary("myapp.exe");
if (hExe == NULL)
{
//Error loading module -- fail as securely as possible
return;
}
// Find the icon directory whose identifier is 440.
hResource = FindResource(hExe,
MAKEINTRESOURCE(440),
RT_GROUP_ICON);
// Load and lock the icon directory.
hMem = LoadResource(hExe, hResource);
lpResource = LockResource(hMem);
// Get the identifier of the icon that is most appropriate
// for the video display.
nID = LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE,
CXICON, CYICON, LR_DEFAULTCOLOR);
// Find the bits for the nID icon.
hResource = FindResource(hExe,
MAKEINTRESOURCE(nID),
MAKEINTRESOURCE(RT_ICON));
// Load and lock the icon.
hMem = LoadResource(hExe, hResource);
lpResource = LockResource(hMem);
// Create a handle to the icon.
hIcon1 = CreateIconFromResourceEx((PBYTE) lpResource,
SizeofResource(hExe, hResource), TRUE, 0x00030000,
CXICON, CYICON, LR_DEFAULTCOLOR);
// Draw the icon in the client area.
DrawIcon(hdc, 10, 20, hIcon1);