【问题标题】:MFC how to resize CStatic to a small sizeMFC如何将CStatic调整为小尺寸
【发布时间】:2013-03-10 11:21:59
【问题描述】:

我对 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 中的实际图标资源是多少?它是否包含多个图标大小?当你说“控件的实际大小变成21x21”时,你的意思是14x14像素的图标被拉伸到21x21像素吗?还是控件只是在其边界周围添加了填充?无论如何,请注意,当您更改大小时,静态控件不会调整其图标的大小。它不会缩放或缩小,只会剪辑。您必须自己进行图像处理。

标签: c++ mfc


【解决方案1】:

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

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

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

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

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

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

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

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

不过要小心。我在 cmets 中关于 IDI_ICON1 中的图标的问题的全部要点是 LoadIcon 函数有一些重要的限制。也就是说,它仅设计为加载具有SM_CXICONSM_CYICON 大小的图标(在大多数系统上,这将是 32x32)。当您在图标资源中仅定义一个图标时,它确实可以按预期工作,但否则它将崩溃。这可能是拉伸的解释。相反,建议您使用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!)

【讨论】:

    【解决方案2】:

    试试这个:

    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:

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

    【讨论】:

    • 当我使用SS_CENTERIMAGE 作为初始控件时,它会裁剪一个图标。但我仍然不明白为什么它会在加载时调整图标的大小。
    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 2017-08-20
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多