为VC++应用程序对话框添加透明位图
Vc2017对话框背景透明及控件背景透明

Vc2017对话框背景透明及控件背景透明说明:1、对话框上有背景图片,控件背景透明。
2、例子中有static、edit、button三种控件实现了背景透明。
3、解决了以下问题:(1)编辑框内文字重叠现象。
(2)按钮无变化现象。
#include"stdafx.h"#include"afxdialogex.h"#include"resource.h"class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()CMyAccessDlg::CMyAccessDlg(CWnd* pParent/*=nullptr*/): CDialogEx(IDD_MYACCESS_DIALOG, pParent), m_strBj(_T("")){}CMyAccessDlg::~CMyAccessDlg(){}void CMyAccessDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_strBj);}BEGIN_MESSAGE_MAP(CMyAccessDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_SHOW, &CMyAccessDlg::OnBnClickedButtonShow)ON_BN_CLICKED(IDC_BUTTON_NEXT, &CMyAccessDlg::OnBnClickedButtonNext)ON_WM_CTLCOLOR()ON_WM_ERASEBKGND()ON_EN_CHANGE(IDC_EDIT1, &CMyAccessDlg::OnChangeEdit1)ON_EN_CHANGE(IDC_EDIT_SHUNXU, &CMyAccessDlg::OnChangeEditShunxu)END_MESSAGE_MAP()// CMyAccessDlg 消息处理程序BOOL CMyAccessDlg::OnInitDialog(){CDialogEx::OnInitDialog();// IDM_ABOUTBOX 必须在系统命令范围内。
VC对话框的工具栏添加图标

m_toolbar.SetSizes(CSize(105,60),CSize(28,40));//设置按钮大小
m_toolbar.EnableToolTips(TRUE);//激活提示信息
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
return FALSE;
}
5.在字串表中创建相应ID的字串;
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild,FALSE);
pwndChild=pwndChild->GetNextWindow();
}
//调整对话框尺寸
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right+=rect.Width()-rectNow.Width();
rcWindow.bottom+=rect.Height()-rectNow.Height();
MoveWindow(rcWindow, FALSE);
//控件条定位
// if there is a top level routing frame then let it handle the message
vc++2008绘制透明位图

vc++2008绘制透明位图[cpp]view plaincopyprint?1./*2.函数名:绘制透明位图3.4.*/5.void Cs1Dlg::drawTransparent(CBitmap & bmp, int x, int y , int cx, int cy, int srcx, int srcy, CDC * pDC, COLORREF Transpare ntColor)6.{7.//定义源,掩码,透明绘制环境8.CDC SrcDC,MaskDC,TransDC;9.//定义掩码,透明位图10.CBitmap MaskBmp,TransBmp;11.BITMAP bm;12.13.//创建源,掩码,透明绘制环境14.15.SrcDC.CreateCompatibleDC(pDC);16.MaskDC.CreateCompatibleDC(pDC);17.TransDC.CreateCompatibleDC(pDC);18.19.//得到位图结构20.bmp.GetBitmap (&bm);21.22.//创建透明位图23.TransBmp.CreateCompatibleBitmap (pDC,cx,cy);24.25.//创建掩码位图26.MaskBmp.CreateBitmap(cx,cy,1,1,NULL);27.28.//将透明位图对象选入到透明绘图环境29.CBitmap *pTransBmp=TransDC.SelectObject(&TransB mp);30.TransDC.BitBlt (x,y,cx,cy,pDC,srcx,srcy,SRCCOPY);31.CBitmap *pSrcBmp=SrcDC.SelectObject (&bmp);32.SrcDC.SetBkMode (TRANSPARENT);33.if(TransparentColor)34.{35.SrcDC.SetBkColor(TransparentColor);36.}37.else38.{39.COLORREF col =SrcDC.GetPixel (0,bm.bmHeight -1);40.SrcDC.SetBkColor(col);41.}42.43.CBitmap *pMaskBmp=MaskDC.SelectObject(&MaskB mp);44.MaskDC.BitBlt(x,y,cx,cy,&SrcDC,0,0,SRCCOPY);45.46.TransDC.BitBlt (x,x,cx,cy,&SrcDC,0,0,SRCINVERT);47.TransDC.BitBlt (x,x,cx,cy,&SrcDC,0,0,SRCAND);48.TransDC.BitBlt (x,x,cx,cy,&SrcDC,0,0,SRCINVERT);49.50.BOOL bRet=pDC->BitBlt (x,y,cx,cy,&TransDC,srcx,srcy,S RCCOPY);51.SrcDC.SelectObject(pSrcBmp);52.SrcDC.DeleteDC();53.TransDC.SelectObject(pTransBmp);54.TransBmp.DeleteObject ();55.TransDC.DeleteDC ();56.57.MaskDC.SelectObject (pMaskBmp);58.MaskDC.DeleteDC ();59.MaskBmp.DeleteObject ();60.61.62.63.64.}。
VC显示位图++

对话框中动态显示位图—++2004-10-12 11:43:19在对话框中显示位图分为静态和动态两种方法。
静态法就是用VC6.0的资源编辑器,首先在资源视图中引入一张所要显示的位图,然后在对话框中放置一个Picture控件,在其属性对话框的Type下拉框中选择Bitmap,在Image框中输入所引入位图的ID,编译后对话框中就会显示所引入的位图。
这种方法有一个明显的缺点,就是位图必须先画好并且程序运行时此位图禁止改变。
基于此,下文以建立一个适时显示当前时间的程序为例,来介绍如何在对话框中动态显示位图。
首先建立一个基于对话框的程序,名为MyDialog。
清除掉对话框中的TODO:字样,把“确定”和“取消”两个按钮移到对话框的下边,调整对话框为到合适大小。
打开类视图,右键单击CMyDialogDlg,添加如下成员变量:protected:CRect m_bitmapRect; //位图在对话框中位置添加画图成员函数:protected:BOOL DrawBitmap(CString strTime,CRect* bitmapRect); //strTime为表示时间的字符串,bitmapRect指明在窗口的什么区域画图。
使用ClassWizard为CMyDialogDlg加入WM_TIMER的消息响应函数OnTimer(), 和WM_DESTROY的消息响应函数OnDestroy()。
在CMyDialogDlg::OnInitDialog()种添加如下代码:SetTimer(1,100,NULL);//设置定时器CRect rect;GetClientRect(&rect);//获得客户区大小ScreenToClient(&rect);//将屏幕坐标转化为客户坐标int width=180,height=45;//要创建的位图的宽度和高度m_bitmapRect.left=rect.right-25-width; //位图右边界距对话框的右边界25像素 m_bitmapRect.top=rect.top+35;//位图上边界距对话框的上边界35像素 m_bitmapRect.right=m_bitmapRect.left+width;m_bitmapRect.bottom=m_bitmapRect.top+height;编写画图代码。
用Microsoft Visual C显示位图文件方法总结

用Microsoft Visual C++显示位图图片的几种方法总结一,用控件框架作为装载位图的容器来显示位图用控件作为容器框架来显示位图是很多应用程序中都会遇到和用到的,因为它的方便可控制性1)、首先,我们先了解几个用到的函数:1、CWnd::GetDlgItemCWnd* GetDlgItem( int nID ) const;void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;返回值:指向给定的控件或子窗口的指针。
如果没有控件具有nID给出的整数ID,则返回NULL。
返回的指针可能是临时的,不能被保存以供将来使用。
参数:nID 指定了要获取的控件或子窗口的标识符。
phWnd 指向子窗口的指针。
说明:这个函数获得对话框或其它窗口中指定控件或子窗口的指针。
返回的指针通常被强制转换为nID所标识的控件类型。
2、CWnd::GetDCCDC* GetDC( );返回值:如果调用成功,则返回CWnd客户区的设备环境;否则,返回NULL。
这个指针可能是临时的,不能被保存以供将来使用。
说明:这个函数获得一个指针,指向一个客户区的公用的、属于类的或者私有的设备环境,依赖于为CWnd指定的类风格。
对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。
对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。
在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图。
除非设备环境属于一个窗口类,否则在绘图之后必须调用ReleaseDC成员函数以释放设备环境。
由于在同一时刻只有五个公用设备环境可供使用,因此如果释放设备环境时失败,可能导致其它应用程序不能访问设备环境。
如果在注册窗口类的时候,在WNDCLASS的风格中指定了CS_CLASSDC,CS_OWNDC或CS_PARENTDC,则GetDC成员函数将返回属于CWnd类的设备环境。
VC对话框使用OnEraseBkgnd函数位图背景并透明

VC对话框使⽤OnEraseBkgnd函数位图背景并透明VC对话框使⽤OnEraseBkgnd函数位图背景并透明1、使⽤OnEraseBkgnd函数实现对话框位图背景BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC *pDC){CRect rect;GetClientRect(&rect);CBitmap m_pBmp;BITMAP bm;CDC dcMem;m_pBmp.LoadBitmap(IDB_BITMAP1);m_pBmp.GetBitmap(&bm);//得到位图尺⼨dcMem.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = dcMem.SelectObject(&m_pBmp);pDC->SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图⽚严重失真pDC->StretchBlt(0,0,rect.Width() ,rect.Height(),&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);dcMem.SelectObject(pOldBitmap);return TRUE;}好多新⼿都不知道OnEraseBkgnd这个函数在对话框⾥是怎么添加的,有⼿⼯⾃⼰写和系统添加两种⽅式,具体使⽤⽅法见《VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd 函数)》到这⾥就可以实现位图了,但STATIC控件背景不透明,显得很难看。
2、来我们让STATIC控件透明吧HBRUSH CDisplayBmpBackGroundDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor == CTLCOLOR_STATIC){pDC->SetBkMode(TRANSPARENT);}return HBRUSH(GetStockObject(HOLLOW_BRUSH));}到这⾥其实就可以了,BMP的图⽚背景实现了,⽂本框的透明也实现了。
VC++实现显示透明的256色以上的图标

VC++实现显示透明的256色以上的图标相关图形处理技巧:·灰度图像与彩色图像的相互转换·位图显示透明效果·对话框添加透明位图·实现透明滑动控件源代码下载在学习Visual C++编程的过程中,有很多朋友可能会问Visual C++中如何保证256色以上的图标加载后不失真。
虽然有介绍如何实现256色以上的工具栏的文章,但是方法中大都采用加载一幅256色以上的工具栏位图的方法。
这样的方法存在一个麻烦就是用什么简便好用的制图工具来做这样的位图呢?相信读者朋友都希望能有更直接的方法来使用256色以上的图标,并且能够以透明的效果不失真地将图标显示出来。
本实例介绍了实现上述目标的方法,实现了在工具条上显示透明的256色位图,程序编译运行后的界面效果如图一所示:图一、透明显示256色的图标一、实现方法一般情况下,我们如果碰到需要在程序中使用图标的问题,首先要想到要用图像列表CimlageList类,该类是相同尺寸的图像或图标的集合,每个图像或图标用以"0"为基准的索引号来表征,因此它能有效地管理大量图标或位图。
CimageList类常与列表控件ClistCtrl、树控件CtreeCtrl或标签控件CtabCtrl一起使用,在本实例中,该类与CtoobBarCtrl类一起使用。
CimageList类的成员函数Create()初始化图像列表并且将它附加到一个CimageList对象上,该函数原型为:函数中前两个参数cx、cy指定了图标/图像的宽度和高度,即:图标/图像的尺寸定义。
第三个参数bMask为掩模标志,它指定何如显示图标/图像。
如果该值等于ILC_ COLOR8说明以256色的调色板来显示图标/图像。
而等于值"TRUE"则指明了以透明方式来显示图标/图像。
那么如果两者进行"按位或"运算后的意义就变为:以透明方式来显示256色图标。
VC++实现透明窗体

转发的,作者不记得是那位高人了VC++实现透明窗体BOOL SetLayeredWindowAttributes(HWND hwnd, // 应用目标窗口的句柄COLORREF crKey, // 掩码的颜色,可以用RGB(r,g,b)来指定BYTE bAlpha, // 掩码颜色部分的Alpha值,0是全透明,255是完全不透明DWORD dwFlags // 透明方式);要说名的是这个函数只在Windows2000及以上版本才支持。
MSDN对要求的描述如下<Requirements>Windows NT/2000/X P: Included in Windows 2000 and later.Windows 95/98/Me: Unsupported.Header: Declared in Winuser.h; include Windows.h.Library: Use User32.lib.还有就是这个函数对于有标题框的窗体支持不好,就是它裁切的只是客户区域,好在我们要制作透明窗体的场合一般用不到标题框下面就说名例程的制作过程。
(我旨在说明这种透明窗体的思路及函数的用法,所以代码非常简单,并且没有必要的错误验证机制,希望大家谅解)建立一张用于在窗体上绘制的背景图片,把要裁切的部分用一种颜色标记出来,我们叫它MaskColor,例如图片背景是绿色则MaskColor =0xFF00,也就是RGB(0,255,0).建立一个基于对话框的工程,修改对话框资源的属性,主要修改两个地方。
一是指定没有TitleBar,二是指定BorderStyle为None.这样才能保证出来的窗体符合你的要求把图片加入资源,付ID = IDB_BACKGROUND下面就开始写代码了,呵呵,看下面的代码这么长。
是不是头有点大呀,别急,这些多半都是工程向导自动生成的,我加的都已经注解上了,并用黄色表示没有几行的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
为VC++应用程序对话框添加透明位图
2005年08月09日 08:49 天极yesky
文/刘涛
我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本实例介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来,界面效果如图一所示:
图一、对话框界面上透明显示位图
一、实现方法
绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色"。
通过将位图的背景色指定为"透明色",在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明地绘制到窗口上。
绘制"透明"位图的关键是创建一个"掩码"位图(mask bitmap),"掩码"位图是一个单色位图,它是位图中图像的一个单色剪影。
在Windows编程中,绘图都要用到设备描述表,我们需创建两个内存设备描述表:位图设备描述表(image DC)和"掩码"位图设备描述表(mask DC)。
位图设备描述表用来装入位图,而"掩码"位图设备描述表用来装入"掩码"位图。
在"掩码"位图设备描述表中制作"掩码"位图的方式是:先创建一个单色的Bitmap,装入mask DC,然后,
以"SRCCOPY"的方式将装有位图的位图设备描述表绘制(BitBlt)到mask DC上。
这样,mask DC 的显示平面中的位图即是"掩码"位图。
一般情况下,绘制"透明"位图的实际操作步骤如下:
1、位图设备描述表以"SRCINVERT"的方式绘制(BitBlt)到显示设备描述表上;
2、 "掩码"位图设备描述表以"SRCAND"的方式绘制(BitBlt)到显示设备描述表上;
3、再将位图设备描述表以"SRCINVERT"的方式绘制(BitBlt)到显示设备描述表上。
这样除"透明色"外的其余位图部分(图像部分)就被绘制到窗口上了。
上述操作中需要用到的显示函数BitBlt的原型和说明如下:
函数的参数说明如下:int x表示贴到目的地的左上角X坐标;int y表示/贴到目的地的左上角Y坐标;int nWidth表示贴到目的地的区域宽度;int nHeight表示贴到目的地的区域高度;CDC* pSrcDC表示存储源位图的设备描述表;int xSrc表示源位图的左上角X坐标;int ySrc表示源位图的左上角Y坐标;DWORD dwRop为柵格运算标志,一般我们选择SRCCOPY,直接拷贝源位图到目标。
还可以让源位图和目标位图进行XOR,AND,OR等等的操作。
大家可以查看MSDN。
二、编程步骤
1、启动Visual C++6.0,生成一个基于对话框架的应用程序,讲程序命名为"TransPrarentImageTest";
2、添加位图资源,其ID为IDB_DRAGON,然后在对话框上添加一个IDC_STATIC控件,在其属性设置里选择显示该资源图像;
3、使用Class Wizard自定义类CtransparentImage,其基类选择Cstatic;
4、添加代码,编译运行程序。
三、程序代码
四、小结
本实例介绍了如何在对话框中实现透明位图的显示,读者朋友可能感觉到文中介绍的方法和代码的实现过程仿佛不太一致,其实这些只是表面现象,读者朋友在吃透实例代码的实现过程后,就会发现两者之间并没有什么冲突。