我想让panel半透明并且让panel可以在边上时自动隐藏,高手请指点。

tianwailiuxingy 2009-12-11 04:37:35
我想让panel半透明并且让panel可以在边上时自动隐藏,高手请指点。
...全文
563 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjkn 2011-08-17
  • 打赏
  • 举报
回复
帮顶的
SAMLLY 2011-08-10
  • 打赏
  • 举报
回复
Ding
king_shadow 2010-01-13
  • 打赏
  • 举报
回复
看不到内容?
yymao2005 2010-01-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 delphi_freeman 的回复:]
panel 放在form里,让form隐藏不就ok了。
[/Quote]

如果form 透明是用CustomForm实现的,那么隐藏form,上面的panel是不会一同隐藏的。
hjkto 2009-12-11
  • 打赏
  • 举报
回复
哎,没看明白怎么用呀?
mdejtod 2009-12-11
  • 打赏
  • 举报
回复
继承tcustompanel控件重写一个,覆盖paint 事件
再作处理
var FAlphaValue : byte; //0-255

procedure Paint(); override;
procedure TTransParentPanel.Paint;
var FRect : windows.TRect;
Buf : TBitmap;
uDrawTextFlag : Integer;
begin
Buf := TBitmap.Create();
Buf.Width := Width;
Buf.Height := Height;
Buf.Canvas.Brush.Color := Color;
buf.Canvas.FillRect(Buf.Canvas.ClipRect);
DoTrans(Buf.Canvas,Self);//获取背景图
DrawAlpha(Buf); //将背景图与控件颜色用FAlphaValue进行混合透明
Buf.Canvas.Brush.Style := bsClear;

if Trim(Caption) <> '' then
begin
Buf.Canvas.Font := Font;

if (FCaptionPosX <> -1) and (FCaptionPosY <> -1) then
begin
Buf.Canvas.TextOut(FCaptionPosX, FCaptionPosY, Caption);
FLastDrawCaptionRect := Classes.Rect(
FCaptionPosX,
FCaptionPosY,
FCaptionPosX + Buf.Canvas.TextWidth(Caption),
FCaptionPosY + Buf.Canvas.TextWidth(Caption)
);
end
else
begin
FRect := ClientRect;
uDrawTextFlag := DT_CENTER;
if Alignment = taRightJustify then
uDrawTextFlag := DT_RIGHT
else if Alignment = taLeftJustify then
uDrawTextFlag := DT_LEFT;
DrawText(Buf.Canvas.Handle, PChar(Caption), -1, FRect, uDrawTextFlag or DT_SINGLELINE or DT_VCENTER);
FLastDrawCaptionRect := FRect;
end;
end;
BitBlt(Canvas.Handle, 0, 0, Width, Height, Buf.Canvas.Handle, 0, 0, SRCCOPY);
Buf.Free();
end;
procedure TTransParentPanel.DoTrans(FCanvas: TCanvas;FContorl : TWincontrol);
var DC : Hdc;SaveIndex :HDC; Position : Tpoint;
begin
if FContorl.Parent <> nil then
begin
{$R-}
Dc := FCanvas.Handle;
SaveIndex := SaveDc(Dc);
GetViewPortOrgEx(Dc,Position);
SetViewPortOrgEx(Dc,Position.X - FContorl.Left,Position.Y - FContorl.Top,nil);
IntersectClipRect(Dc,0,0,FContorl.parent.clientwidth,FContorl.parent.clientheight);
FContorl.Parent.perform(WM_ERASEBKGND,Dc,0);
FContorl.Parent.Perform(WM_PAINT,DC,0);
RestoreDC(Dc,SaveIndex);
{$R+}
end;
end;

procedure TTransParentPanel.DrawAlpha(var dBmp : TBitmap);
var i,j ,FCurX,aW,aH: Integer;
PD : PByteArray;
R,G,B : Byte;
begin
dBmp.Canvas.Lock;
R := GetRValue(DWORD(Color));//控件颜色
G := GetGValue(DWORD(Color));
B := GetBValue(DWORD(Color));
aH := dBmp.Height;
aW := dBmp.Width;
for i := 0 to aH - 1 do
begin
PD := dBmp.ScanLine[i];
for j := 0 to aW - 1 do
begin
try
FCurX := j *3;
PD[FCurX] := (PD[FCurX] * ( 255 - FAlphaValue) + B * FAlphaValue) shr 8;
PD[FCurX + 1] := (PD[FCurX + 1] * ( 255 - FAlphaValue) + G * FAlphaValue) shr 8;
PD[FCurX + 2] := (PD[FCurX + 2] * ( 255 - FAlphaValue) + R * FAlphaValue) shr 8;
except
Continue;
end;
end;
end;
dBmp.Canvas.Unlock;
end;
自动隐藏只要判断控件的位置是否在一个设定的范围内就隐藏掉就可以了
hjkto 2009-12-11
  • 打赏
  • 举报
回复
mark
无条件为你 2009-12-11
  • 打赏
  • 举报
回复
顶一下。
yumenyoudian 2009-12-11
  • 打赏
  • 举报
回复
半透明可以重载Panel的WM_Paint消息:
procedure TPanel.WMPaint(var: TMessage); message WM_Paint;
procedure AlphaBlendTabControl;
var
MemBitmap, OldBitmap: HBITMAP;
BF: BLENDFUNCTION;
MemDC, DC: HDC;
begin
if (Parent = nil) or not Parent.HandleAllocated then
Exit;
DC := GetDC(0);
MemBitmap := CreateCompatibleBitmap(DC, Parent.Width, Parent.Height);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
Parent.Perform(WM_ERASEBKGND, MemDC, MemDC);
Parent.Perform(WM_PAINT, MemDC, 0);

BF.SourceConstantAlpha := 100;
BF.AlphaFormat := 0;
BF.BlendOp := AC_SRC_OVER;
BF.BlendFlags := 0;
Windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height, MemDC, Left, Top, Width, Height, BF);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
begin
inherited;
AlphaBlendTabControl;
end;
至于自动应藏可以在WM_WINDOWPOSCHANGED消息里面处理
随行的太阳 2009-12-11
  • 打赏
  • 举报
回复
panel 放在form里,让form隐藏不就ok了。
yct0605 2009-12-11
  • 打赏
  • 举报
回复
使用第三方控件吧,raize里面的试试看。
序号内容详情内容第1讲关于《Prometheus+Grafana监控 》阐述本次系统列课程主要讲述的内容第2讲Prometheus核心组件之Prometheus Server介绍Prometheus Server组件的功能和工作原理第3讲Prometheus核心组件之Exporters介绍Exporter如何将监控到的数据暴露给Prometheus Server第4讲Prometheus核心组件之AlxrtManager和PushGateway介绍AlxrtManager和PushGateway两个组件的使用第5讲Prometheus核心组件之Service Discovery介绍Prometheus是如何发现被监控对象的第6讲Prometheus核心组件之Dashboard介绍Prometheus如何与第三方展示板配合,将数据以视图的方式展现出来第7讲Prometheus间序列理解Prometheus间序列,理解采集的样本第8讲Prometheus的Metric类型了解Prometheus的底层数据模型第9讲初步理解PromQL理解Prometheus中的PromQL工作原理第10讲PromQL操作符介绍PromQL操作符的用法:算术运算、布尔运算、集合运算和模式匹配第11讲PromQL聚合函数介绍常见的聚合函数使用:avg、max、min等第12讲PromQL内置函数介绍PromQL内置函数:rate、label_replace、label_join等第13讲HTTP API中使用PromQL介绍在HTTP API中使用PromQL进行瞬数据查询和区间数据查询第14讲4个黄金指标和USE方法介绍行业常用的4个黄金指标和USE方法来分析性能结果第15讲Prometheus告警原理介绍Prometheus告警工作原理第16讲自定义Prometheus告警规则介绍如何自定义Prometheus告警规则,及参数解析第17讲部署Alertmanager介绍Docker下部署Alertmanager第18讲Alertmanager配置发送邮件介绍Alertmanager配置项的含义,配置发送邮件第19讲配置route路由配置多级route路由,以及route路由工作原理第20讲配置group告警分组将相同标签的告警合并成一个通知第21讲Alertmanager配置警告通知模板通过templates来配置自定义告警模板第22讲Alertmanager抑制机制和临静默设置Alertmanager如何抑制警告和如何配置 Alertmanager临静默规则第23讲部署grafana介绍如何在docker下部署grafana数据可视化平台第24讲grafana组成部分介绍grafana核心组成部分:数据源、仪表盘、用户和组织第25讲grafana之Graph面板介绍grafana中的Graph面板、面板中各选项的含义以及如何添加自定义面板第26讲Dashboard变量定义通过Dashboard中变量定义来优化panel面板第27讲模板化Dashboard自定义和模块化Dashboard第28讲Prometheus监控系统资源使用node_exporter获取系统资源的监控数据第29讲Prometheus监控apache使用apache_exporter监控apache服务器第30讲Prometheus监控tomcat介绍如何使用prometheus获取tomcat的数据第31讲Prometheus监控nginx通过nginx-exporter让prometheus获取nginx的数据第32讲Prometheus监控mysql通过mysql-exporter让prometheus监控mysql的数据第33讲Prometheus监控redis通过redis-exporter让prometheus监控redis的数据第34讲Prometheus监控docker通过cadvisor让prometheus监控docker的数据

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧