我将 png 加载到 mfc 静态图片控件的代码有啥问题?

Posted

技术标签:

【中文标题】我将 png 加载到 mfc 静态图片控件的代码有啥问题?【英文标题】:What's wrong with my code to load a png to a mfc static picture control?我将 png 加载到 mfc 静态图片控件的代码有什么问题? 【发布时间】:2013-11-25 07:15:17 【问题描述】:
CImage image;
    image.Load(L"e:\\final.png");  
    int width = image.GetWidth();
    int height  = image.GetHeight();
    SetWindowPos(NULL, 0, 0, width, height, SWP_NOZORDER | SWP_NOMOVE);

    HBITMAP hBmp = image.Detach();  
    CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC); 
    pWnd->SetBitmap(hBmp);  
    pWnd->SetWindowPos(NULL,   0,   0,   width, height, SWP_NOACTIVATE | SWP_NOZORDER);     

将上述代码添加到 mfc 生成的对话框的 initdialog 例程中。但是png没有显示。

【问题讨论】:

看看这个答案***.com/questions/2490661/…,这也是***.com/questions/3988484/… 为什么要从 CWnd* 转换为 CStatic?之前创建了一个 CStatic 实例?所以它会将其返回为 CWnd* 吗?或者你强迫它变成CStatic*?我认为不建议使用新的转换方式(dynamic_cast、static_cast、reinterpret_cast),寻找完整的示例这可能会导致您找到解决方案,因为我认为这是样式问题,您是否使用了这些样式 SS_BITMAP|SS_CENTERIMAGE,msdn.microsoft.com/en-us/library/vstudio/b7w5x74z.aspx跨度> @Ahmedsafan:这是因为我没有为控件设置位图样式。谢谢你的回答。请发布它作为答案,所以我可以选择它。 对控件使用“真实”ID,而不是IDC_STATIC @Jichao:我已添加为答案,等你标记为正确答案。 【参考方案1】:

正如我在评论中建议的那样,@Jichao 报告说这是正确的解决方案。

查找完整示例,这可能会导致您找到解决方案,因为我认为这是窗口样式问题。您应该在静态控件资源定义中包含SS_BITMAP | SS_CENTERIMAGE 的样式。

见http://msdn.microsoft.com/en-us/library/vstudio/b7w5x74z.aspx

备注

位图将在静态控件中自动绘制。经过 默认绘制在左上角,静态绘制 控件将被调整为位图的大小。

您可以使用各种窗口和静态控件样式,包括:

SS_BITMAP 始终将此样式用于位图。

SS_CENTERIMAGE 用于在静态控件中使图像居中。如果 图像大于静态控件,将被剪裁。如果是 比静态控件小,图像周围的空白空间将 由左上角像素的颜色填充 位图。

【讨论】:

以上是关于我将 png 加载到 mfc 静态图片控件的代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

mfc里给picture控件加载一张位图,然后在位图上画一条线,该怎么做

MFC对话框加上PNG图片后,图片上的控件可以设置透明吗?

请问C++有没有一种方法加载png图片,无论exe文件复制到哪都可以用

使用静态库中的图像

MFC Picture控件加载图片

我想在MFC的对话框中添加静态图片,请问该怎么办?