的实际大小IDI_ICON1
为 14x14 像素。
此外,CStatic
控件的大小是 21x20,我无法与设计师一起更改它。
如果您在设计器中查看控件的大小,那么您不是在将苹果与苹果进行比较。设计人员报告的是DLU(对话框单元)中控件的大小,而不是像素。
DLU 和像素之间不一定存在一对一的映射。事实上,DLU 的全部意义在于它与像素无关。单个 DLU 表示的实际像素数将根据您运行应用程序的计算机的字体和 DPI 变化。
所以你看到的行为对我来说很有意义。
如果您不相信这个 DLU 与像素的愚蠢,那么请尝试在调试器下运行应用程序并使用 Spy++ 来调查静态控件的实际大小(以像素为单位)。我敢打赌它是 14x14。
不,如果您将其设置为显示图标,则无法在设计器中调整静态控件的大小。控件会自动调整大小以适应它所显示的图标。这也是设计使然。我无法想象你为什么要这样做;你的全部观点似乎是你不希望图标被剪裁。
But like I said in a comment, static controls do not automatically scale their icons. You need to write code to do the icon scaling yourself (probably by calling the DrawIconEx
function). Forcing the static control to resize itself will just crop the icon or add a border around it. Adding the SS_CENTERIMAGE
style, as duDE suggested will alter this behavior so that the icon is aligned to the center of the static control, subtly changing how the cropping happens. But it will still get cropped to fit the static control's size.
不过要小心。我在评论中关于实际图标的问题的全部要点IDI_ICON1
是该LoadIcon
功能有一些重要的限制。也就是说,它仅设计用于加载具有SM_CXICON
和SM_CYICON
大小的图标(在大多数系统上,这将是 32x32)。当您在图标资源中仅定义一个图标时,它确实可以按预期工作,但否则它将崩溃。这可能是拉伸的解释。相反,建议您使用该LoadImage
功能。代码比较冗长,但它是一个更强大的功能:
HICON hIcon = static_cast<HICON>(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON1),
IMAGE_ICON,
14, /* width (x dimension) */
14, /* height (y dimension) */
LR_DEFAULTCOLOR));
// (make sure to call DestroyIcon() on hIcon when you're done with it!)