社区
图形处理/算法
帖子详情
如何在OnPaint()中绘制背景透明的图片?
LAGsALFRED
2017-08-31 05:44:57
就是那种用PS打开,周围是透明的图片,如果用BitBlt或是StretchBlt的话透明的部分会扭曲
...全文
244
3
打赏
收藏
如何在OnPaint()中绘制背景透明的图片?
就是那种用PS打开,周围是透明的图片,如果用BitBlt或是StretchBlt的话透明的部分会扭曲
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
worldy
2017-09-01
打赏
举报
回复
TransparentBlt
kuangbao9
2017-09-01
打赏
举报
回复
http://download.csdn.net/download/kuangbao9/9922676
zgl7903
2017-08-31
打赏
举报
回复
AlphaBlend
?
VS2010 实现对话框程序设置
背景
图片
VS2010 实现对话框程序设置
背景
图片
void CMySendToDlg::On
Paint
() { if (IsIconic()) { C
Paint
DC dc(this); // 用于
绘制
的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
VC++做异形窗口
透明
效果
标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形”对话框/窗口也主要是颜色与外形上动手脚。改变
背景
颜色 改变对话框(窗口)的
背景
颜色是最简单的改变Windows应用程序外观的方法,根据Windows创建与管理机理,一般有两种方法。一种是处理WM_CTLCOLOR消息,首先创建所选
背景
颜色的刷子,然后调用SetBkColor()或SetDialogBkColor()以所创建的刷子来
绘制
窗口或对话框的
背景
。需要重画窗口或对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画对话
背景
的刷子句柄。另外一种是响应Windows的WM_ERASEBKGND消息,Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除
背景
,可以使用VC++的ClassWizard重载该消息的缺省处理程序来擦除
背景
(实际是用刷子画),并返回TRUE以防止Windows擦除窗口。2.改变窗口外形通过使用新的SDK函数SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,因此实际上是使窗口成为指定的不规则形状(区域形状)。“区域”是Windows GDI
中
一种强有力的机制,区域是设备上的一块空间,可以是任意形状,复杂的区域可以由各个小区域组合而成。Windows内含的区域创建函数有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通过CombineRgn()来组合区域,即可得到复杂形状的区域,获得复杂形状的窗口外形。通过上面的方法虽然可以得到“异形”窗口,但感觉颜色单调,外形也不够“COOL”,能否获得更酷的“异形”对话框/窗口呢?回答是肯定的。下面就介绍利用位图和蒙板创建“异形”对话框/窗口的方法。3.利用位图创建异形对话框窗口利用位图创建异形对话框原理是根据象素的颜色来进行“扣像”处理,对所有非指定颜色象素区域进行区域组合。利用这一技术,实际上就是实现对话框/窗口的位图
背景
,并且对指定的颜色区域进行
透明
处理。下面就以
透明
位图为
背景
的对话框为例来说明:首先用绘图软件如PhotoShop
绘制
编辑一幅拟做对话框
背景
用的
图片
,用BMP格式保存,假设存为Back.Bmp。需要说明的是,虽然Visual C++集成开发环境的资源编辑器只能编辑不超过16色的位图,但完全我们可以以真彩色方式存储,不必理会Visual C++的警告。下一步是用Visual C++的AppWizard创建一个基于对话框的应用程序假定命名为Trans。用资源编辑器引入
背景
图片
Back.Bmp,如果是高彩色,不必理会出现的警告信息,点击OK确认即可。为了明确,修改默认的资源ID标识IDB_BITMAP1为IDB_BACKBMP。然后修改对话框的Style为Popup,Border为None,如图1 。图1向CTransDlg类添加区域处理功能模块void CTransDlg::SetupRegion(CDC *pDC /*对话框窗口DC*/, UINT BackBitmapID /*
背景
位图资源ID*/, UINT MaskBitmapID /*区域处理位图资源ID*/, COLORREF TransColor = 0x00000000 /*
透明
颜色值,默认为黑色*/)。到目前为止,我们暂时认为MaskBitmapID等同于BackBitmapID。其核心工作是根据MaskBitmapID指示位图的象素颜色进行区域组合。完整的代码如下:void CTransDlg::SetupRegion(CDC *pDC /*对话框窗口DC*/, UINT BackBitmapID /*
背景
位图资源ID*/,UINT MaskBitmapID /*区域处理位图资源ID*/,COLORREF TransColor /*
透明
颜色值*/){CDC memDC;CBitmap cBitmap;CBitmap* pOldMemBmp = NULL;COLORREF cl;CRect cRect;UINT x, y;CRgn wndRgn, rgnTemp;//取得窗口大小GetWindowRect(&cRect);//
背景
位图资源IDm_BackBitmapID = BackBitmapID//装载位图cBitmap.LoadBitmap(MaskBitmapID);memDC.CreateCompatibleDC(pDC);pOldMemBmp = memDC.SelectObject(&cBitmap);//首先创建默认的完整区域为完整的窗口区域wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());//下面的两层循环为检查
背景
位图象素颜色,进行
透明
区域处理;//当象素颜色为指定的
透明
值时,即将该点从区域
中
剪裁掉。//其
中
用到的几个成员变量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth//和m_CaptionHeight,其作用后面再作说明,此时可全部当作0来处理。for(x= m_FrameWidth+m_MaskLeftOff;x<=cRect.Width() - m_FrameWidth-m_MaskRightOff; x++){for(y = m_CaptionHeight+m_MaskTopOff; yBitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRC/DownloadFiles\a\2001-10-12\COPY);if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );//删除系统却省的OnEraseBkgnd功能//return CDialog::OnEraseBkgnd(pDC);return TRUE;}接下来是在WM_
PAINT
的消息处理函数On
Paint
()
中
添加代码。由于当
背景
位图比较大时,进行区域处理比较耗时,所以只在启动时进行一次处理。一种方法是OnInitDialog()处理,但这样会在从启动程序到窗口出现有相当的延迟,易引起程序尚未启动的误解。再一种方法就是在On
Paint
()处理,但为了避免重复处理,可以加上一个判断标志。以下是On
Paint
()的代码,正体为AppWizard生成,粗体为自己添加内容。void CTransDlg::On
Paint
() {if (IsIconic()){……}else{if(m_nFirstRun){ //首次运行标志//修改鼠标光标为等待方式BeginWaitCursor();//设置
背景
区域SetupRegion(GetWindowDC(), 计算机教程用VC++实现异形窗口.来自www.itwen.comIT WEN计算机教程网 IDB_BACKBMP, IDB_BACKBMP, 0x00FFFFFF /*白色*/);//恢复鼠标光标为正常模式EndWaitCursor();m_nFirstRun = 0;}CDialog::On
Paint
();}}剩下的工作就是根据
背景
位图的大小来设置对话框窗口的大小和位置,这可以在OnInitDialog()
中
通过调用MoveWindow()来实现。再添加一些变量的声名和初始化,即可编译运行。图2为运行结果示例:图24.进一步的讨论前面实现了单一模式的异形对话框,但有些情况下又需要不同的样式,如有标题栏、边框等,或者只作局部的处理,这就是前面两个成员变量m_FrameWidth和m_CaptionHeight作用,通过在OnInitDialog()判断窗口样式,使m_FrameWidth和m_CaptionHeight取不同的值。这部分的代码为:BOOL CTransBmpDlg::OnInitDialog(){……// TODO: Add extra initialization herem_nFirstRun = 1;//数据设置,窗口左上角坐标:m_Left=0,m_Top=0 //
背景
位图宽高:m_Width=535,m_Height=105SetSize(0, 0, 535, 105);//蒙板处理区域与窗口边框的距离m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;//窗口边框与标题栏象素值m_FrameWidth = m_CaptionHeight = 0;//取得窗口样式LONG style = ::GetWindowLong(this->m_hWnd, GWL_STYLE);//如保留窗口风格样式,则根据不同的窗口边框类型 //选取不同的m_FrameWidth和m_CaptionHeight值, //也可以根据处理位置的需要进行付值if((style & WS_BORDER) == WS_BORDER)m_FrameWidth = ::GetSystemMetrics(SM_CXBORDER);if((style & WS_THICKFRAME) == WS_THICKFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & DS_MODALFRAME) == DS_MODALFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & WS_CAPTION) == WS_CAPTION){m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);m_CaptionHeight = ::GetSystemMetrics(SM_CYSMCAPTION);}m_CaptionHeight += m_FrameWidth * 2;//重置窗口的位置和大小MoveWindow(m_Left, m_Top, m_Width + m_FrameWidth * 2, m_Height + m_CaptionHeight, TRUE);……return TRUE; // return TRUE unless you set the focus to a control}另外,为进一步增加灵活性,使窗口样式不仅仅受
背景
位图颜色的控制。通过指定SetupRegion()的MaskBitmapID 为一个我们称之为“蒙板”的双色位图(多色彩也可以,但一般没有必要),即可实现需要的操作。图4为在同一
背景
位图上,通过图3的蒙板位图实现的效果,并且增加了对话框窗体的边框和标题栏属性。图3图4利用这种蒙板技术,可以创建出任意形状的窗口,而与
背景
位图无关。需要注意的是,对于对话框
中
的控件如按钮等,如处在或部分处在通明区域
中
,则通明区域
中
部分一并被剪裁掉,是否剪裁和剪裁位置与大小,利用蒙板可以很方便地进行控制。需要特别指出的是,SetWindowRgn()所指定的区域是针对整个窗口的,而Bitblt()/ StretchBlt()的输出区域是针对于客户区,两者在定位上是不同的,编程
中
应加以注意并灵活应用,这也是前面之所以设置边框大小等变量的原因。5.结束语这种异形窗口的创建不仅适应于对话框,而且适应于所有的基于CWnd类的派生窗口。采用这一方法,你可以创建出任何只要你能够画出的窗体,实现只要可以画出,就可以做出的目标。本文代码在Visual C++ 5.0、6.0下调试通过,运行正常,操作系统为Windows98SE。
MFC双缓冲及重绘示例
/* 整理: 1、双缓冲绘图技术概述 原理:将一般的在CDC
中
绘图改成在一内存设备
中
绘图(CDC型变量,一般命名为pMemDC),然后使用BitBlt()函数将pMemDC
中
的图像复制到CDC
中
; 步骤: ①创建内存设备CDC *pMemDC;关联设备CreateCompatibleDC(); ②创建兼容位图 HBITMAP ::CreateCompatibleBitmap(); ③选入设备内存设备(HBITMAP)::SelectObject(m_hDC,hBitmap); ④内存设备绘图 ⑤复制到CDC,使用函数 BitBlt() 2、手动重绘 原理: 利用内存设备的BitBlt()函数将初始CDC选入。将上面第⑤步的设备互换。 */ /* 程序过程: 1、
绘制
背景
,在函数DrawSome()
中
实现;并将其放在On
Paint
()函数
中
,保证每次刷新时依然存在; 2、修改WM_ERASEBKGND消息响应函数,使得不加入
背景
刷(此步可以取消,暂时无影响,因为将DrawSome()放在了On
Paint
()
中
); 3、响应鼠标左键按下,记录初始坐标点; 4、响应鼠标按下移动,并实时
绘制
矩形,此处用到双缓冲绘图技术; 5、响应鼠标左键松开,
绘制
红色矩形。 */
c#做的小程序 给大家分享
第1章 C#编程基础 实例1 Hello C#! 实例2 HeyGuy 实例3 预定义类型 实例4 类型转换 实例5 选择语句 实例6 循环语句 实例7 跳转语句 实例8 数组 实例9 枚举与结构类型 实例10 类 实例11 位运算 实例12 操作符重载 实例13 虚方法 实例14 委托 实例15 属性 实例16 异常处理 实例17 链表 实例18 回文数 实例19 汉诺塔 实例20 冒泡排序 实例21 插入排序 小结 第2章 界面编程 实例22 Hello Form 实例23 主菜单 实例24 上下文菜单 实例25 工具栏 实例26 状态栏 实例27 进度条 实例28 滑块控件 实例29 单选框和复选框 实例30 列表框和组合框 实例31 列表视图 实例32 树视图 实例33 Timer控件 实例34 Splitter控件 实例35 时钟控件和日历控件 实例36 MDI窗口 实例37 窗体继承 实例38 自制控件 实例39 使用自制控件 实例40 模式与非模式 实例41 会跑的按钮 实例42
绘制
背景
实例43 可调窗口 实例44 托动窗体 实例45 电子便条 实例46 计算器界面设计 实例47 计算器功能实现 实例48 小闹钟 小结 第3章 图形与图像处理 实例49 简单画图 实例50 使用On
Paint
绘制
图形 实例51
绘制
贝赛尔曲线 实例52 显示图像 实例53 消除
图片
背景
实例54 底片滤镜 实例55 浮雕效果 实例56 显示字体 实例57 特效字 实例58 旋转
图片
实例59 打印 小结 第4章 线程 第5章 文件处理和系统操作 第6章 数据库编程 第7章 网络编程 第8章 Web应用程序的开发 第9章 多媒体 第10章 安全性 第11章 设计模式 第12章 杂例
Visual C#.NET编程精粹150例.rar
第1章 C#编程基础 实例1 Hello C#! 实例2 HeyGuy 实例3 预定义类型 实例4 类型转换 实例5 选择语句 实例6 循环语句 实例7 跳转语句 实例8 数组 实例9 枚举与结构类型 实例10 类 实例11 位运算 实例12 操作符重载 实例13 虚方法 实例14 委托 实例15 属性 实例16 异常处理 实例17 链表 实例18 回文数 实例19 汉诺塔 实例20 冒泡排序 实例21 插入排序 小结 第2章 界面编程 实例22 Hello Form 实例23 主菜单 实例24 上下文菜单 实例25 工具栏 实例26 状态栏 实例27 进度条 实例28 滑块控件 实例29 单选框和复选框 实例30 列表框和组合框 实例31 列表视图 实例32 树视图 实例33 Timer控件 实例34 Splitter控件 实例35 时钟控件和日历控件 实例36 MDI窗口 实例37 窗体继承 实例38 自制控件 实例39 使用自制控件 实例40 模式与非模式 实例41 会跑的按钮 实例42
绘制
背景
实例43 可调窗口 实例44 托动窗体 实例45 电子便条 实例46 计算器界面设计 实例47 计算器功能实现 实例48 小闹钟 小结 第3章 图形与图像处理 实例49 简单画图 实例50 使用On
Paint
绘制
图形 实例51
绘制
贝赛尔曲线 实例52 显示图像 实例53 消除
图片
背景
实例54 底片滤镜 实例55 浮雕效果 实例56 显示字体 实例57 特效字 实例58 旋转
图片
实例59 打印 小结 第4章 线程 第5章 文件处理和系统操作 第6章 数据库编程 第7章 网络编程 第8章 Web应用程序的开发 第9章 多媒体 第10章 安全性 第11章 设计模式 第12章 杂例
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章