1

我对 CStatic 控件有以下问题:

当我调用函数时SetIcon

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

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

我试着打电话:

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

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

有没有办法设置要加载的图标的大小?

编辑

的实际大小IDI_ICON114x14像素。

此外,CStatic控件的大小是21x20,我无法与设计师一起更改它。

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

4

2 回答 2

1

的实际大小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_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!)
于 2013-03-10T12:03:35.450 回答
0

试试这个:

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:

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

于 2013-03-10T11:29:10.397 回答