如何确定 shell 的 drag/drop 图标大小以用于 SHDoDragDrop?

How to figure out the shell's drag/drop icon size for use with SHDoDragDrop?

如何确定要使用的正确图标大小,以便图标与资源管理器的默认拖放图标相匹配?

(如果重要的话,我正在尝试将它与 SHDoDragDrop 一起使用。)

大小取决于数据对象格式中的内容。从 Shell 开始,它是 96x96。

您可以检查是否将文件拖放到任何有效的放置目标中,数据对象将包含“DragImageBits”格式并且其数据是 SHDRAGIMAGE structure:

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

如果您正在寻找一种更静态的方式,这里有一段代码似乎可以使用 UxThemes API。请注意,虽然它使用记录的 APIs 并定义,但我认为它没有这样记录。

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

关于 DPI 设置,我知道你想模仿资源管理器,在这种情况下,你必须根据你的需要和屏幕上下文自己做一些计算,因为 Shell本身是固定的。