最近用MFC写一个程序,想在CStatic上绘制图片,一开始以为很简单,直接获取CStatic控件的DC绘图就是了,按照这个思路,编写函数,调用执行,结果大失所望,CStatic控件无动于衷,根本看不到图片。无奈,只好百度,谷歌!结果搜了一大堆,解决方案大多千篇一律,你抄我,我抄你,只是害苦了我们这些求知者!

根据网上搜到代码分析,测试,总结出如下两种方法:

大前提,一定要在对话框的OnPaint()函数中调用

例如在一个ID为IDC_STATIC_TEST的CStatic控件中绘图

方法一:使用CStatic的成员函数SetBitmap();

void fnDrawOnStatic1()
{
CStatic * pStatic = (CStatic *)GetDlgItem(IDC_STATIC_TEST);
HBITMAP hBitmap;
hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BMP_BK),
IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION); // IDB_BMP_BK是位图在RC里的ID

//SS_BITMAP 装载的是位图,SS_CENTERIMAGE 位图居中显示
pStatic->ModifyStyle(0,SS_BITMAP|SS_CENTERIMAGE); // 修改 CStatic的样式,这一步很重要

pStatic->SetBitmap(hBitmap);
}

注:如果使用SetBitmap的话,那么设置CStatic控件的格式时要注意,不能将其文字设置为居中在(即Align Text属性),不然显示不出图片

方法二:使用DC绘图

void fnDrawStatic2()
{
CStatic * pStatic = (CStatic *)GetDlgItem(IDC_STATIC_TEST);
HBITMAP hBitmap;
hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BMP_BK),IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION); // IDB_BMP_BK是位图在RC里的ID
pStatic->ModifyStyle(0, BS_OWNERDRAW); // 修改CStatic样式,改成自绘制,这一步很重要

CRect rc;
pStatic->GetClientRect(&rc);

BITMAP bm; // 位图结构体,用于接受位图的信息
HDC hdcImage = CreateCompatibleDC(NULL); // 创建兼容DC
SelectObject(hdcImage, hBitmap); // 将加载进来的位图句柄选入兼容DC
GetObject(hBitmap, sizeof(bm), &bm); // 将位图信息填入BITMAP结构体

StretchBlt(pStatic->GetDC()->GetSafeHdc(),rc.left,rc.top,rc.Width(),rc.Height(),hdcImage,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); // 拷贝位图到CStatic

DeleteObject(hBitmap);
DeleteDC(hdcImage);}

转载于:https://www.cnblogs.com/CPFlying/archive/2011/05/19/2050769.html

VC 在CStatic控件上绘图相关推荐

  1. QT-在子控件上绘图的两种方式

    Qt 在控件上面绘图 label,pushbutton..... 1.构建一个新类来调用该控件的绘图函数,新类重写 paintEvent(QPaintEvent *) ▶构建: class DrawG ...

  2. Qt-在控件上绘图的方式

    1.总述 Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上 ...

  3. MFC 配置OpenCV在Picture控件上绘图

    首先下载C++的OpenCV,这里给个百度网盘链接: 链接:https://pan.baidu.com/s/1Hltk8-eVo0lY9rj3IgIAPw 提取码:m52c 解压,放在合适位置即可. ...

  4. 为子控件添加自定义绘图方式

    在MFC应用程序中,有时会遇到需要让指定的控件实现自绘.但是看该控件的事件,没有一个像是能承担这种责任的. 我们都知道控件也是窗口,也都有消息循环.所以: 方案一:写个新类,继承自某个窗口类,在它的W ...

  5. mfc调取摄像头显示并截图_用OpenCV在MFC Dialog中Picture控件上显示摄像头采集实时视频...

    OpenCV之所以能在MFC Dialog的Picture控件上绘图,全靠了CvvImage::DrawToHDC()方法.这就是下文为出现CvvImage和HDC的原因.下面是具体过程,用OpenC ...

  6. MFC/VC++中怎样将一个位图添加到数据库中并且将其读出来到指定的Picture控件上

    看这篇文章之前建议先看一下下面这篇文章: VC下显示位图的几种方法   http://blog.chinaunix.net/uid-607545-id-2088102.html或  http://bl ...

  7. qt获取窗口的右上角位置_如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置...

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  8. SQL Server安装问题 mof 编译器无法连接到wmi服务器 不能在控件上调用Invoke或 BeginInvoke...

    谷歌后问题解决方法收集  方法1. 出现错误后,找到注册表的 "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Man ...

  9. 图解VC++开发ActiveX控件C#调用

    1 新建ActiveX控件工程 2 编译,运行 使用下图所示VC++自带测试工具来测试ActiveX控件: 3 测试容器 插入刚做的ActiveXDemo1控件 4 添加属性 添加名为outstr的属 ...

最新文章

  1. 怎么自学python编程-怎么自学python?
  2. 《Go语言圣经》学习笔记 第九章 基于共享变量的并发
  3. 系统分析与设计结对项目———Wordcount
  4. pyqt5 qlabel无法显示图片_实战PyQt5: 011-单选框控件QRadioButton
  5. linux/work
  6. node link 踩坑记录
  7. 如何在 macOS Monterey 上自定义光标?
  8. ActiveMQ的消息存储方式
  9. 路由器和交换机的区别
  10. linux新建/删除子接口
  11. 学设计的考PMP证书有用吗?
  12. 发明计算机的人的名人名言,16句关于科学家的名言
  13. 【分享】一个查看无线网络密钥的小方法(查看 wife密码,热点密码)
  14. uni-app对接支付
  15. outlook邮箱收件服务器密码,微软邮箱(hotmail+outlook):应用密码获取+STARTTLS加密...
  16. loj10155 数字转换
  17. B站弹幕姬()分析与开发(上篇)
  18. ECCV 2022《Tip-Adapter: Training-free Adaption of CLIP for Few-shot Classification》
  19. oracle vbo4582,4582是什么意思
  20. 账号管理html,个人账号管理.html

热门文章

  1. Linux solr 启动命令,linux – 重启Solr的正确方法是什么
  2. Spring框架中bean的生命周期
  3. 001_Gson概述
  4. 003_Servlet生命周期
  5. python turtle怎么用变量_Python Turtle绘图指定变量时出现问题
  6. rust高级矿场_高级 Rust 所有权管理
  7. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...
  8. python os方法-Python os.lchflags() 方法
  9. openstack管理员手册下载_城市绿心森林公园app下载-城市绿心森林公园客户端下载v1.1 安卓版...
  10. mysql5.6cmd中代码_Mysql5.6.22源代码安装