MFC如何调整CStatic到一个小的大小

MFC how to resize CStatic to a small size

本文关键字:一个 CStatic 何调整 调整 MFC      更新时间:2023-10-16

我对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,我不能用设计师来改变它。

当我加载一个图标时,它是拉伸的。我不知道为什么。

IDI_ICON1的实际尺寸为14x14像素。

CStatic控件的大小是21x20,我不能用设计器来改变它。

如果你在设计器中查看控件的大小,你不是在比较苹果和苹果。设计师在 plus (对话框单位)中报告控件的大小,而不是像素。

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

所以你看到的行为对我来说是完全有意义的。

如果您不相信这种DLUs vs pixels的愚蠢之处,那么尝试在调试器下运行应用程序并使用spy++来调查静态控件的实际大小(以像素为单位)。我打赌它是14x14的。

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

但是就像我在评论中说的,静态控件不会自动缩放它们的图标。您需要自己编写代码来缩放图标(可能通过调用DrawIconEx函数)。强制静态控件调整自己的大小只会裁剪图标或在其周围添加边框。添加SS_CENTERIMAGE样式,就像duDE建议的那样,将改变这种行为,使图标与静态控件的中心对齐,微妙地改变裁剪的方式。但它仍然会被裁剪以适合静态控件的大小。

不过一定要小心。我在评论中关于IDI_ICON1中图标的问题的全部要点是LoadIcon函数有一些重要的限制。也就是说,它只被设计为加载SM_CXICONSM_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!)

试试这个:

CStatic m_CStatic;
// Create a child icon static control
m_CStatic.Create(_T("my static"), 
   WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTERIMAGE, CRect(0 , 0, 14, 14), pParentWnd);
// Set the icon
m_CStatic.SetIcon(::LoadIcon(IDI_ICON1));

关键是SS_CENTERIMAGE:

位图位于包含它的静态控件的中心。控件没有调整大小,因此对于控件来说太大的位图将被剪切