Bagaimana cara mengetahui ukuran ikon yang tepat untuk digunakan sehingga ikon cocok dengan ikon seret dan lepas bawaan Explorer?

(Saya mencoba menggunakannya dengan SHDoDragDrop jika itu penting.)

enter image description here

1
user541686 11 Mei 2021, 14:09

1 menjawab

Jawaban Terbaik

Ukurannya tergantung pada apa yang ada dalam format objek data. Dari Shell, ukurannya 96x96.

Anda dapat memeriksanya jika Anda menyeret & menjatuhkan file ke target penurunan yang valid, objek data akan berisi format "DragImageBits" dan datanya adalah struktur SHDRAGIMAGE:

typedef struct SHDRAGIMAGE {
  SIZE     sizeDragImage; // will contain 96x96 when dragged from the Shell
  POINT    ptOffset;
  HBITMAP  hbmpDragImage;
  COLORREF crColorKey;
} SHDRAGIMAGE, *LPSHDRAGIMAGE;

Jika Anda mencari cara yang lebih statis, berikut adalah kode yang tampaknya berfungsi, menggunakan UxThemes API. Perhatikan bahwa meskipun menggunakan API dan definisi yang terdokumentasi, saya tidak berpikir itu didokumentasikan seperti itu.

...
#include <uxtheme.h>
#include <vsstyle.h>
#include <vssym32.h>
...

// note: error checking ommited
auto theme = OpenThemeData(NULL, VSCLASS_DRAGDROP);

SIZE size = {};
GetThemePartSize(theme, NULL, DD_IMAGEBG, 0, NULL, THEMESIZE::TS_DRAW, &size);

MARGINS margins = {};
GetThemeMargins(theme, NULL, DD_IMAGEBG, 0, TMT_CONTENTMARGINS, NULL, &margins);

// final size
size.cx -= margins.cxLeftWidth + margins.cxRightWidth;
size.cy -= margins.cyTopHeight + margins.cyBottomHeight;

CloseThemeData(theme);

Adapun pengaturan DPI, saya mengerti Anda ingin meniru Explorer, dalam hal ini Anda harus melakukan perhitungan sendiri tergantung pada kebutuhan dan konteks layar Anda, karena ukuran gambar yang diekstraksi oleh Shell itu sendiri sudah diperbaiki.

1
Simon Mourier 12 Mei 2021, 08:02