如何使背景变灰(100分)

  • 主题发起人 主题发起人 jsq
  • 开始时间 开始时间
J

jsq

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,在windows中,选择关机时背景会变成灰色的。
请问在delphi中如何实现相当功能,谢谢。
 
procedure DarkScreen;
const
bBmp: array [0..15] of Byte = (
$55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0);
var
Bitmap: HBITMAP;
Pattern: HBRUSH;
DCScreen: HDC;
OldPattern: HGDIOBJ;
begin
Bitmap := CreateBitmap(8, 8, 1, 1, @bBMP);
Pattern := CreatePatternBrush(Bitmap);
DCScreen := GetDC(0);
OldPattern := SelectObject(DCScreen, Pattern);
BitBlt(DCScreen, 0, 0, Screen.Width, Screen.Height, 0, 0, 0, $A000C9);
SelectObject(DCScreen, OldPattern);
ReleaseDC(0, DCScreen);
DeleteObject(Bitmap);
DeleteObject(Pattern);
end;
 
谢谢,不过当鼠标在窗体移动时就被破坏了。还有,如何保证当前
窗体不变灰,但其他都灰了呢?
 
放在form.paint上不去行了
 
不行哇,放在form.paint上时会将整个窗体都变灰。而且还是有一些地方
变形了。
我的情况是,有一个form1覆盖整个屏幕,另有一个form2。
当我在form1打开form2时,form2不变灰,但form2的后面都变成
灰的,当关掉form2时,屏幕恢复正常。
 
把该函数改进以下,使之可以对 Form.Canvas.Handle 操作:
procedure DarkRect(DC: HDC; const Rect: TRect);
const
HatchBits: array[0..15] of Byte = (
$55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0, $55, 0, $AA, 0);
var
Bitmap: HBitmap;
SaveBrush: HBrush;
SaveTextColor, SaveBkColor: TColorRef;
begin
Bitmap := CreateBitmap(8, 8, 1, 1, @HatchBits);
SaveBrush := SelectObject(DC, CreatePatternBrush(Bitmap));
SaveTextColor := SetTextColor(DC, clWhite);
SaveBkColor := SetBkColor(DC, clBlack);
with Rect do PatBlt(DC, Left, Top, Right - Left, Bottom - Top, $00A000C9);
SetBkColor(DC, SaveBkColor);
SetTextColor(DC, SaveTextColor);
DeleteObject(SelectObject(DC, SaveBrush));
DeleteObject(Bitmap);
end;
 
做一个没有边界、最大化、透明窗口,比如 Form2,可以这样调用函数:
DarkRect(Form2.Canvas.Handle, Rect(0, 0, Form2.Width, Form2.Height));
 
不要响应 OnPaint,只调用一次即可。
 
我想应该在显示出FORM2后让FORM1 STAYONTOP并成为当前激活窗口,还应该让
FORM2的ENABLED:=FALSE;SENDTOBACK。只有通过FORM1上的操作才让FORM改变。
 
怎么做透明窗体,小弟在这方面很弱,恳请各位打虾继续
指点,谢谢。
 
TForm1 = class(TForm)
private
procedure WMEraseBkgnd (var Msg : TMessage); message WM_ERASEBKGND;
end;


procedure TForm1.WMEraseBkGnd;
begin
Msg.Result := 0;
end;



 
多谢Croco大虾,现在可以了,不过,我还有个疑问,就是
我在form1上打开一个form3,之前先打开哪个透明的form2。
背景变灰了,不过,当我移动form3时,后面会留下form3的
影子,怎么办呢?
 
有办法。肚子第一。
 
TForm1 = class(TForm)
......
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormShow(Sender: TObject);
private
ScrBuff: TBitmap;
procedure GetScreen;
......
public
{ Public declarations }
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ScrBuff := TBitmap.Create;
BorderStyle := bsNone;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ScrBuff.Free;
end;

procedure TForm1.GetScreen;
var
R: TRect;
begin
ScrBuff.Width := Screen.Width;
ScrBuff.Height := Screen.Height;
ScrBuff.Canvas.Brush.Style := bsSolid;
R := Rect(0, 0, Screen.Width, Screen.Height);
ScrBuff.Canvas.FillRect(R);
BitBlt(ScrBuff.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0, 0, srcAnd);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(- Left, - Top, ScrBuff);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
GetScreen;
end;

此外:
在调用 DarkRect 之后,要 GetScreen。

 
Croco大虾,这些过程是在form1里面写,还是在form2/form3里面?
 
你的透明窗口。
 
OK!thanks for Croco。
 
后退
顶部