`

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

    博客分类:
  • VC
阅读更多

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

Button:

资料来源:

http://www.cnblogs.com/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控件中使用背景位图

方法一:

资料来源:

http://www.vckbase.com/document/viewdoc/?id=360

摘要:在VC中,标准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持选择背景位图的属性,所以如果要使这些标准控件达到这种效果,必须有些非常规的方法。本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。可能实现的方法还有其它种,如果有兴趣可以大家探讨。效果如图:

myedit

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

效果如图:

2

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

方法二:

于是我尝试查找其他的实现方法,在网上看到了这篇文章:

http://www.codeguru.com/cpp/controls/editctrl/transparent/article.php/c3921/

这篇文章虽然是想实现透明的,但我觉得他的透明效果实现的并不理想。但对于背景位图的实现很有启发。

下载了源码,发现他并没有重载CEdit类,而是直接在Dialog中的重载函数OnCtlColor()中进行的修改,我模仿他的方法进行了尝试,实现的效果比较理想,效果如图:

3

从实现效果来讲,还算理想,但这种方法有一个缺陷,那就是,背景图只能画在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类来实现. 网上找到的,一种伪实现的方法:

http://www.codeproject.com/KB/edit/ctrltrans.aspx

透明的True Implementaion 分析:

 

方法一:一个不太完美的实现方法。

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

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

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

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

 

 

 

 

 

 

Owner Draw Progress Control

资料来源:

实例一:

http://www.codeguru.com/Cpp/controls/controls/progresscontrols/article.php/c2221

实例二:

http://www.codeproject.com/KB/miscctrl/cprogressctrlst.aspx

关于资料:

实例一实现了 彩色颜色渐变进度条, 实例二实现了贴图进度条。

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

分享到:
评论

相关推荐

    mfc 各种控件的使用和布局(透明vista风格)

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中各种控件的使用与布局,特别是在实现透明Vista风格界面的技巧。MFC是微软提供的一套C++库,用于构建Windows应用程序,它极大地简化了Windows API的...

    MFC半透明背景及控件自绘

    在Microsoft Foundation Classes (MFC)...总结,实现MFC中的半透明背景和控件自绘涉及窗口透明度设置、控件自定义绘制以及可能的DLL导入。这个过程需要对Windows API有深入理解,同时也需要注意性能优化和兼容性问题。

    MFC 树形控件CTreeCtrl显示文件路径及文件1

    总结起来,本文介绍了如何在MFC环境中使用CTreeCtrl控件显示文件系统的目录结构,并通过CListCtrl显示选定项的详细信息。这个过程涉及到API函数的使用、控件属性的设置、事件处理以及资源管理。对于理解和实现文件...

    MFC窗口各控件的颜色和字体

    通过上述方法,开发者可以灵活地调整MFC窗口及其控件的颜色和字体,从而实现更加个性化和美观的用户界面。这些技巧对于提高应用软件的用户体验至关重要。掌握这些设置方法,可以让你的应用程序更具吸引力和专业性。

    VC中对话框窗体背景透明而控件不透明

    在VC++(Visual C++)开发环境中,创建一个对话框(Dialog)并实现其背景透明,但保持对话框上的控件(Controls)不透明,是一个常见的需求,这通常涉及到Windows API的深入理解和自定义绘图技术。下面我们将详细...

    mfc2005透明edit框

    总结:通过自定义CEdit派生类并重写OnPaint()函数,我们可以实现MFC 2005中的Edit控件的透明背景。同时,设置控件的WS_EX_TRANSPARENT扩展样式也非常重要,以允许控件透过自身显示其下的内容。这个技术可以应用于...

    MFC 自绘按钮显示 PNG 图片

    CButton是MFC对Windows API中的BUTTON控件的封装,它提供了一系列的方法和属性,用于创建和管理按钮。然而,CButton类默认并不支持PNG图片的显示,因此我们需要对其进行扩展,创建一个新的类来继承CButton,以便添加...

    static控件动态透明显示的完美解决方案

    ### Static控件动态透明显示的完美解决方案 ...这种方法不仅简单易用,而且可以广泛应用于各种需要透明效果的场景中。同时,通过创建自定义的`CTransparentStatic`类,还可以进一步增强控件的功能性和灵活性。

    异形半透明背景窗口(基于MFC)

    在本文中,我们将深入探讨如何基于Microsoft Foundation Class (MFC) 实现一个具有异形半透明背景的窗口,同时保持窗口内的控件不透明。这个技术在创建具有现代感和独特视觉效果的应用程序时非常有用。我们将分析...

    VC6.0/VS2005/VS2008 、MFC实现透明的图像

    总结来说,这个项目提供了一个在MFC环境中实现透明图像处理的例子。通过分析和理解这些源代码,开发者可以学习到如何在不同版本的Visual Studio中利用MFC实现复杂的图形效果,特别是透明图像的处理。这将有助于增强...

    MFC中用在Paint函数中制作悬浮透明标尺

    总结来说,实现"MFC中用在Paint函数中制作悬浮透明标尺"涉及的关键知识点包括:MFC框架、透明对话框的创建、`OnEraseBkgnd`和`OnPaint`函数的重写、GDI绘图、层叠窗口的透明度控制以及可能的图表控件集成。...

    MFC CStatic透明

    - **CStatic控件**:在MFC中,`CStatic`类表示静态文本控件或位图控件。它可以用来显示只读的文本或图像,并且不支持用户交互。 #### 知识点二:CTransparentStatic类及其实现透明功能 - **CTransparentStatic类**...

    QT 自己写的进度条控件 (透明窗体)

    总结来说,这个项目展示了如何在QT中创建自定义控件以实现独特的进度条样式,以及如何利用Qt的特性实现窗体透明。这对于想要提升应用界面独特性的开发者来说是一个很好的学习案例,同时也提醒我们,即使在旧的开发...

    MFC实现QQ截图工具

    在MFC中,我们可以创建一个透明的窗口类,覆盖在屏幕上,监听鼠标按下、移动和释放事件,动态更新矩形的选择范围。同时,还需要考虑非客户区的鼠标消息处理,以保证用户能正常地拖动和缩放选择框。 四、报错处理 在...

    MFC显示png

    总结起来,要在MFC程序中显示PNG图像,你需要: 1. 引入libpng库。 2. 创建自定义控件继承自CStatic。 3. 实现PNG加载、解码和绘制功能。 4. 处理窗口大小变化以保持图像比例。 5. 配置项目设置,链接libpng和zlib库...

    MFC按钮控件自绘

    在MFC(Microsoft Foundation Classes)开发中,自绘制是指开发者自己控制控件的绘制过程,而不是依赖于系统默认的绘制方式。对于按钮控件而言,自绘制可以使得按钮更加美观或者符合特定的设计需求。 #### 二、自...

    MFC UIDll.zip

    而UIDll可能是编译生成的动态链接库文件,用于在其他MFC项目中引入并使用我们实现的半透明背景和自绘控件功能。 总结来说,通过结合MFC、Windows API和Boost库,我们可以创建出具有独特视觉效果的用户界面。理解并...

    在控件上画对话框背景实现透明的例子

    在这个例子中,我们将探讨如何在控件上绘制对话框背景以实现透明效果,具体是针对一个使用TreeView控件的情况。这个实例来源于一个已有的教程,原文可以在"http://www.vckbase.com/index.php/wv/206.html"找到。为了...

    MFC 制作文本编辑器 桌面便签 置顶 置底(源代码)

    在MFC中实现控件背景透明,通常需要自定义控件并覆盖其OnPaint()函数。通过在OnPaint()中使用CPaintDC对象绘制透明效果,可以使得控件背景与父窗口背景融为一体。此外,可能还需要处理WM_ERASEBKGND消息,返回TRUE以...

    MFC实现关机和隐藏任务栏

    总结来说,通过MFC可以方便地实现Windows应用程序的各种高级功能,如系统级别的操作(关机)、界面调整(隐藏任务栏)和视觉效果(透明对话框)。理解并熟练运用这些技术,能帮助开发者创造出更加丰富和个性化的用户...

Global site tag (gtag.js) - Google Analytics