Simgeleri Kullanma
Aşağıdaki konular simgelerle ilgili belirli görevlerin nasıl gerçekleştirildiği açıklanmaktadır:
Simge Oluşturma
Simgeyi kullanmak için, uygulamanızın simgeye erişim sağlaması gerekir. Aşağıdaki örnekte iki farklı simge tutamacını nasıl oluşturacağınız gösterilmektedir: biri standart soru simgesi için, diğeri de uygulamanın kaynak tanımı dosyasına kaynak olarak eklenen özel bir simge için.
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.
Bir uygulama özel simgeleri kaynak olarak uygulamalı ve çalışma zamanında simgeleri oluşturmak yerine LoadImageişlevini LoadIcon veyakullanmalıdır. Bu yaklaşım cihaz bağımlılığını önler, yerelleştirmeyi basitleştirir ve uygulamaların simge bit eşlemlerini paylaşmasına olanak tanır. Ancak aşağıdaki örnek, bit eşlem bitmaskelerini temel alarak çalışma zamanında özel bir monokrom simge oluşturmak için CreateIcon kullanır; bu, sistemin simge bitmaskelerini nasıl yorumladığını göstermek için eklenmiştir.
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
Simgeyi oluşturmak için createIconAND ve XOR bit maskelerine aşağıdaki doğruluk tablosunu uygular.
AND bit maskesi | XOR bitmask | Görüntüle |
---|---|---|
0 | 0 | Siyah |
0 | 1 | Beyaz |
1 | 0 | Ekran |
1 | 1 | Ters ekran |
Çalışma zamanında renkli bir simge oluşturmak için, ICONINFO yapısının içeriğine göre bir simge oluşturan CreateIconIndirect işlevini kullanmanız gerekir.
Kapatmadan önce uygulamanızın CreateIcon veya CreateIconIndirectkullanarak oluşturduğu tüm simgeleri yok etmek için DestroyIcon kullanması gerekir. Diğer işlevler tarafından oluşturulan simgeleri yok etmek gerekli değildir.
Simge boyutunu alma
HICON tutamacından simge boyutunun nasıl alındığını gösteren örnek kod aşağıda verilmiştir:
// 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;
}
Simge Görüntüleme
Uygulamanız, uygulamanın istemci alanında veya alt pencerelerinde görüntülenecek simgeleri yükleyebilir ve oluşturabilir. Aşağıdaki örnekte, pencerenin istemci alanında cihaz bağlamı (DC) hdc parametresiyle tanımlanan bir simgenin nasıl çizildiği gösterilmektedir.
HICON hIcon1; // icon handle
HDC hdc; // handle to display context
DrawIcon(hdc, 10, 20, hIcon1);
Sistem otomatik olarak bir pencere için sınıf simgelerini görüntüler. Uygulamanız bir pencere sınıfı kaydederken sınıf simgeleri atayabilir. Uygulamanız, SetClassLong işlevini kullanarak sınıf simgesini değiştirebilir. Bu işlev, belirli bir sınıfın tüm pencereleri için varsayılan pencere ayarlarını değiştirir. Aşağıdaki örnek, bir sınıf simgesini kaynak tanımlayıcısı 480 olan simgeyle değiştirir.
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))
);
Pencere sınıfları hakkında daha fazla bilgi için bkz. Pencere Sınıfları.
Paylaşım Simgesi Kaynakları
Aşağıdaki kodda CreateIconFromResourceEx, DrawIconve LookupIconIdFromDirectoryExişlevleri ve kaynak işlevlerinin birkaçı, başka bir yürütülebilir dosyadaki simge verilerini temel alan bir simge tutamacı oluşturmak için kullanılır. Ardından simgeyi bir pencerede görüntüler.
Güvenlik Uyarısı:LoadLibrary yanlış şekilde kullanılması, yanlış DLL'yi yükleyerek uygulamanızın güvenliğini tehlikeye atabilir. Windows'un farklı sürümlerine sahip DLL'leri doğru şekilde yükleme hakkında bilgi için LoadLibrary belgelerine bakın.
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);