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

C++ MFC如何将CStatic调整为小尺寸,c++,mfc,C++,Mfc,CStatic控件存在以下问题: 当我调用函数SetIcon时: m_CStatic.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1)); 它加载一个大小为14x14像素的图标,但控件的实际大小变为21x20,我无法修改它 我试着打电话: m_CStatic.SetWindowPos(NULL,0 , 0, 14, 14, SWP_NOMOVE); 但它只剪切了一个尺寸,没有调整图标的大小。因此,我有一个缩放图像的一部分 有没有办法设置要

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,我无法使用设计器更改它

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

试试这个:

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:

位图在包含它的静态控件中居中。 控件未调整大小,因此对于控件来说过大的位图将被剪裁尝试以下操作:

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:

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

IDI_ICON1
的实际大小为14x14像素

另外,
CStatic
控件的大小为21x20,我无法使用设计器更改它

如果您在设计器中查看控件的大小,那么在这里您并不是在比较苹果。设计器以DLU(对话框单位)报告控件的大小,而不是像素

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

所以你看到的行为对我来说很有意义

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

不,如果将设计器中的静态控件设置为显示图标,则无法调整其大小。控件会自动调整大小以适应其显示的图标。这也是出于设计。我无法想象你为什么要这么做;你的全部观点似乎是你不希望图标被剪掉

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

不过,一定要小心。我在关于
IDI_ICON1
中图标的评论中提出的全部问题是,
LoadIcon
函数有一些重要的限制。也就是说,它仅用于加载具有
SM_CXICON
SM_CYICON
大小的图标(在大多数系统上,其大小为32x32)。当您在图标资源中只定义了一个图标时,它确实会按预期工作,但否则它会崩溃。这可能就是拉伸的原因。相反,建议您使用。代码更详细,但它是一个更强大的函数:

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!)
HICON HICON=static_cast(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_ICON1),
图像_图标,
14,/*宽度(x尺寸)*/
14,/*高度(y尺寸)*/
LR_(默认颜色));
//(完成后,请确保在hIcon上调用DestroyIcon())
IDI_ICON1
的实际大小为14x14像素

另外,
CStatic
控件的大小为21x20,我无法使用设计器更改它

如果您在设计器中查看控件的大小,那么在这里您并不是在比较苹果。设计器以DLU(对话框单位)报告控件的大小,而不是像素

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

所以你看到的行为对我来说很有意义

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

不,如果将设计器中的静态控件设置为显示图标,则无法调整其大小。控件会自动调整大小以适应其显示的图标。这也是出于设计。我无法想象你为什么要这么做;你的全部观点似乎是你不希望图标被剪掉

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

不过,一定要小心。重点