home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 September
/
Chip_2001-09_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d123456
/
DFS.ZIP
/
DFSLayeredForm.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-06-28
|
14KB
|
357 lines
{$I DFS.INC} { Standard defines for all Delphi Free Stuff components }
{------------------------------------------------------------------------------}
{ TdfsLayeredForm v1.00 Beta 3 }
{------------------------------------------------------------------------------}
{ A TForm descendent that enables the new transparency features of windows in }
{ Windows 2000. This feature is not available on older Windows versions, i.e. }
{ Win95, Win98, NT 4. }
{ }
{ Copyright 2000-2001, Brad Stowers. All Rights Reserved. }
{ }
{ Copyright: }
{ All Delphi Free Stuff (hereafter "DFS") source code is copyrighted by }
{ Bradley D. Stowers (hereafter "author"), and shall remain the exclusive }
{ property of the author. }
{ }
{ Distribution Rights: }
{ You are granted a non-exlusive, royalty-free right to produce and distribute }
{ compiled binary files (executables, DLLs, etc.) that are built with any of }
{ the DFS source code unless specifically stated otherwise. }
{ You are further granted permission to redistribute any of the DFS source }
{ code in source code form, provided that the original archive as found on the }
{ DFS web site (http://www.delphifreestuff.com) is distributed unmodified. For }
{ example, if you create a descendant of TDFSColorButton, you must include in }
{ the distribution package the colorbtn.zip file in the exact form that you }
{ downloaded it from http://www.delphifreestuff.com/mine/files/colorbtn.zip. }
{ }
{ Restrictions: }
{ Without the express written consent of the author, you may not: }
{ * Distribute modified versions of any DFS source code by itself. You must }
{ include the original archive as you found it at the DFS site. }
{ * Sell or lease any portion of DFS source code. You are, of course, free }
{ to sell any of your own original code that works with, enhances, etc. }
{ DFS source code. }
{ * Distribute DFS source code for profit. }
{ }
{ Warranty: }
{ There is absolutely no warranty of any kind whatsoever with any of the DFS }
{ source code (hereafter "software"). The software is provided to you "AS-IS", }
{ and all risks and losses associated with it's use are assumed by you. In no }
{ event shall the author of the softare, Bradley D. Stowers, be held }
{ accountable for any damages or losses that may occur from use or misuse of }
{ the software. }
{ }
{ Support: }
{ Support is provided via the DFS Support Forum, which is a web-based message }
{ system. You can find it at http://www.delphifreestuff.com/discus/ }
{ All DFS source code is provided free of charge. As such, I can not guarantee }
{ any support whatsoever. While I do try to answer all questions that I }
{ receive, and address all problems that are reported to me, you must }
{ understand that I simply can not guarantee that this will always be so. }
{ }
{ Clarifications: }
{ If you need any further information, please feel free to contact me directly.}
{ This agreement can be found online at my site in the "Miscellaneous" section.}
{------------------------------------------------------------------------------}
{ The lateset version of my components are always available on the web at: }
{ http://www.delphifreestuff.com/ }
{ See DFSLayeredForm.txt for notes, known issues, and revision history. }
{------------------------------------------------------------------------------}
{ Date last modified: June 28, 2001 }
{------------------------------------------------------------------------------}
unit DFSLayeredForm;
interface
uses
Windows,
Forms,
Controls,
Graphics,
Classes;
// The new API stuff. It's not defined in Delphi 5, let's assume it will be in
// Delphi 6.
{$IFNDEF DFS_COMPILER_6_UP}
const
WS_EX_LAYERED = $00080000;
LWA_COLORKEY = $00000001;
LWA_ALPHA = $00000002;
ULW_COLORKEY = $00000001;
ULW_ALPHA = $00000002;
ULW_OPAQUE = $00000004;
AC_SRC_ALPHA = $1;
{$IFNDEF DFS_COMPILER_4_UP}
type
PBlendFunction = ^TBlendFunction;
{$IFDEF DFS_CPPB_3_UP} {$EXTERNALSYM _BLENDFUNCTION} {$ENDIF}
_BLENDFUNCTION = packed record
BlendOp: BYTE;
BlendFlags: BYTE;
SourceConstantAlpha: BYTE;
AlphaFormat: BYTE;
end;
TBlendFunction = _BLENDFUNCTION;
{$IFDEF DFS_CPPB_3_UP} {$EXTERNALSYM BLENDFUNCTION} {$ENDIF}
BLENDFUNCTION = _BLENDFUNCTION;
const
{ currentlly defined blend function }
{$IFDEF DFS_CPPB_3_UP} {$EXTERNALSYM AC_SRC_OVER} {$ENDIF}
AC_SRC_OVER = $00;
{$ENDIF}
{$ENDIF}
const
{ This shuts up C++Builder 3 about the redefiniton being different. There
seems to be no equivalent in C1. Sorry. }
{$IFDEF DFS_CPPB_3_UP}
{$EXTERNALSYM DFS_COMPONENT_VERSION}
{$ENDIF}
DFS_COMPONENT_VERSION = 'TdfsLayeredForm v1.00 Beta 3';
// The new APIs. They're declared as types here so we can have variables that
// hold the address of the real functions. This allows us to gracefully deal
// with systems that don't have these functions available.
type
TSetLayeredWindowAttributes = function(
hWnd: HWND; // handle to the layered window
crKey: COLORREF; // specifies the color key
bAlpha: byte; // value for the blend function
dwFlags: DWORD // action
): BOOL; stdcall;
{ This function is supposed to allow a lot more flexibility in the way things
work and better performance, but I've yet to figure out how to make it work.
If anyone has a working demo showing the use of this function, I'd love to see
it. C/C++ code is fine. }
TUpdateLayeredWindow = function(
hWnd: HWND; // handle to the layered window
hdcDst: HDC; // handle to screen DC
pptDst: PPoint; // new screen position
pSize: PSize; // new size of the layered screen
hdcSrc: HDC; // handle to surface DC
pptSrc: PPoint; // layer position
crKey: COLORREF; // specifies the color key
const bBlend: TBlendFunction; // value for the blend function
dwFlags: DWORD // action
): BOOL; stdcall;
type
TdfsLayeredForm = class(TForm)
private
FMousePassthrough: boolean;
FOpacity: byte;
FTransparentColor: TColor;
FUseOpacity: boolean;
FUseTransparentColor: boolean;
protected
function GetVersion: string;
procedure SetVersion(const Val: string);
procedure SetMousePassthrough(const Value: boolean);
procedure SetOpacity(const Value: byte);
procedure SetTransparentColor(const Value: TColor);
procedure SetUseOpacity(const Value: boolean);
procedure SetUseTransparentColor(const Value: boolean);
procedure UpdateLayeredAttrs; virtual;
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
published
property MousePassthrough: boolean read FMousePassthrough
write SetMousePassthrough default FALSE;
property Opacity: byte read FOpacity write SetOpacity default 128;
property TransparentColor: TColor read FTransparentColor
write SetTransparentColor default clWhite;
property UseOpacity: boolean read FUseOpacity write SetUseOpacity
default TRUE;
property UseTransparentColor: boolean read FUseTransparentColor
write SetUseTransparentColor default FALSE;
property Version: string read GetVersion write SetVersion stored FALSE;
end;
function SetLayeredWindowAttributes(
hWnd: HWND; // handle to the layered window
crKey: COLORREF; // specifies the color key
bAlpha: byte; // value for the blend function
dwFlags: DWORD // action
): BOOL;
{ This function is supposed to allow a lot more flexibility in the way things
work and better performance, but I've yet to figure out how to make it work.
If anyone has a working demo showing the use of this function, I'd love to see
it. C/C++ code is fine. }
function UpdateLayeredWindow(
hWnd: HWND; // handle to the layered window
hdcDst: HDC; // handle to screen DC
pptDst: PPoint; // new screen position
pSize: PSize; // new size of the layered screen
hdcSrc: HDC; // handle to surface DC
pptSrc: PPoint; // layer position
crKey: COLORREF; // specifies the color key
const bBlend: TBlendFunction; // value for the blend function
dwFlags: DWORD // action
): BOOL;
implementation
var
FDLLHandle: HINST;
FSetLayeredWindowAttrFunc: TSetLayeredWindowAttributes;
FUpdateLayeredWindowFunc: TUpdateLayeredWindow;
function SetLayeredWindowAttributes(hWnd: HWND; crKey: COLORREF; bAlpha: byte;
dwFlags: DWORD): BOOL;
begin
if assigned(FSetLayeredWindowAttrFunc) then
Result := FSetLayeredWindowAttrFunc(hWnd, crKey, bAlpha, dwFlags)
else
Result := FALSE;
end;
function UpdateLayeredWindow(hWnd: HWND; hdcDst: HDC; pptDst: PPoint;
pSize: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: COLORREF;
const bBlend: TBlendFunction; dwFlags: DWORD): BOOL;
begin
if assigned(FUpdateLayeredWindowFunc) then
Result := FUpdateLayeredWindowFunc(hWnd, hdcDst, pptDst, pSize, hdcSrc,
pptSrc, crKey, bBlend, dwFlags)
else
Result := FALSE;
end;
{ TdfsLayeredForm }
constructor TdfsLayeredForm.Create(AOwner: TComponent);
begin
FMousePassthrough := FALSE;
FOpacity := 128;
FTransparentColor := clWhite;
FUseOpacity := TRUE;
FUseTransparentColor := FALSE;
inherited;
end;
procedure TdfsLayeredForm.CreateParams(var Params: TCreateParams);
begin
inherited;
if not (csDesigning in ComponentState) then
begin
Params.ExStyle := Params.ExStyle or WS_EX_LAYERED;
if FMousePassthrough then
Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;
end;
procedure TdfsLayeredForm.CreateWnd;
begin
inherited;
UpdateLayeredAttrs;
end;
function TdfsLayeredForm.GetVersion: string;
begin
Result := DFS_COMPONENT_VERSION;
end;
procedure TdfsLayeredForm.Loaded;
begin
inherited;
UpdateLayeredAttrs;
end;
procedure TdfsLayeredForm.SetMousePassthrough(const Value: boolean);
begin
if FMousePassthrough <> Value then
begin
FMousePassthrough := Value;
if HandleAllocated and not (csDesigning in ComponentState) then
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_TRANSPARENT);
end;
end;
procedure TdfsLayeredForm.SetOpacity(const Value: byte);
begin
if FOpacity <> Value then
begin
FOpacity := Value;
UpdateLayeredAttrs;
end;
end;
procedure TdfsLayeredForm.SetTransparentColor(const Value: TColor);
begin
if FTransparentColor <> Value then
begin
FTransparentColor := Value;
UpdateLayeredAttrs;
end;
end;
procedure TdfsLayeredForm.SetUseOpacity(const Value: boolean);
begin
if FUseOpacity <> Value then
begin
FUseOpacity := Value;
UpdateLayeredAttrs;
end;
end;
procedure TdfsLayeredForm.SetUseTransparentColor(const Value: boolean);
begin
if FUseTransparentColor <> Value then
begin
FUseTransparentColor := Value;
UpdateLayeredAttrs;
end;
end;
procedure TdfsLayeredForm.SetVersion(const Val: string);
begin
{ empty write method, just needed to get it to show up in Object Inspector }
end;
procedure TdfsLayeredForm.UpdateLayeredAttrs;
var
Color: COLORREF;
Flags: DWORD;
begin
if HandleAllocated and (([csLoading, csDesigning] * ComponentState) = []) then
begin
if UseOpacity then
Flags := LWA_ALPHA
else
Flags := 0;
if UseTransparentColor then
begin
Color := ColorToRGB(TransparentColor);
Flags := Flags or LWA_COLORKEY;
end
else
Color := 0;
SetLayeredWindowAttributes(Handle, Color, FOpacity, Flags);
end;
end;
initialization
FDLLHandle := LoadLibrary(user32);
FSetLayeredWindowAttrFunc := GetProcAddress(FDLLHandle,
'SetLayeredWindowAttributes');
FUpdateLayeredWindowFunc := GetProcAddress(FDLLHandle,
'UpdateLayeredWindow');
finalization
FreeLibrary(FDLLHandle);
end.