PNG透明窗体全攻略(控件不透明)

PNG Image控件(Delphi) 用于支持PNG图片的Delphi控件,同样也可用于c++ Builder,很好用的东东,正在使用中 立即下载

这两天在研究透明窗体,总算略有小成。网上大部分文章都是介绍到把窗体弄透明就没有下文。其实窗体透明并不难,难就难在透明的窗体上还要放控件。今天我就把窗体透明一直到控件不透明怎么制作一块给写了吧。 
    先截张图诱惑下你们,如果你没兴趣就没必要再看下文了,有兴趣的话就继续往下看吧^_^!

 
    看好了,这是XP系统,未装.net。我的Photoshop学的不太好,把玻璃片弄的太透了些,如果你们有好的美术,再加上这种技术,肯定会如鱼得水。下面就来详细说说它的制作过程吧: 
    第 一步:在VC6中使用GDI+:你得从网上弄个GDI+ for XP的库,大约500K。如果找不到的话,找我QQ要吧,我会把这个窗口的源程序一起发给你的。把它解压后,将所有文件还包括子目录中的文件复制到你的项 目目录。在stdafx.h中加入以下代码: 
#include "gdiplus.h" ////请修改为你的头文件路径 
using namespace Gdiplus; 
#pragma comment(lib, "gdiplus.lib") ////请修改为你的.lib文件路径 
    我的项目名为Test,所以在TestApp中加入全局变量 
ULONG_PTR gdiplusToken; 
    在BOOL CTestApp::InitInstance()中加入这两行: 
GdiplusStartupInput gdiplusStartupInput; 
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 
    记住在线程退出后要御掉GDI+,它很占资源的,在int CTestApp::ExitInstance() 中加入这行: 
GdiplusShutdown(gdiplusToken); 
    一切准备工作就绪,开始制作窗口了。 

    二、制作PNG图像:这不是程序员的事,是美工的事,可是目前美术技术都是我一人,所以干脆连PNG一起教你们做了吧。 
    先打开Photoshop(简称PS),打开一张背景图,在背景图上使用圆角矩形工具 画个矩型,再用图层样式调出如下绿色玻璃片: 
 
    什么?怎么个调出来的?你还真以为我什么都教你?要是我连PS的过程都写上来,那我干脆写本书得了。体谅一下吧,写教程是需要大量时间的,所以能省则省。 
    将背景去掉,将玻璃保存成PNG图片,不需要设置任何参数,PNG是自动使用这种与背景溶合透明的,强大吧^_^! 
    再用同样的方法,制作绿色按钮 ,记住做界面的时候,一般要使用一种主色调,在这里我随便用了下绿色作为主色调,现在网络流行的是蓝色。文字则不能用RGB色彩,这样用户容易产生视觉疲劳。我做这个界面只是想试试绿玻璃好不好看,结果觉得不怎么好看,以后有空再弄个蓝玻璃试试吧。 
    按钮不需要保存成PNG,因为我不准备将它透明。至于这种“透明控件”的文章,你在网上一搜一大堆。 
    继续吧!还要做其它3个按钮,“确定”的按下效果,“取消”的拾起和按下效果,在这里我就不截图了。 
    美术都搞定,开始写代码。 

    三、写代码之前,我先说说工序:先用SetWindowLong将对话框设置成层级窗体,再使用GDI+显示图片。显示成功后再用UpdateLayeredWindow函数进行透明处理。 
    现在问题出来了,你会发现你原来在窗口上画的控件一概不显示,怎么办呢?我是在这个窗口上再盖上另一个对话框,设置成启动窗体那种样式,所有消息都在这个前景窗体上处理。 
    问题又来了,前景窗体盖上去,后面窗口又看不见了,怎么办呢?我又想了办法,在前景窗体加了透明色,在这里我是用粉红色,因为在电脑中粉红色用的最少,因为它很刺眼。用这个方法的缺点就是你的控件不能有粉红色。 
    最后将两个按钮改成位图按钮即可。 

    现在来看详细制作过程吧: 
    定义成员变量:在TestDlg.h中定义 
BLENDFUNCTION m_Blend; 
HDC m_hdcMemory; 

  m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000
m_Blend.BlendFlags=0; //nothingelseisspecial...
m_Blend.AlphaFormat=1; //...
m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA // 透明度


    改成层级窗体:在BOOL CTestDlg::OnInitDialog()函数中加入如下代码: 
//窗体样式为0x80000为层级窗体 
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE); 
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000); 

    加载PNG图片: 
//绘制内存位图 
HDC hdcTemp=GetDC()->m_hDC; 
m_hdcMemory=CreateCompatibleDC(hdcTemp); 
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,500,500); 
SelectObject(m_hdcMemory,hBitMap); 

//使用GDI+载入PNG图片 
HDC hdcScreen=::GetDC (m_hWnd); 
RECT rct; 
GetWindowRect(&rct); 
POINT ptWinPos={rct.left,rct.top}; 
Graphics graph(m_hdcMemory);   //GDI+中的类 
Image image(L"bk.png",TRUE);   //GDI+中的类 
graph.DrawImage(&image,0,0,267,154); //后面两个参数要设置成跟图片一样大小,否则会失真 

    窗口透明贴图: 
//使用UpdateLayerWindow进行窗口透明处理 
HMODULE hFuncInst=LoadLibrary("User32.DLL"); 
typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);           
MYFUNC UpdateLayeredWindow; 
UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst,"UpdateLayeredWindow"); 
SIZE sizeWindow={267,154}; 
POINT ptSrc={0,0}; 
UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2); 

    使用上述代码后,运行程序,你会发现你的窗口已经是透明的了,下面进行控件处理: 

    四、前景窗体 
    新建对话框,画上控件,我在这里起名为COnWindow,随便起的,不要笑我^_^。 
 
    读者奇怪的是,这上面怎么没有“用户名、密码”两个Label控件?不好意思,因为我的玻璃做的太透,这些文字在玻璃上已经很难看清楚,所以我干脆用PS描了下边,直接画到前景上去了,就成了这种效果 ,忽优了你们一下,不好意思,快去画吧^_^。 
   
    定义成员变量:在OnWindow.h中定义: 
CBrush m_brush;  //背景画刷 
CBitmapButton m_ok; 
CBitmapButton m_cancel; 

    设置画笔:在在BOOL COnWindow::OnInitDialog()加入一行: 
  m_brush.CreateSolidBrush(RGB(255,0,255));  //背景设置为粉红色 


    改为层级窗体: 
//SetWindowsLong将窗体设置为层级窗体 
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE); 
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle|0x80000); 

    设置透明色: 
//用SetLayeredWindowAttributes设置透明色为0,它比UpdateLayeredWindow的使用要简单些 
HMODULE hInst=LoadLibrary("User32.DLL"); 
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
MYFUNC SetLayeredWindowAttributes = NULL; 
SetLayeredWindowAttributes=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
SetLayeredWindowAttributes(this->GetSafeHwnd(),0xff00ff,0,1); 
FreeLibrary(hInst); 

    不要忘记把窗体前景刷成粉红色:在HBRUSH COnWindow::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 消息映射函数中加入代码: 
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
// TODO: Change any attributes of the DC here 
if(nCtlColor=CTLCOLOR_DLG) 
  return m_brush; 
return  CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);   

    现在要把前景窗体和背景窗体联动,这可是关键点: 
    把 前景窗体设置成启动窗体,无标题栏,样式为Popup弹出式。写到这里,我不得不说的是:我曾想把前景窗体设置成Child,发现前景窗体又被“透明”掉 了,什么都看不见,郁闷呀,所以只好用OnMove消息来设计窗体同步了。如果有对窗体机制比较熟悉的高手朋友,希望帮助我用更好的解决方法。 

    组合窗口,并保持联动: 
    在TestDlg.h中加入头文件:#include "OnWindow.h",再定义变量COnWindow *pChildWnd; 

    在void CTestDlg::OnMove(int x, int y) 加入如下代码,看清楚了,这里是CTestDlg透明窗口。矩形的坐标运算你可以自己修改,关键要跟背景对齐: 
CDialog::OnMove(x, y); 
// TODO: Add your message handler code here 
CRect rcWindow;                  // 使用MoveWindow函数的示例 
GetWindowRect(rcWindow); 
rcWindow.bottom-=10; 
rcWindow.left+=10; 
rcWindow.right-=10; 
rcWindow.top+=20; 
pChildWnd->MoveWindow(&rcWindow); 

    创建窗体时:在int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 加入如下代码: 
//创建子窗体 
pChildWnd=new COnWindow(this); 
pChildWnd->Create(IDD_ONWINDOW_DIALOG); 
pChildWnd->ShowWindow(SW_SHOW); 

    你现在看到窗体上没有标题栏吧?你把鼠标移到窗口顶部,还可以照样移动窗口,知道为什么吗?因为窗口虽然透明了,但是背景窗口的任何控件都是存在的,只是不显示,它还能照样响应事件,不信你在背景窗口上放上个按钮试试。不错吧?又省掉一些代码。 

    五、最后,我们来处理位图按钮:VC6的CBitmapButton::LoadBitmaps方法不能直接贴上16位真彩按钮,于是我将两个真彩色按钮用Acdsee32转换成256色的,就可以直接载入了,相信你们也没看出来吧? 
    处理成256色后,再在BOOL COnWindow::OnInitDialog() 写入代码: 
//载入按钮位图 
m_ok.LoadBitmaps(IDB_OK1,IDB_OK2); 
m_cancel.LoadBitmaps(IDB_CANCEL1,IDB_CANCEL2); 
m_ok.SubclassDlgItem(IDOK, this); 
m_cancel.SubclassDlgItem(IDCANCEL, this); 
    现在按下按钮只能关闭自己,给父窗口发个消息吧:在void COnWindow::OnOK()和void COnWindow::OnCancel() 都加入代码:
HWND hWnd=GetParent()->m_hWnd;
::SendMessage(hWnd,WM_CLOSE,0,0);

delphi控件PNGimage1.43 delphi控件PNGimage1.43,实现按钮加载PNG图片,实现透明效果 立即下载

相关推荐

delphi使用png图片的示例

在做delphi UI界面的时候,经常会碰到需要用到透明背景的png图片,原生代码无法满足,这里写了一个例子供大家参考,安装完控件之后,dephi原来的Image控件就支持png了

delphi操作png的单元pngimage.pas包括引用的ZlibExApi.pas和 PngLang.pas

有需要的可以去这里下载源码。http://download.youkuaiyun.com/detail/sushengmiyan/4662715 delphi操作png是在delphi2009版本之后(网上这么说的) 于是乎。。 我找了源码来共享。。 希望对大家有帮助。 当你的程序找不到pngimage这个单元的时候。。。 这段代码会帮助到你。。。 当你的不使用delphi... 或者你的可以

苏生-苏米沿的专栏 1万+

PNG Delphi 处理PNG图像的Delphi控件

内容索引:Delphi源码,控件组件,PNG  PNGDelphi是一款操作PNG图像有关的Delphi控件,内含多个实例,含英文版的帮助文档,相信这东西对从事Delphi编程的朋友有用处。

PNG透明窗体全攻略(控件不透明)vc++程序指导

<br />这两天在研究透明窗体,总算略有小成。网上大部分文章都是介绍到把窗体弄透明就没有下文。其实窗体透明并不难,难就难在透明的窗体上还要放控件。今 天我就把窗体透明一直到控件不透明怎么制作一块给写了吧。先截张图诱惑下你们,如果你没兴趣就没必要再看下文了,有兴趣的话就继续往下看吧^_^! <br />‍‍<br />‍看好了,这是XP系统,未装.net。我的Photoshop学的不太好,把玻璃片弄的太透了些,如果你们有好的美术,再加上这种技术,肯定会如 鱼得水。下面就来详细说说它的制作过程吧: <br /

天马星空的专栏 3497

Windows mobile 透明/半透明控件组(皮肤控件)

版权声明 本控件组版权归作者所有,未经同意,不得用于商业用途。任何人未经同意,不得擅自更改或在原基础上进行再次开发。 当前Windows mobile下的皮肤控件还很少,而且实现透明的更加少。本人曾经在Delphi开发过一套透明控件,于是决定把它移植到windows mobile系统下。在仿真器上和三星I718+上测试过,更换皮肤速度优化得相当快了,在Windows mobile下实属不易啊。 整套控件完全脱离MFC类,有自己的:CList、CString等组件类,所有控件由CWin这个透明窗体类派生,CWin派生CForm和CCtrl类,在CCtrl类上派生各个透明控件,有:CBtt(按钮控件)、CCheckBox、CRadioBox、CPanel、CLabel、CEdit、CWord、CPage、CGrid......,CApp为程序的应用类,担负了皮肤的加载等工作和处理系统消息的功能。 按钮控件有按下、放下、焦点、禁止四种状态,可以实现透明、半透明显示。图片可以是伸展方式或平铺方式显示,伸展方式可以自适应控件的大小。 希望本源码对初学Windows mobile编程的人有所帮助!

YOLOv11n-seg 实战指南:从训练到模型部署的完整流程

本文提供了YOLOv11n-seg实例分割模型从环境准备、数据标注到模型训练、验证及最终部署的完整实战指南。详细讲解了如何准备多边形掩码数据、配置关键训练参数、解读分割核心评估指标,并重点介绍了将模型导出为ONNX等格式进行部署的流程与优化技巧,帮助开发者高效完成从开发到生产的全链路实践。

weixin_29062255的博客 556

异形窗口-仿七彩虹光盘界面程序

PNG透明窗体全攻略(控件不透明) MFC界面编程1:GDI+实现不规则窗体  VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体 GDI+编程小结 UpdateLayeredWindow与SetLayeredWindowAttributes Layered Window 透明窗体的实现总结 用UpdateLayeredWindow实现任意异形窗口 CodeProject

Greless的后花园 1096

ACC自适应巡航功能

自适应巡航功能(Adaptive Cruise Control)通过传感器检测车辆前方形式环境,控制自车行驶速度以达到定速巡航、跟车巡航、跟车启停,并支持超车辅助等功能。1. 定速巡航一般可设置车辆在30~150km/h的定速范围内巡航2. 跟车巡航车速0~150km/h范围内的跟车巡航3. 跟车启停30s内:自车随之起步,驾驶员无需操作30s~600s内:驾驶员按钮激活 或 轻踩加速踏板激活起步600s后:ACC退出激活状态进入待激活状态,电子驻车制动EPB会自动启动4. 超车辅助。

LXY_LXY_的博客 1387
上一篇: .mc文件
下一篇: 设置recv的超时
AstrayLinux
博客等级 码龄15年 55粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值