1. 程式人生 > >delphi 異形窗體可半透明

delphi 異形窗體可半透明

unit xDrawForm;

interface
  uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus,
  Graphics,GDIPOBJ,GDIPAPI,GDIPUTIL;


type

  TwwGDIImage = class
  public
    n_Pos_X : Integer;
    n_Pos_Y : Integer;
    n_Width : Integer;
    n_Height : Integer;
    GPImageNormal : TGPImage;

    procedure CreateImageNormal(wsFileName: WideString;nPosX,nPosY,nW,nH:Integer);
  end;

  TwwGDIButton = class(TwwGDIImage)
  public
    GPImageHot : TGPImage;
    GPImageDown : TGPImage;
  end;


  TwwCanvas = class(TObject)
  private
    m_hdcMemory: HDC;
    hdcScreen: HDC;
    hBMP: HBITMAP;
    m_Blend: BLENDFUNCTION;
    // 事件
    FGPGraph: TGPGraphics;
    FOnDrawImage: TNotifyEvent;

    procedure BeginDraw(); // 繪圖前置工作
    procedure EndDraw(Handle:THandle);   // 繪圖收尾工作
   public
    sizeWindow: SIZE;
    ptSrc: TPOINT;
    n_Handle : THandle;
    procedure RePaint(h:THandle);
    procedure InitCanvas(nx,ny:Integer);
    procedure wwDrawImage(wwGDIImage :TwwGDIImage);
    property GPGraph: TGPGraphics read FGPGraph write FGPGraph;
    property OnDrawImage: TNotifyEvent read FOnDrawImage write FOnDrawImage;
  end;


implementation

{ TwwCanvas }

procedure TwwCanvas.BeginDraw;
begin
  // 獲取桌面螢幕裝置
  hdcScreen := GetDC(0);
  // 建立一個與指定裝置相容的記憶體裝置上下文環境(DC)
  m_hdcMemory := CreateCompatibleDC(hdcScreen);
  // 建立與指定的裝置環境相關的裝置相容的點陣圖
  hBMP := CreateCompatibleBitmap(hdcScreen, sizeWindow.cx, sizeWindow.cy );
  // 選擇一物件到指定的裝置上下文環境中,該新物件替換先前的相同型別的物件
  SelectObject(m_hdcMemory, hBMP);
  // 建立畫布
  GPGraph := TGPGraphics.Create(m_hdcMemory);
end;

procedure TwwCanvas.wwDrawImage(wwGDIImage: TwwGDIImage);
begin
  GPGraph.DrawImage(
  wwGDIImage.GPImageNormal,
  wwGDIImage.n_Pos_X,
  wwGDIImage.n_Pos_Y,
  wwGDIImage.n_Width,
  wwGDIImage.n_Height)
end;

procedure TwwCanvas.EndDraw(Handle:THandle);
begin
  //  設定窗體風格
  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  //  執行透明混合
  UpdateLayeredWindow(Handle, hdcScreen, nil,@sizeWindow, m_hdcMemory, @ptSrc, 0, @m_Blend, ULW_ALPHA);
  //  設定窗體位置
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

  // 各種釋放就對了.. 不然畫起來會糊
  GPGraph.ReleaseHDC(m_hdcMemory);
  ReleaseDC(0, hdcScreen);
  hdcScreen := 0;
  DeleteObject(hBMP);
  DeleteDC(m_hdcMemory);
  m_hdcMemory := 0;
  GPGraph.Free;
end;

procedure TwwCanvas.RePaint(h:THandle);
begin
  if Assigned(FOnDrawImage) then
  begin
    BeginDraw();
    FOnDrawImage(Self);
    EndDraw(h);
  end;
end;

procedure TwwCanvas.InitCanvas(nx, ny: Integer);
begin
  m_Blend.BlendOp := AC_SRC_OVER; //   the   only   BlendOp   defined   in   Windows   2000
  m_Blend.BlendFlags := 0; //   Must   be   zero
  m_Blend.AlphaFormat := AC_SRC_ALPHA; //This   flag   is   set   when   the   bitmap   has   an   Alpha   channel
  m_Blend.SourceConstantAlpha := 255;

  sizeWindow.cx := nx;
  sizeWindow.cy := ny;
  ptSrc := Point(0,0);
end;

{ TwwGDIImage }

procedure TwwGDIImage.CreateImageNormal(wsFileName: WideString;nPosX,nPosY,nW,nH:Integer);
begin
  Self.GPImageNormal := TGPImage.Create(wsFileName);
  Self.n_Pos_X := nPosX;
  Self.n_Pos_Y := nPosY;
  Self.n_Width := nW;
  Self.n_Height:= nH;
end;

end.





unit uMainForm;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GDIPOBJ,GDIPAPI,GDIPUTIL;


type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);


  private
    { Private declarations }
  public
    procedure DrawImage(Sender: TObject);
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation
uses xDrawForm;
var
  wwCanvas : TwwCanvas = nil;
  img_BackGround:   TwwGDIImage= nil;       // 背景圖
//  img_ProgressBar1:  TwwGDIImage= nil;      // 上滾動條
//  img_ProgressBar2:  TwwGDIImage= nil;      // 下滾動條
//  img_Lighting:     TwwGDIImage= nil;       // 閃光點


{$R *.dfm}


procedure TForm1.DrawImage(Sender: TObject);
begin
   TwwCanvas(Sender).wwDrawImage(img_BackGround);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  BorderStyle := bsNone;
  wwCanvas := TwwCanvas.Create();
  wwCanvas.InitCanvas(872,690);
  wwCanvas.OnDrawImage := Self.DrawImage;




  img_BackGround := TwwGDIImage.Create();
  img_BackGround.CreateImageNormal('BackGround.png',0,0,872,690);


end;


procedure TForm1.FormShow(Sender: TObject);
begin
  wwCanvas.RePaint(Self.Handle);
end;


end.

相關推薦

delphi 窗體透明

unit xDrawForm; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus, Graphics,GDIPOBJ,GDIPAPI,GDIPUTIL; ty

Windows介面程式設計第四篇 窗體 高富帥版

                    上一篇《》介紹了異形視窗(異形窗體)的建立,其主要步驟為——先通過建立點陣圖畫刷來做視窗的背景畫刷,再通過SetWindowLong為窗體加上WS_EX_LAYERED屬性,然後使用SetLayeredWindowAttributes指定視窗的透明色來完成視窗形狀的調整

Qt實現透明、無邊框、自由移動、不規則的窗體

先出示效果圖一張,如果不是讀者需要的,讀者可以看完效果圖之後就關閉本網頁啦。 功能要點 視窗無邊框 可自由拖動 背景透明度自定義 邊框可設定為異形 實現步驟                 第1步:新建一個QWidget的子類,這裡命名為BaseWidge

Qt開發:無邊框視窗,透明背景,移動

很多端遊的啟動器客戶端都是異形視窗,無邊框,自繪並重寫了最小化、最大化、關閉按鈕。本文具體講一下實現。 步驟: 1,設定視窗透明度、視窗無邊框樣式、視窗背景透明。 2,準備ps過的帶透明通道的不規則png圖片,設定為視窗背景。 3,重寫滑鼠事件實現視窗移動。 看效果:

製作透明漸顯窗體

實現效果:      知識運用:   窗體的Opacity屬性  用來獲取或設定窗體的不透明度級別   public double Opacity{ get; set; } 屬性值:窗體的不透明度級別預設為1.00 透明為0 實現程式碼: private void timer

四周透明陰影邊框的窗體要怎麼做

一.spring的資料訪問哲學 1. Srping的目標之一就是允許我們在開發應用程式的時候,能夠遵循面向物件(Object Oriented,OO)原則中的"針對介面式程式設計"; 講道理現在市面上的所有專案都離不開介面,針對介面是面向物件的重要特徵之一,而spring的最

Delphi

function ToDBC( input :String):WideString;varc:WideString;i:Integer;beginc := input;for i:=1 to Length(Input) dobeginif (Ord(c) = 12288) thenbeginc := chr(

Windows介面程式設計第二篇 透明窗體

                Windows介面程式設計第二篇半透明窗體    上一篇《Windows介面程式設計第一篇 點陣圖背景與點陣圖畫刷》介紹了通過WM_CTLCOLORDLG訊息來來設定對話方塊的背景以及點陣圖畫刷的使用。本篇將介紹動態調節窗體透明度的方法。    調節窗體透明度可以先使用SetW

使用z-index和position:absolute實現DIV覆蓋和重疊,實現透明背景,上邊漂浮一層不透明的div層。

Div的重疊和覆蓋可以使用z-index和position:absolute決定定位來實現,具體實現程式碼如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3

Qml實用技巧:在視元素之前透明覆蓋一個視元素,阻止滑鼠透(介面)傳(防止點選到被遮擋的按鈕)

需求         需要一個半遮擋的介面,遮擋住原來的介面,因為把用來被遮擋的介面寫成了元件,所以將其設定為需要遮擋的介面的子物件 BUG         每次點選後面和前面的按鈕都可以觸發,如下: Item { Rectangle { wi

Delphi 視窗透明

//    function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//函式

QT實現無邊框透明窗體

很簡單,兩行程式碼: setWindowFlags(Qt::Window|Qt::FramelessWindowHint| Qt::WindowStaysOnTopHint|Qt::Tool|Qt::X11BypassWindowManagerHint);   this-&

Windows介面程式設計第二篇透明窗體

上一篇《Windows介面程式設計第一篇 點陣圖背景與點陣圖畫刷》介紹了通過WM_CTLCOLORDLG訊息來來設定對話方塊的背景以及點陣圖畫刷的使用。本篇將介紹動態調節窗體透明度的方法。     調節窗體透明度可以先使用SetWindowLong為窗體加上WS_EX_LA

Qt圓角窗體+透明背景+右下角顯示(移除窗體標題欄+置頂+不在工作列顯示)

現在轉到Qt這塊,很多東西使用起來確實像是到了另一個世界,特別是一些錯誤起初讓人百思不得其解,比如bool型別的全域性變數,你如果不先給它初始化一下,後面會出現一些非常莫名其妙的問題,別想當然的認為bool值預設就是false 最近剛好用到了如何對窗體設定圓角,如何設定透明

(WPF) 透明窗體

<Grid Name="Grid_Login" Opacity="0" Width="{Binding Width, ElementName=w}" Height="{Binding Height, ElementName=w}"> <B

(一)C# Windows Mobile 透明窗體

Windows Mobile,個人心中臻至完美的系統。 不忍自己對WM的鑽研成果消逝,故留作紀念。   系列開篇,便是一個曾令自己困擾很久的問題:如何實現半透明窗體。 如果瞭解Win32程式設計,其實很簡單。 主要用到了三個方法: SetLayeredWindowAttributes GetWin

河南省第六屆大學生程序設計競賽--

con -s pad space 傳感器 math.h 水題 amp 歷史 異 形 卵 Time Limit: 1 Second Memory Limit: 64 MB Description 我們探索宇宙,是想了解浩瀚星空的奧妙,但我們卻非常少意識到宇宙

bootstrap輪播圖 兩側透明陰影

class 搜索 cit spa 再看 0.00 line rst one 用bootstrap輪播圖:Carousel插件,圖片兩側影音實在礙眼,想去掉,首先發現有css裏由opacity: 0.5這個東西來控制,全部改成opacity: 0.0,發現指示箭頭也看不見了。

MFC + CxImage 實現自繪透明按鈕

processor 專用 win dword ssa ont false set 技術 btn.h [cpp] view plain copy #pragma once // CBtn #include "ximage

【bzoj3281】最大或和 持久化Trie樹

log pac 序列 str char s pan pri scan bool 題目描述 給定一個非負整數序列 {a},初始長度為 N。 有M個操作,有以下兩種操作類型:1、A x:添加操作,表示在序列末尾添加一個數 x,序列的長度 N+1。2、Q l r x