gpt4 book ai didi

c++ - MFC 如何将 CStatic 调整为小尺寸

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:01 25 4
gpt4 key购买 nike

我对 CStatic 控件有以下问题:

当我调用函数 SetIcon 时:

    m_CStatic.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));

它加载了一个大小为 14x14 像素的图标,但控件的实际大小变为 21x20,我无法修改它。

我试着调用:

    m_CStatic.SetWindowPos(NULL,0 , 0, 14, 14, SWP_NOMOVE);

但它只缩小了一个尺寸,而没有调整图标的大小。结果我有一部分缩放图像。

有什么方法可以设置要加载的图标的大小吗?

编辑

IDI_ICON1 的实际大小为 14x14 像素。

此外,CStatic 控件的大小为 21x20,我无法通过设计器更改它。

当我加载一个图标时,它被拉伸(stretch)了。我不知道为什么。

最佳答案

An actual size of the IDI_ICON1 is 14x14 pixels.

Also the size of the CStatic control is 21x20 and I can not change it with the designer.

如果您正在查看设计器中控件的大小,那么您并不是在这里进行同类比较。设计者报告的控件大小以 DLUs(对话框单位)为单位,不是像素

DLU 和像素之间不一定存在一对一的映射。事实上,DLU 的全部意义在于它与像素无关。单个 DLU 表示的实际像素数将根据您运行应用程序的计算机的字体和 DPI 而变化。

所以你看到的行为对我来说非常有意义。

如果您不相信这种 DLU 与像素的愚蠢行为,请尝试在调试器下运行应用程序并使用 Spy++ 调查静态控件的实际大小(以像素为单位)。我敢打赌它是 14x14。

不,如果将静态控件设置为显示图标,则不能在设计器中调整静态控件的大小。控件会自动调整大小以适应它所显示的图标。这也是设计使然。我无法想象你为什么想要;您的全部意思似乎是您不想剪裁图标。

但正如我在评论中所说,静态控件不会自动缩放其图标。您需要编写代码来自己缩放图标(可能通过调用 DrawIconEx function )。强制静态控件自行调整大小只会裁剪图标或在其周围添加边框。添加 SS_CENTERIMAGE 样式,如 duDE suggested将改变此行为,使图标与静态控件的中心对齐,从而巧妙地改变裁剪的方​​式。但它仍会被裁剪以适合静态控件的大小。

不过要小心。我在关于 IDI_ICON1 中的图标的评论中提出的全部问题是,LoadIcon 函数有一些重要的限制。即,它仅设计用于加载具有 SM_CXICONSM_CYICON 大小的图标(在大多数系统上,这将是 32x32)。当您在图标资源中只定义了一个图标时,它确实能按预期工作,但否则它就会分崩离析。这可能是拉伸(stretch)的解释。相反,建议您使用 LoadImage function .代码比较冗长,但是功能更强大:

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

关于c++ - MFC 如何将 CStatic 调整为小尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15321658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com