怎样在 C++ Builder 中建立透明 Form?

henry_sel 2000-02-27 12:19:00
怎样在 C++ Builder 中建立透明 Form?
...全文
351 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ploto 2000-04-19
  • 打赏
  • 举报
回复
建立透明FORM的最简单的办法就是在FormCreate语句中设定Brush->Style=bsClear;
另外一种方法是重载CreateParams函数,方法如下:
声明:
virtual void __fastcall CreateParams(TCreateParams& param);
实现:
void __fastcall TForm1::CreateParams(TCreateParams& param)
{
TForm::CreateParams(param);
param.ExStyle and = WS_EX_TRANSPARENT;
}
929 2000-03-26
  • 打赏
  • 举报
回复
如果在NT下,可用这个API试试:
BOOL WINAPI PaintDesktop(

HDC hdc
);
wxz 2000-03-26
  • 打赏
  • 举报
回复
Windows 改变窗口背景颜色时,向窗口发送WM_ERASEBKGND消息,在程序中拦截这个消息,
使它直接返回.
radish 2000-02-27
  • 打赏
  • 举报
回复
好象有人问过了,记得是用SetWindowLong函数,具体就请看WIN32API帮助
bunny 2000-02-27
  • 打赏
  • 举报
回复
我有一个这样的控件,C++Builder 下的有源程序!
transparentWindow.cpp

#include <vcl.h>
#pragma hdrstop

#include "TransparentWindow.h"
#pragma package(smart_init)

static inline void
ValidCtrCheck(TTransparentWindow *)
{
new TTransparentWindow(NULL);
}

__fastcall TTransparentWindow::TTransparentWindow(
TComponent* Owner) : TComponent(Owner)
{
//<AW>Make Sure Pointers Are NULL
bmTransparentImage = NULL;
}

bool __fastcall
TTransparentWindow::Activate()
{
bool bSuccess;

/*<AW>If the image has been set and the
Windows handle has been specified then
we can continue and return success*/
if (bmTransparentImage &&
lWindowHandle!=0)
{
//<AW>Create an opaque region from a bitmap

bSuccess=SetTransparentRegion
(bmTransparentImage);
if (bSuccess)
//<AW>Set region for the supplied Windows handle
SetWindowRgn (lWindowHandle, rgnOpaque, true);
}
else
{
//<AW>If something is missing then report
// what and return failure
if (bmTransparentImage==NULL)
Application->MessageBox ("No Bitmap Selected",
"Activate Cancelled", MB_OK);
else if (lWindowHandle == 0)
Application->MessageBox (
"No Window Handle Selected",
"Activate Cancelled", MB_OK);
bSuccess=false;
}
return bSuccess;
}

void __fastcall
TTransparentWindow::SetTransparentImage(
System::AnsiString value)
{
//<AW>Set The Window Image
try
{
//<AW>If The Bitmap Exists Then Delete It
if (bmTransparentImage)
{
delete bmTransparentImage;
bmTransparentImage = NULL;
}
//<AW>Load The Image
bmTransparentImage = new Graphics::TBitmap();
asTransparentImage = value;
bmTransparentImage->
LoadFromFile(asTransparentImage);
bmTransparentImage->PixelFormat = pf8bit;
}
catch (Exception &e)
{
//<AW>Handle Any Errors And Delete The Pointer
Application->MessageBox (e.Message.c_str(),
"Couldn't Load Transparent Image", MB_OK);
if (bmTransparentImage)
{
delete bmTransparentImage;
bmTransparentImage = NULL;
asTransparentImage = "";
}
}
}

__fastcall TTransparentWindow::~TTransparentWindow()
{
//<AW>Clean Up And Delete The Bitmap
if (bmTransparentImage)
delete bmTransparentImage;
}

bool __fastcall
TTransparentWindow::SetTransparentRegion(
Graphics::TBitmap *bmTransparentBitmap)
{
//<AW>Set The Active Region Of The Window
long X,Y,XTransparent;
Byte *Line;
HRGN rgnTransparent;
bool bSuccess;
try
{
bSuccess = true;
//<AW>Loop Through Each ScanLine and Each Pixel
rgnOpaque = CreateRectRgn (0, 0,
bmTransparentBitmap->Width,
bmTransparentBitmap->Height);
for (Y=0;Y<bmTransparentBitmap->Height;Y++)
{
Line=(Byte*)bmTransparentBitmap->ScanLine[Y];
for(X=0;X<bmTransparentBitmap->Width;X++)
{
while (X<bmTransparentBitmap->Width
&& Line[X]!=0)
{
//<AW>Process The Non-Transparent Region
X++;
}
//<AW>Transparent Start
XTransparent=X;

while (X<bmTransparentBitmap->Width
&& Line[X]==0)
{
//<AW>Process The Transparent Region
X++;
}

//<AW>If There Was A Transparent Region
if (XTransparent<X)
{
//<AW>Create The Region
//(Remove The Transparent Bit)
rgnTransparent = CreateRectRgn
(XTransparent, Y, X, Y+1);
//<AW>If It's A Null Region, Return False
if (CombineRgn (rgnOpaque,
rgnOpaque, rgnTransparent,
RGN_XOR) == NULLREGION)
bSuccess=false;
DeleteObject(rgnTransparent);
}
}
}
}
catch (Exception &e)
{
//<AW>Catch The Errors
Application->MessageBox(e.Message.c_str(),
"Error Creating Transparency", MB_OK);
}
return bSuccess;
}

namespace Transparentwindow
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] =
{__classid(TTransparentWindow)};
RegisterComponents("Samples", classes, 0);
}
}

头文件如下:
//---------------------------------------------------------------------------
#ifndef TransparentWindowH
#define TransparentWindowH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class PACKAGE TTransparentWindow : public TComponent
{
private:
AnsiString asTransparentImage;
HWND lWindowHandle;
HRGN rgnOpaque;
Graphics::TBitmap *bmTransparentImage;
void __fastcall SetTransparentImage
(System::AnsiString value);
bool __fastcall SetTransparentRegion
(Graphics::TBitmap *bmBitmap);
protected:
public:
__fastcall TTransparentWindow(TComponent* Owner);
__fastcall ~TTransparentWindow();
bool __fastcall Activate();
void __fastcall SetWindowHandle
(HWND Handle) {lWindowHandle=Handle;}
__published:
__property AnsiString TransparentImage =
{ read = asTransparentImage,
write = SetTransparentImage };
};
//---------------------------------------------------------------------------
#endif
netware 2000-02-27
  • 打赏
  • 举报
回复
请参照一个delphi例子
unit homepage_coolform;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons;

type TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private { Private declarations }
public { Public declarations }
hbmp:integer;
end;

var Form1: TForm1;

implementation
{$R *.DFM}
function CopyScreenToBitmap(Rect:TREct):integer;
var
hScrDC, hMemDC, hBitmap, hOldBitmap:integer;
nX, nY, nX2, nY2: integer;
nWidth, nHeight:integer;
xScrn, yScrn:integer;
begin
if (IsRectEmpty(Rect)) then
begin
result:= 0;
exit;
end; // 获得屏幕缓冲区的句柄.
// a memory DC compatible to screen DC
hScrDC:= CreateDC('DISPLAY', pchar(0), pchar(0), PDeviceModeA(0));
hMemDC:= CreateCompatibleDC(hScrDC);
// get points of rectangle to grab
nX := rect.left;
nY := rect.top;
nX2 := rect.right;
nY2 := rect.bottom;
// get screen resolution
xScrn:= GetDeviceCaps(hScrDC, HORZRES);
yScrn := GetDeviceCaps(hScrDC, VERTRES);
//make sure bitmap rectangle is visible
if (nX <0) then
nX :="0;"
if (nY < 0) then
nY :="0;"
if (nX2> xScrn) then
nX2 := xScrn;
if (nY2 > yScrn) then
nY2 := yScrn;
nWidth := nX2 - nX;
nHeight := nY2 - nY;
// create a bitmap compatible with the screen DC
hBitmap := CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// select new bitmap into memory DC
hOldBitmap := SelectObject(hMemDC, hBitmap);
// bitblt screen DC to memory DC
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
// select old bitmap back into memory DC and get handle to
// bitmap of the screen
hBitmap := SelectObject(hMemDC, hOldBitmap);
// clean up
DeleteDC(hScrDC);
DeleteDC(hMemDC);
result:= hBitmap;
end;

procedure TForm1.FormShow(Sender: TObject);
Var
rect:TRect;
p:TPoint;
begin
rect:=ClientRect;
p:=ClientOrigin;
rect.left:=p.x;
rect.top:=p.y;
rect.bottom:=rect.bottom+p.y;
rect.right:=rect.right+p.x;
hbmp:=copyScreenToBitmap(rect);
inherited;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
bitmap:TBitmap;
rect:TRect;
begin
bitmap:=TBitmap.create;
bitmap.handle:=hbmp;
rect:=ClientRect;
canvas.draw(rect.left,rect.top,bitmap);
bitmap.handle:=0;
bitmap.free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject(hbmp);
end;

end.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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