MFC中各种控件透明的实现方法总结

合集下载

MFC 设置控件字体颜色、背景透明

MFC 设置控件字体颜色、背景透明

1.打开对应对话框的类向导ClassWizard。

2.在消息映射MessageMaps中添加消息Message:WM_CTLCOLOR。

3.然后程序代码中会添加进函数:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)4.在这个函数中添加if语句,其中的条件表达式改成想要设置的控件;比如改成: if (pWnd-> GetDlgCtrlID() == IDC_STATIC1 || pWnd-> GetDlgCtrlID() == IDC_STATIC2)注意,控件ID最好改过,如果多个控件使用同个默认ID,函数则不识别。

5.在if中添加以下语句:pDC->SetTextColor(RGB(255,255,255)); //设置字体为白色pDC->SetBkMode(TRANSPARENT); //设置背景为透明整个函数的代码如下:HBRUSH CHall::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd-> GetDlgCtrlID() == IDC_STATIC1 || pWnd-> GetDlgCtrlID() ==IDC_STATIC2 || pWnd-> GetDlgCtrlID() == IDC_STATIC3){pDC->SetBkMode(TRANSPARENT); //设置背景透明pDC->SetTextColor(RGB(255,255,255));return HBRUSH(GetStockObject(HOLLOW_BRUSH));}return hbr;}。

MFC对话框透明设置

MFC对话框透明设置
font.DeleteObject();
pDC->SetTextColor(RGB(0,0,255)); //设置字体颜色白色
hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);
}
if (pWnd->GetDlgCtrlID() == IDC_FLY_T)
0, // nOrientation
FW_BOLD,//FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
//为窗口加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);
//调用SetLayeredWinowAttributes函数
{
pDC->SetBkMode(TRANSPARENT);
}
// TODO: Return a different brush if the default is not desired
return m_brush;
//return hbr;
出现的结果是控件中的字体没有什么变化,通过查资料,查到了原因的所在:
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision

MFC中各种控件透明的实现方法总结

MFC中各种控件透明的实现方法总结

MFC中各种控件透明的实现方法总结在MFC中实现控件透明的方法有多种,下面总结了几种常用的方法:
1.使用窗口风格(WS_EX_TRANSPARENT):在控件的创建过程中,使用WS_EX_TRANSPARENT风格可以使控件透明。

这个风格将使控件透明并允许鼠标事件穿透到控件底下的其他控件上。

2. 设置背景透明:可以通过重载控件的OnEraseBkgnd函数,将背景绘制为透明的,实现控件的透明效果。

具体的实现方法是,将背景绘制为透明色,并返回TRUE。

3.使用位图作为控件背景:可以使用透明位图作为控件的背景,这样控件就可以显示位图中的内容,并实现透明效果。

具体的实现方法是,将位图加载进内存DC中,然后将内存DC中的图像绘制到控件的DC上。

4.通过子类化控件:通过子类化控件,可以拦截并处理控件的绘制消息,从而实现透明效果。

具体的实现方法是,创建一个继承自原始控件类的子类,并重载子类的绘制函数,将背景绘制为透明。

6. 使用窗口类别(WS_EX_LAYERED):在控件的创建过程中,使用WS_EX_LAYERED风格可以使控件透明。

这个风格将使控件的窗口使用Alpha混合来控制窗口的透明度。

以上是一些常用的方法来实现MFC中各种控件的透明效果。

根据具体的需求和控件类型,选择适合的方法来实现透明效果。

需要注意的是,在使用透明效果时,需要确保控件的父窗口也是透明的,否则无法实现完全透明的效果。

(MFC)关于设置static控件背景透明的问题

(MFC)关于设置static控件背景透明的问题

想要使static控件背景透明,我们需要响应WM_CTLCOLOR消息,重载OnCtlColor函数。

内容如下:HBRUSH CteststaticDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: 在此更改DC的任何特性if(pWnd->GetDlgCtrlID() == IDC_STATIC){pDC->SetTextColor(RGB(255,200,100));pDC->SetBkMode(TRANSPARENT);return (HBRUSH)GetStockObject(NULL_BRUSH); //返回一个空画刷}// TODO: 如果默认的不是所需画笔,则返回另一个画笔return hbr;}注意,只有返回空画刷才真正的实现了透明,否则还是不透明,如果把返回空画刷的内容注释掉,则出现如下情况:(使用的另一个程序,对话框背景色设置为绿色,方便对比)所以,返回空画刷是必须的。

但是,这样就出现了一个新的问题:,当我们点击一个按钮更新标签上面的文字时,会造成重叠在一起,先看一下效果:可以通过以下方式使Static控件文本在透明状态下改变时不会产生文本重叠问题:1、由于Static控件的背景已经是透明的了,那么旧文本应该是画在Static控件的父窗口上的。

2、在给Static控件设置新文本之后(不是之前!)刷新父窗口即可。

例如:GetDlgItem(IDC_STATIC_TEST)->SetWindowText(_T("北京2008"));GetDlgItem(IDC_STATIC_TEST)->GetParent()->RedrawWindow();IDC_STATIC_TEST为控件ID号。

MFC的GDI+及透明窗口UpdateLayeredWindow

MFC的GDI+及透明窗口UpdateLayeredWindow

制作透明窗口, 使用透明图片遇到的一个问题1:添加PNG 资源失败.答: 先添加PNG资源组, 然后导入图片.2:显示成功加载资源, 资源成功载入内存, 但是加载到Image类的时候, 返回空指针.答: 可能是忘了初始化GDI+了. GDI+ 的所有功能使用之前必须先调用Gdiplusstartup()函数初始化好.3:在使用内存DC时,如果是在GDI下, 我们使用bitblt函数, 把内存缓存更新到目标缓存里如果是想制作透明窗口, 则使用UpdateLayeredWindow函数.4:UpdateLayerdWindow函数功能异常强大UpdateLayeredWindow(m_hWnd, // :当前窗口的句柄hdcDlgDC, // :当前窗口的DC&ptWinPos, // :当前窗口在屏幕的左上角位置(相当于::SetWindowPos()函数)&sizeWindow, // :当前窗口在的宽度和高度m_hdcMemory, // :内存缓存DC&ptSrc, // :内存缓存的左上角坐标(可用于裁剪内存缓存)0,&m_Blend, // 混合样式2);5:关于混合样式m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000m_Blend.BlendFlags=0; //nothingelseisspecial...m_Blend.AlphaFormat=1; //...m_Blend.SourceConstantAlpha= 1~255; // :该选项控制着整个窗口的透明度. 1为完全透明,255为完全不透明( 即使窗口完全不透明, 如果里面的图片有透明属性, 仍能够透明 )6:调用UpdateLayerdWindow之前, 要给窗口加上0x80000样式. 否则无效. DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&0x80000)!=0x80000)SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);7:Guiplus::Graphics类提供了功能强大的DrawImage 具体如何把一个Image类Draw到Graphics掌握的HDC上, 查看guiplus 帮助文档8:GDI和GDI+不变的是HDC,他们都要把东西画到一个DC上.所以, 初始化Guiplus::Graphics时, 要给其绑定一个DC,一般是绑定到内存dc上. Graphics graph(m_hdcMemory);除了加入了一些新的图像算法之外, GDI+和GDI的差别在于GDI: 面向句柄(HDC)编程GDI+面向对象编程. HDC是其的一个内部变量.。

MFC透明化窗口SetLayeredWindowAttributes

MFC透明化窗口SetLayeredWindowAttributes

前言很多文章示范了使用Windows 2000/XP的层次特性来实现窗口的透明化。

本文可以通过该特性使任意窗口透明化,即使你没有该程序的源代码。

使用 "WinTrans" 程序你可以选择任意正在运行的程序,用鼠标左键拖拽左上角框内的棒并将它压在该程序的标题栏上,然后放开,则该程序就可以变成透明。

你可以调整滑动条的位置来控制透明度。

"WinTrans" 有一个非常象 SPY 的界面,还可以示范Win32 APIs的如下用法:用鼠标指针定位窗口,获取例如类名、标题等窗口信息。

用法在Windows 2000/XP中,User32.dll增加了一个新函数SetLayeredWindowAttributes。

要使用该函数,我们必须在生成窗口或使用SetWindowLong函数中设置窗口风格WS_EX_LAYERED (0x00080000)。

该风格一旦被设置,我们就可以调用该函数来透明化窗口。

该函数所需参数如下:HWND hWnd: 窗口句柄COLORREF col: 透明化颜色BYTE bAlpha: =0:整个窗口透明, =255 完全不透明DWORD dwFlags: =1:仅颜色 col 透明, =2 :窗口按照bAlpha变量进行透明处理。

代码首先定义对话框的成员变量(WinTransDlg.h)。

bool m_bTracking; // 当鼠标被捕捉时设置为TRUEHWND m_hCurrWnd; // 鼠标所在窗口的句柄HCURSOR m_hCursor; // 棒型光标句柄同时定义一个指向SetLayeredWindowAttributes函数的指针。

该函数在User32.dll中定义。

// 全局变量typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr,BYTE bAlpha, DWORD dwFlags);lpfn g_pSetLayeredWindowAttributes;在OnInitDialog事件中获取SetLayeredWindowAttributes函数的指针并且保存在全局变量g_pSetLayeredWindowAttributes中。

MFC编程总结各种控件使用说明

MFC编程总结各种控件使用说明

MFC各种控件的使用说明把整数显示为时间格式的方法:Int minute=5; int sec=5;CString strTime;strTime.Format("%02d:%02d",minute,sec);GetDlgItem(IDC_STAT_DIS)->SetWindowText(strTime);定时器的使用方法:在函数BOOL CDingshiqiDlg::OnInitDialog(){SetTimer(1,1000,NULL);}添加语句SetTimer(1,1000,NULL);定时器1秒钟中断一次.然后添加消息WM_TIMER对应的消息函数:void CDingshiqiDlg::OnTimer(UINT nIDEvent){}播放系统声音的方法:在头文件添加这两句#include<mmsystem.h>#pragma comment (lib,"winmm.lib")然后调用函数: PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);VC++6.0控件工具箱:2 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon)3 静态文本(Static Text):MFC提供了CStatic类支持静态控件。

(1)更改该控件上字体的方法是:该控件的ID为IDC_STATIC1,IDC_STATIC2.CFont * f1;f1 = new CFont;f1 -> CreateFont( 25 , // nHeight15, // nWidth0 , // nEscapement0 , // nOrientationFW_BOLD, // nWeightFALSE , // TRUEbItalicFALSE, // bUnderline0 , // cStrikeOutDEFAULT_CHARSET, //ANSI_CHARSET nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_PITCH | FF_SWISS, // nPitchAndFamily_T( " 宋体" )); // lpszFacGetDlgItem(IDC_STATIC1)-> SetFont(f1);GetDlgItem(IDC_STATIC2)-> SetFont(f1);另一种改变字体大小的方法: 在函数外定义CStatic m_static;CFont font;m_static.SubclassDlgItem(IDC_STAT_DIS,this);LOGFONT log;GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(log),&log);log.lfHeight=300; //改log.lfWidth=120; //改log.lfCharSet=GB2312_CHARSET;lstrcpy(log.lfFaceName, _T("宋体"));font.CreateFontIndirect(&log);m_static.SetFont(&font);(2) 把整数显示在该控件的方法:IDC_STAT_DIS为控件IDInt minute=5,sec=5;CString strTime;strTime.Format("%02d:%02d",minute,sec);GetDlgItem(IDC_STAT_DIS)->SetWindowText(strTime);另外一种显示的方法:CStatic*pst=(CStatic *)GetDlgItem(IDC_STAT_DIS);pst->SetWindowText("00:00");4 编辑框(Edit Box):MFC提供了CEdit类支持编辑框控件。

MFC学习设置对话框的背景颜色及设置透明

MFC学习设置对话框的背景颜色及设置透明

MFC学习——设置对话框的背景颜色及设置透明(2012-03-20 20:57:28)现说设置背景颜色。

我用了很多方法都不行,查了很多资料,现在说一下解决方案吧。

在XXXXXXDlg.头文件的protected:中加入CBrush m_brush;在XXXXXXDlg.cpp文件中的OnInitDialog()初始化函数中加入画刷m_brush.CreateSolidBrush(RGB(255,255,255));RGB中的颜色自己定义。

然后在类向导中添加WM_CTLCOLOR消息函数。

在里面只写一句话:return m_brush;背景颜色就改了。

现在说怎么设计透明了,那就更简单了。

在OnInitDialog()初始化函数中添加两行代码:SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);SetLayeredWindowAttributes(0,200,LWA_ALPHA);第二行中的200为透明度,0为全透明,255为不透明。

MFC改变标题栏的颜色分类: MFC2009-02-06 17:15 2641人阅读评论(0) 收藏举报mfc1、创建一个普通的对话框;2、重写 WM_NCPAINT的实现函数;3、在实现函数中绘制标题栏,如果需要实现系统按钮,利用DrawFrameControl实现;4、如果有系统按钮,重写(WM_NCLBUTTONDOWN, WM_NCHITTEST,WM_NCLBUTTONUP)的实现函数;带源码的例子请参考:/cpp/w-d/dislog/titlebar/article.php/c1987/VC 标准对话框的标题栏,是有windows 系统控制颜色的(你可以通过修改桌面属性中的配色方案调整,看到实际效果),也就是说,在通常情况下,这个是不受程序控制的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2010-04-07
MFC中各种控件透明的实现方法总结
文章分类:C++编程
MFC中各种控件透明的实现方法总结
Button:
资料来源:
/songsu/articles/1370665.html
关键是其中的OnEraseBkgnd。

OnDrawItem只是在原来BUTTON的位置上画了一个椭圆显示BUTTON 的位置。

/*
* 画项
*/
void CImageButton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rc(lpDrawItemStruct->rcItem);
pDC->SelectStockObject(NULL_BRUSH);
pDC->Ellipse(rc);
}
/**//*
* 擦除背景
*/
BOOL CImageButton::OnEraseBkgnd(CDC* pDC)
{
CWnd *pParent = GetParent();
CRect rc;
GetWindowRect(rc);
pParent->ScreenToClient(rc);
pParent->InvalidateRect(rc,false);
pParent->UpdateWindow();
CDC *dcParent = pParent->GetDC();
pDC->BitBlt(0,0,rc.Width(),rc.Height(),dcParent,rc.left,rc.top,SRCCOPY);
pParent->ReleaseDC(dcParent);
return true;
}
如何在EDITBOX控件中使用背景位图
方法一:
资料来源:
/document/viewdoc/?id=360
摘要:在VC中,标准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持选择背景位图的属性,所以如果要使这些标准控件达到这种效果,必须有些非常规的方法。

本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。

可能实现的方法还有其它种,如果有兴趣可以大家探讨。

效果如图:
关于网上这个方法:我按照文中的方法进行多次尝试,始终不能达到理想的效果,下载下来的代码编译后效果很理想,但我多次尝试未果后,我将源码中的MyEditCtrl类直接拿来用了,尝试按照源码中的模式进行编码,但效果仍是不理想的。

可能是我在某方面出了差错。

效果如图:
注意我故意将编辑框缩小,以便能显示出后面的背景,可以看到背景是画出来了,但是编辑框是黑色的。

方法二:
于是我尝试查找其他的实现方法,在网上看到了这篇文章:
/cpp/controls/editctrl/transparent/article.php/c3921/
这篇文章虽然是想实现透明的,但我觉得他的透明效果实现的并不理想。

但对于背景位图的实现很有启发。

下载了源码,发现他并没有重载CEdit类,而是直接在Dialog中的重载函数OnCtlColor()中进行的修改,我模仿他的方法进行了尝试,实现的效果比较理想,效果如图:
从实现效果来讲,还算理想,但这种方法有一个缺陷,那就是,背景图只能画在Edit控件的内部,而我想要实现的效果是将“电话图标”作为编辑框的图标来显示,而在输入的时候直接在“电话图标”的后面的编辑框中进行,这就要求将背景位图“前移”一段距离,画到编辑框的外面,可这种方法是无法实现的,一种伪实现是,将这张背景图片切割成两部分,“电话图标”部分在Dialog中来画,后半部分作为编辑框的背景来画。

虽然效果是一样的,但这不是我想要的理想结果。

看来要实现这种效果,只能通过重载CEdit类来实现了,所以方法一我究竟错在哪里,害要继续研究。

方法二的关键代码:
if (pWnd->GetDlgCtrlID() == IDC_EDIT_IMAGE)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,255));
pDC->SelectObject(&m_brush2);
return m_brush2;
}
几点注意的地方:
1. m_brush2是成员变量,也就是要保证它的生命周期不能只在重载函数OnCtlColor()中。

2.m_brush2.CreateXXX()函数是创建画刷的函数,根据需要选择具体的创建函数,注意不要把该函数放在会被多次调用的函数(比如重载函数OnCtlColor())中,以免多次创建错误,除非你在第二次创建之前调用了m_brush.DeleteObject()函数。

3.直接拷贝上面的代码是效果是出不来的,你还需要一个CBitmap位图对象,并初始化它和
m_brush2对象。

Transparent Edit Box
为了搞定这个效果,花费了我不少时间。

透明的伪实现:
Edit Box的颜色分为3部分,文字颜色,文字背景色,编辑框背景色。

所以如果“文字背景色,编辑框背景色”能和对话框背景色一直的话,就能实现透明。

方法一:
直接在Dialog中的重载函数OnCtlColor里实现:
if (pWnd->GetDlgCtrlID() == IDC_TRANS_EDIT)
{
pDC->SetBkColor(RGB(236,233,216));
return m_brush;
}
注意m_brush是成员变量,是为RGB(236,233,216)的纯色画刷。

该颜色就是对话框的背景色。

方法二:
通过继承CEdit类来实现. 网上找到的,一种伪实现的方法:
/KB/edit/ctrltrans.aspx
透明的True Implementaion 分析:
方法一:一个不太完美的实现方法。

根据前面的分析return m_brush能够改变“编辑框背景色”,而SetBkColor能够改变“文字背景色”。

在这里,我可以得到一个Dialog的DC然后把Edit的区域的位图信息复制出来保存成一个CBitmap对象,在用这个bitmap对象创建一个画刷,把这个画刷返回,让对话框有这个画刷绘制控件。

从某种角度来说,透明Edit是实现了,但当把鼠标点击“文字背景色”时,能够看到一个黑色的区域。

很不理想。

这种情况与上面位图背景中提到的方法一所遇到的问题有点类似,只是通常情况下看不到黑框了。

Owner Draw Progress Control
资料来源:
实例一:
/Cpp/controls/controls/progresscontrols/article.php/c2221
实例二:
/KB/miscctrl/cprogressctrlst.aspx
关于资料:
实例一实现了彩色颜色渐变进度条,实例二实现了贴图进度条。

我只实现了实例一,还没有实现实例二。

相关文档
最新文档