BCB中使TPanel透明

/*
从一个论坛发现的代码, 用代码是TPanel透明, 而不是重新写一个组件.
*/
// Unit1.h



//---------------------------------------------------------------------------



#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include <ExtCtrls.hpp>

#include <Buttons.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published:        // IDE-managed Components

    TButton *Button2;

    TButton *Button3;

    TImage *Image2;

    TPanel *Panel1;

    TLabel *Label1;

    TImage *Image1;

    TButton *Button1;

    TEdit *Edit1;

    TCheckBox *CheckBox1;

    void __fastcall Button2Click(TObject *Sender);

    void __fastcall Button3Click(TObject *Sender);

private:        // User declarations

public:                // User declarations

    __fastcall TForm1(TComponent* Owner);

    void __fastcall NewPanelWndProc(Messages::TMessage &Message);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif



//---------------------------------------------------------------------------

//unit1.cpp



#include <vcl.h>

#pragma hdrstop



#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

TWndMethod PanelWndProc;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

{

    Button2->Caption = "設為透明";

    Button3->Caption = "設為不透明";

    Button2->Enabled = TRUE;

    Button3->Enabled = FALSE; 

}

//---------------------------------------------------------------------------

void DrawParentImage(TControl* Control, TCanvas* DestCanvas)

{

    int iSaveIndex;

    TPoint Position;



    if (!Control->Parent)

    return;



    iSaveIndex = SaveDC(DestCanvas->Handle);

    GetViewportOrgEx( DestCanvas->Handle, &Position);

    SetViewportOrgEx( DestCanvas->Handle, Position.x - Control->Left,

        Position.y - Control->Top, NULL);

    IntersectClipRect(DestCanvas->Handle, 0, 0, Control->Parent->ClientWidth,

        Control->Parent->ClientHeight);

    Control->Parent->Perform(WM_ERASEBKGND, (int)DestCanvas->Handle, 0);

    Control->Parent->Perform(WM_PAINT, (int)DestCanvas->Handle, 0);

    RestoreDC(DestCanvas->Handle, iSaveIndex);

}



void SetPanelTransparent(TPanel* Panel, BOOL bTransparent)

{

    Graphics::TBitmap* MemoryBitmap = new Graphics::TBitmap;

    try

    {

    MemoryBitmap->Width = Panel->Width;

    MemoryBitmap->Height = Panel->Height;

    

    if (bTransparent) // 設為透明

    {

        // 把Panel背後的圖Copy到Memory Bitmap上.

        DrawParentImage(Panel, MemoryBitmap->Canvas);

    }

    else // 設為不透明

    {

        // 填滿Panel原始底色

        MemoryBitmap->Canvas->Brush->Color = Panel->Color;

        MemoryBitmap->Canvas->FillRect(Panel->ClientRect);

    }



    // 把Memory Bitmap 畫到Panel上.

    BitBlt( GetDC(Panel->Handle), 1, 1, Panel->Width - 2, Panel->Height - 2,

        MemoryBitmap->Canvas->Handle, 0, 0, SRCCOPY);



    // 避免TGraphicControl類的元件被清掉

    for (int i = 0; i < Panel->ControlCount; i++)

    {

        if (Panel->Controls[i]->Visible)

        Panel->Controls[i]->Refresh();

    }

    }

    __finally

    {

    delete MemoryBitmap;

    }

}



void __fastcall TForm1::NewPanelWndProc(Messages::TMessage &Message)

{

    PanelWndProc(Message);

    if (Message.Msg == WM_PAINT) // 攔截Panel的WM_PAINT, 並把背景畫上.

    SetPanelTransparent(Form1->Panel1, TRUE);

}



void __fastcall TForm1::Button2Click(TObject *Sender)

{

    // 設為透明

    // Subclass Panel1以處理WM_PAINT

    PanelWndProc = Panel1->WindowProc;

    Panel1->WindowProc = NewPanelWndProc;

    Panel1->Refresh();



    Button2->Enabled = FALSE;

    Button3->Enabled = TRUE;

}



void __fastcall TForm1::Button3Click(TObject *Sender)

{

    // 設為不透明

    // 還原Panel1原始的訊息迴圈

    Panel1->WindowProc = PanelWndProc;

    Panel1->Refresh();

    

    Button2->Enabled = TRUE;

    Button3->Enabled = FALSE; 

}



  • 0
    点赞
  • 0
    收藏
  • 1
    评论
1. 实验内容 用基本增量算法和Bresenham算法画直线 2.实验目的 1)理解在显示器上画图与在纸上画图的本质区别; 2)掌握直线的光栅扫描转换过程; 3)掌握不同算法绘制直线的思路和优缺点。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。 1. 实验内容 用正负法和Bresenham算法画圆弧 2.实验目的 1)掌握圆及圆弧的光栅扫描转换过程; 2)掌握不同算法绘制圆弧的技巧和优缺点。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。 1. 实验内容 用Cohen-SutherLand算法和liang _barsky算法进行线段裁剪 2.实验目的 1)理解裁剪的相关概念 2)掌握直线段的一般裁剪过程; 3)理解并掌握Cohen-SutherLand 算法的编码思想; 4)理解并掌握Liang_Barsky算法的参数化裁剪思想; 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁线段和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来; 6)裁剪过程可以重复进行。 1. 实验内容 用Sutherland-Hodgman算法进行多边形裁剪 2.实验目的 1)理解多边形裁剪与直线段裁剪的区别; 2)掌握多边形的裁剪过程; 3)理解并掌握Sutherland-Hodgman算法的裁剪思想。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁多边形和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)多边形被窗口的四条边裁剪的过程以及多边形顶点增删的过程要显示出来; 5)裁剪过程可以重复进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值