全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:8816
推到 Plurk!
推到 Facebook!

怎麼讓panel變透明 (panel上的元件 要看的到^^")

尚未結案
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-06 17:00:02 IP:163.13.xxx.xxx 未訂閱
看到之前的程式 讓GroupBox變透明是成功的... __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { GroupBox1->Brush->Style=bsClear; SetWindowLong(GroupBox1->Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT); } 現在改成 __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Panel1->Brush->Style=bsClear; SetWindowLong(Panel1->Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT); } 失敗了-口- 沒有變透明耶0.0 要怎麼讓panel變透明QQ'
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
cmjlls
一般會員


發表:2
回覆:2
積分:0
註冊:2002-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-08 09:19:09 IP:61.220.xxx.xxx 未訂閱
我是自己做的啦。 1. TPanel上放個TImage 2. TImage->Align=alclient 3. 將TPanel->Paren的相對位置影像copy到TImage上 4. 在TPanel放置你的Controller 5. 完成
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-08 10:44:41 IP:163.13.xxx.xxx 未訂閱
引言: 我是自己做的啦。 1. TPanel上放個TImage 2. TImage->Align=alclient 3. 將TPanel->Paren的相對位置影像copy到TImage上 4. 在TPanel放置你的Controller 5. 完成
抱歉@@" 步驟3和4不太懂@@"
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-08 18:10:56 IP:210.243.xxx.xxx 未訂閱
給你一個範例, CPP檔我放在下一篇
// Unit1.h    //---------------------------------------------------------------------------    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include 
#include 
#include 
//---------------------------------------------------------------------------
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
執行結果
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-08 18:13:20 IP:210.243.xxx.xxx 未訂閱
//---------------------------------------------------------------------------    #include 
#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;  
}    
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-08 18:49:38 IP:211.76.xxx.xxx 未訂閱
......看到實力的差別了-口-"    我想再問幾個小問題@@     1.GroupBox1->Brush->Style=bsClear; SetWindowLong(GroupBox1->Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT); 此2句所表示的意思為何@@?    2.為何不能套用在Panel上?    3.事實上.....這段.. 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); } 看不太懂QQ"  好多沒看過的函式.....    4.剛剛用BCB5.0 測了一下.... 無窮迴圈啊><" panel內會一直閃..... 然後按鈕無用-口-" 發表人 - rik 於 2004/12/08 19:18:43
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-08 19:25:15 IP:211.76.xxx.xxx 未訂閱
.c //--------------------------------------------------------------------------- #include #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; } .h //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp> #include #include #include //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TPanel *bacl; TImage *Image1; TPanel *Panel1; TImage *Image2; TImage *Image3; TImage *Image4; TImage *Image5; TButton *Button2; TButton *Button3; 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 整體是 在panel bacl上 放有1張大圖(Image1) 然後 在其上 再放有panel panel1 <==目標想要他透明目標 然後 在panel1上 放有4張圖 (Image2~Image5) 會有無窮迴圈 式因為我用法錯誤嗎QQ?
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-08 21:22:41 IP:61.64.xxx.xxx 未訂閱
我直接把整個Project給你  http://home.so-net.net.tw/chiujihau/TransPanel.zip 我在Win2000, BCB5 試這個程式是沒問題的. 程式裡面用的API MSDN都可以找的到, 這麼多API要一一說明不如您自己去看比較快.
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-14 10:51:21 IP:163.13.xxx.xxx 未訂閱
引言: 我直接把整個Project給你 http://home.so-net.net.tw/chiujihau/TransPanel.zip 我在Win2000, BCB5 試這個程式是沒問題的. 程式裡面用的API MSDN都可以找的到, 這麼多API要一一說明不如您自己去看比較快. < face="Verdana, Arial, Helvetica"> 剛剛設時 發現 沒有無窮回圈^^ 但是....Panel上的圖案還是會一直閃@@" 有辦法讓他不閃嗎@@?
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-14 12:03:46 IP:210.243.xxx.xxx 未訂閱
引言:
引言: 我直接把整個Project給你 http://home.so-net.net.tw/chiujihau/TransPanel.zip 我在Win2000, BCB5 試這個程式是沒問題的. 程式裡面用的API MSDN都可以找的到, 這麼多API要一一說明不如您自己去看比較快. < face="Verdana, Arial, Helvetica"> 剛剛設時 發現 沒有無窮回圈^^ 但是....Panel上的圖案還是會一直閃@@" 有辦法讓他不閃嗎@@?
你試的是我放在網路上的Project嗎? 我試怎麼都不會閃呢?
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-14 23:25:45 IP:211.76.xxx.xxx 未訂閱
引言:
引言:
引言: 我直接把整個Project給你 http://home.so-net.net.tw/chiujihau/TransPanel.zip 我在Win2000, BCB5 試這個程式是沒問題的. 程式裡面用的API MSDN都可以找的到, 這麼多API要一一說明不如您自己去看比較快. < face="Verdana, Arial, Helvetica"> 剛剛設時 發現 沒有無窮回圈^^ 但是....Panel上的圖案還是會一直閃@@" 有辦法讓他不閃嗎@@?
你試的是我放在網路上的Project嗎? 我試怎麼都不會閃呢?
剛剛再家裡再試了一次 不會閃@@" 家裡是用BCB5.0 [沒閃] 學校是用BCB6.0.....[閃...""] 我因該不會開錯啊><" 因為整個視窗都不同-口-" [之前我自寫的 只有視窗 Panel 4張圖-口-"] 有可能5.0沒有的問題 跑去6.0會出問題嗎@@? 目前我還沒遇到過@@" (大概因為我還沒碰這麼久-口-") (明天去學校再試一次... 因該沒開錯><")
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-14 23:39:36 IP:61.64.xxx.xxx 未訂閱
引言: 有可能5.0沒有的問題 跑去6.0會出問題嗎@@? 目前我還沒遇到過@@" (大概因為我還沒碰這麼久-口-") (明天去學校再試一次... 因該沒開錯><")
應該不會吧!! 我用的API都是很基本的, 應該和BCB版本沒什麼關係....
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-15 10:52:54 IP:163.13.xxx.xxx 未訂閱
引言:
引言: 有可能5.0沒有的問題 跑去6.0會出問題嗎@@? 目前我還沒遇到過@@" (大概因為我還沒碰這麼久-口-") (明天去學校再試一次... 因該沒開錯><")
應該不會吧!! 我用的API都是很基本的, 應該和BCB版本沒什麼關係.... < face="Verdana, Arial, Helvetica"> .......還是閃了-口-" 在6.0真的會閃-口-" 有人知道為啥嗎= ="
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-12-15 13:07:23 IP:210.243.xxx.xxx 未訂閱
引言:
引言:
引言: 有可能5.0沒有的問題 跑去6.0會出問題嗎@@? 目前我還沒遇到過@@" (大概因為我還沒碰這麼久-口-") (明天去學校再試一次... 因該沒開錯><")
應該不會吧!! 我用的API都是很基本的, 應該和BCB版本沒什麼關係.... < face="Verdana, Arial, Helvetica"> .......還是閃了-口-" 在6.0真的會閃-口-" 有人知道為啥嗎= ="
呃 .....BCB6真的會耶..., 我試過了, >> class="code"> void __fastcall TForm1::NewPanelWndProc(Messages::TMessage &Message) { static BOOL bFlag = FALSE; PanelWndProc(Message); if (Message.Msg == WM_PAINT)// 攔截Panel的WM_PAINT, 並把背景畫上. { if (!bFlag) { bFlag = TRUE; SetPanelTransparent(Form1->Panel1, TRUE); } else bFlag = FALSE; } }
wsxcv123
一般會員


發表:36
回覆:27
積分:12
註冊:2004-11-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-12-15 19:14:29 IP:61.222.xxx.xxx 未訂閱
請問如果像這張圖 如何讓 Panel1 抓到真確的底圖呢?
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-12-15 20:55:07 IP:211.76.xxx.xxx 未訂閱
引言: 請問如果像這張圖 如何讓 Panel1 抓到真確的底圖呢?
Zard大哥的方法因該可以@@ [只要讓2個都變成透明@@?] Zard是這樣嗎-口-"?
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-12-16 09:35:12 IP:210.243.xxx.xxx 未訂閱
這樣變成Panel1還要在檢查它背後是否還有其它元件存在, 若存在則要抓該元件的圖, 以wsxcv123大大的例子來說, 就要找出Panel1和Panel2重疊處, 在取得重疊處Panel2的影像, 和form1的影像結合在一起. 這樣就更複雜了.    如果wsxcv123大大真的對這問題很有興趣請另開題目好嗎? 這問題已經拖很久了, 請別離題了
系統時間:2024-05-02 12:40:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!