Aracılığıyla paylaş


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);