Advertisement

纯GDI实现的半透明不规则窗口(381行代码,单个cpp文件)

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
本项目通过纯GDI技术实现了一个具有半透明效果和自定义形状的Windows窗口。整个功能仅使用一个cpp文件完成,代码简洁高效,总共约381行。 以前在研究半透明不规则窗口的时候,用的是gdi的TextOut/DrawText绘制字体,但效果不佳,因为绘制出的字体是透明的。因此我放弃了GDI的TextOut()、BitBlt()的方式,转而使用SetDIBitsToDevice()来直接贴像素到DC里。今天尝试通过结合使用SetDIBitsToDevice()+UpdateLayeredWindow()实现半透明不规则窗口的效果非常理想。 此外,在本程序中还包含了一个利用MMX汇编优化的32位alpha混合函数(代码第57行,有详尽注释),需要的朋友可以直接复制使用。对于字体绘制部分,我建议大家采用GetGlyphOutline()手动提取字形像素来实现,因为TextOut这类方法功能有限,只适合初级软件开发需求;而要制作出具有丰富效果的界面,则必须直接操作像素数据才能达到目的。因此,GetGlyphOutline()是更为专业的方法,并且兼容性良好,可以适用于ddraw、d3d和opengl等图形库。 建议大家在设计复杂用户界面时考虑使用这种方法绘制字体以实现更高级的效果如字体alpha渐变等功能。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • GDI381cpp
    优质
    本项目通过纯GDI技术实现了一个具有半透明效果和自定义形状的Windows窗口。整个功能仅使用一个cpp文件完成,代码简洁高效,总共约381行。 以前在研究半透明不规则窗口的时候,用的是gdi的TextOut/DrawText绘制字体,但效果不佳,因为绘制出的字体是透明的。因此我放弃了GDI的TextOut()、BitBlt()的方式,转而使用SetDIBitsToDevice()来直接贴像素到DC里。今天尝试通过结合使用SetDIBitsToDevice()+UpdateLayeredWindow()实现半透明不规则窗口的效果非常理想。 此外,在本程序中还包含了一个利用MMX汇编优化的32位alpha混合函数(代码第57行,有详尽注释),需要的朋友可以直接复制使用。对于字体绘制部分,我建议大家采用GetGlyphOutline()手动提取字形像素来实现,因为TextOut这类方法功能有限,只适合初级软件开发需求;而要制作出具有丰富效果的界面,则必须直接操作像素数据才能达到目的。因此,GetGlyphOutline()是更为专业的方法,并且兼容性良好,可以适用于ddraw、d3d和opengl等图形库。 建议大家在设计复杂用户界面时考虑使用这种方法绘制字体以实现更高级的效果如字体alpha渐变等功能。
  • MFC
    优质
    本文介绍了如何在Microsoft Foundation Classes (MFC)中实现半透明窗口效果,并同时保持内部控件的完全不透明性。通过详细讲解相关代码和技巧,帮助开发者轻松掌握这一功能增强技术。 MFC半透明窗体 不透明控件 png背景 GDI+ 不规则窗体
  • 在父时,使子效果
    优质
    本文章介绍了如何在编程中实现一个特殊的视觉效果:当父级窗口保持完全不透明状态时,调整其下的子窗口显示为半透明模式。通过采用特定的技术或代码片段,可以使应用程序界面更加美观和独特,增强用户体验。 根据MSDN的描述,子窗口的半透明属性会跟随父窗口。这意味着在子窗口中使用SetLayeredWindowAttributes方法来实现透明效果是不可行的。本人采取了一种变通的方法,在保持父窗口不透明的情况下,简单实现了子窗口的半透明效果。
  • GDI+非
    优质
    本项目探讨了利用GDI+技术创建和操作非规则形状的Windows应用程序界面。通过自定义区域和图形路径实现复杂、不规则边界的窗体设计。 经过一周的研究资料,我终于找到了如何制作类似迅雷和360的悬浮窗的方法,特别是解决了不规则窗口所带来的挑战。我发现了一个很好的例子来解决锯齿问题,并且认为这是一个非常经典的解决方案。为了方便大家使用,我已经上传了这个项目文件,在VC2010环境中配置GDI+也相对简单。
  • 标准控(控字保持方法
    优质
    本文介绍了如何在半透明窗口中保持标准控件及其内部文本完全不透明的实现方法和技术细节。 本段落将介绍在半透明窗口中显示标准控件的实现方法。通过使用层叠窗口技术可以轻松地创建具有半透明或不规则形状效果的窗口,但在这样的窗口上展示完全不透明的标准控件则具有一定挑战性。这里提供了一种可行的方法来解决这一问题,并且还开发了一些可重用的窗口类,在需要时可以直接引用这些类以简化相关需求的实现过程。 参考先前的研究成果和实践经验,可以找到有效的解决方案。
  • MFC中
    优质
    本文介绍了在Microsoft Foundation Classes (MFC)中创建和实现半透明效果窗口的技术与方法,深入探讨了相关的API使用及示例代码。 在Windows编程中,MFC(Microsoft Foundation Classes)是一个基于C++的类库,它为开发者提供了构建Windows应用程序的便利。本段落将详细讲解如何在MFC应用中实现半透明窗口,并利用GDI+来绘制不透明文字。 首先需要理解什么是半透明窗口:在一个半透明窗口里,底层的内容部分可见,使得用户可以同时看到前景和背景内容。通过调整其透光程度,我们可以控制这种效果的程度。这一功能主要依赖于Windows API中的`UpdateLayeredWindow`函数实现。 **分层窗口(Layered Windows)**是Windows提供的一种高级特性,支持透明度、颜色键及自定义绘制等特殊效果。在普通模式下,系统负责处理窗口的透明度;而在自绘模式中,则需要开发者自行处理内容绘制部分。 为了创建半透明MFC应用,我们首先需要从`CWnd`派生一个类,并重载其`OnEraseBkgnd`函数以防止默认背景清除操作。然后,在窗口初始化时调用`SetLayeredWindowAttributes`设置初始的透明度和颜色键值: ```cpp void CMyWnd::OnEraseBkgnd(CDC* pDC) { // Do nothing to allow layered window drawing return TRUE; } void CMyWnd::OnCreate() { // ... SetLayeredWindowAttributes(RGB(0, 0, 0), 255); // 设置透明度(全不透明) } ``` 接下来,我们需要重载`OnPaint`函数并使用GDI+绘制窗口内容。这里我们将用它来生成红色的非透明文字: ```cpp void CMyWnd::OnPaint() { CPaintDC dc(this); Graphics graphics(dc.m_hDC); SolidBrush brush(Color(255, 0, 0)); // 红色字体 String^ text = LHello, World!; Font font(LArial, 36); graphics.DrawString(text, -1, &font, PointF(50.0f, 50.0f), &brush); } ``` 在`OnPaint`函数中,我们创建了GDI+的Graphics对象,并使用它来绘制红色的文字。SolidBrush定义填充颜色,Font设置字体样式,DrawString完成实际绘图操作。 最后,在窗口大小调整或需要更新透明效果时调用`UpdateLayeredWindow`以刷新其内容: ```cpp void CMyWnd::UpdateWindowLayered() { HDC hdcScreen = GetDC(NULL); HDC hdcMem = CreateCompatibleDC(hdcScreen); HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, m_rectClient.right, m_rectClient.bottom); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap); // 在hdcMem上绘制窗口内容 OnPaint(); BLENDFUNCTION blend; blend.BlendOp = AC_SRC_OVER; blend.SourceConstantAlpha = 255; // 全部不透明 UpdateLayeredWindow(m_hWnd, hdcScreen, &m_rectClient, hdcMem, NULL, RGB(0, 0, 0), &blend); SelectObject(hdcMem, hOldBitmap); DeleteDC(hdcMem); ReleaseDC(NULL, hdcScreen); } ``` 以上是使用MFC和GDI+实现半透明窗口及不透明文字绘制的基本步骤。实际开发中,还需考虑错误处理、性能优化等更多细节问题。希望本段落能帮助你理解和应用这些技术。
  • C#仿迅雷资讯体(控
    优质
    本项目为C#开发的仿迅雷风格资讯展示窗体,采用半透明设计,确保窗体内嵌入的控件保持完全不透明状态,提供美观且功能丰富的用户界面体验。 在C#编程中创建一个半透明窗体但控件保持不透明是一项常见的需求,在设计用户界面时可以提供独特的视觉效果。本教程将详细解释如何实现这一目标,并探讨移动窗体时可能出现的问题以及可能的解决方案。 首先,我们需要理解窗体的透明度是如何实现的。在C#中,Windows Forms提供了`Form`类的`Opacity`属性来设置窗体的透明度。这个值范围是0到1,其中0表示完全透明,1表示完全不透明。当设置`Opacity`小于1时,整个窗体会变得半透明,包括窗体上的所有控件。 然而,在实际操作中我们通常希望背景部分保持透明而控件正常显示。这时我们需要使用`SetStyle`方法来改变窗体的样式。在构造函数或`Load`事件处理程序中添加以下代码: ```csharp this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.BackColor = Color.Transparent; ``` 这会使窗体支持透明背景,并将其背景色设为透明,但不会使控件变得透明。 为了实现这一效果,我们需要对每个控件进行单独处理。一种方法是覆盖控件的`OnPaintBackground`方法以阻止其绘制背景: ```csharp public class MyButton : Button { protected override void OnPaintBackground(PaintEventArgs e) { // 不执行默认的背景绘制 } } ``` 你可以为每一个需要透明效果的控件创建自定义类并应用这种方法,或者在运行时遍历窗体上的所有控件来禁用它们的背景绘制。 然而,在移动窗体的过程中你可能会注意到背景图像没有实时更新。这是由于Windows默认窗口重绘机制导致的问题。为此可以尝试使用双缓冲技术或手动触发重绘: ```csharp private Point oldLocation; protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (oldLocation != Location) { oldLocation = Location; Refresh(); // 触发窗体重绘 } } ``` 另外,你还可以考虑使用`Update()`或`Invalidate()`方法来强制更新窗体区域。 如果你能够改进这一功能,使得移动窗体时背景能平滑实时显示,请分享你的代码。这将对其他开发者有很大的帮助。如果有任何问题或者进展,建议通过合适的渠道与社区交流以获得反馈和指导。 以上就是关于创建C#半透明窗体但控件不透明的详细步骤及注意事项。希望这个教程能够为你在开发过程中提供有价值的指导。
  • C++中示例
    优质
    本示例代码展示了如何在C++编程语言中创建和配置具有透明度效果的Windows窗口。通过调整窗口样式及使用相关API函数,可以灵活地设置透明级别或特定区域的透明性,从而增强应用程序界面的设计感与用户体验。 这是一个用C++实现的透明窗口的例子,以及如何调整窗口的透明度,供参考。
  • 遮罩2.1 - 模糊效果-易语言
    优质
    遮罩窗口2.1是一款使用易语言开发的应用程序插件,能够实现窗口的半透明及模糊效果,增强用户体验与界面美观度。 升级记录:2.0版本增加了模糊背景功能;2.1版本修正了遮罩抢焦点的问题,并修复了一个GDI泄漏问题。