rik
一般會員
發表:40 回覆:81 積分:24 註冊:2004-09-24
發送簡訊給我
|
看到之前的程式 讓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
發送簡訊給我
|
我是自己做的啦。
1. TPanel上放個TImage
2. TImage->Align=alclient
3. 將TPanel->Paren的相對位置影像copy到TImage上
4. 在TPanel放置你的Controller
5. 完成
|
rik
一般會員
發表:40 回覆:81 積分:24 註冊:2004-09-24
發送簡訊給我
|
引言:
我是自己做的啦。
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
發送簡訊給我
|
給你一個範例, 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
發送簡訊給我
|
//--------------------------------------------------------------------------- #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
發送簡訊給我
|
......看到實力的差別了-口-" 我想再問幾個小問題@@ 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
發送簡訊給我
|
.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
發送簡訊給我
|
|
rik
一般會員
發表:40 回覆:81 積分:24 註冊:2004-09-24
發送簡訊給我
|
------ 時與不時的撿起身旁的拼圖碎片
不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天
這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
|
Zard
尊榮會員
發表:24 回覆:396 積分:539 註冊:2003-11-26
發送簡訊給我
|
引言:
引言:
我直接把整個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
發送簡訊給我
|
引言:
引言:
引言:
我直接把整個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
發送簡訊給我
|
引言:
有可能5.0沒有的問題 跑去6.0會出問題嗎@@?
目前我還沒遇到過@@" (大概因為我還沒碰這麼久-口-")
(明天去學校再試一次... 因該沒開錯><")
應該不會吧!! 我用的API都是很基本的, 應該和BCB版本沒什麼關係....
|
rik
一般會員
發表:40 回覆:81 積分:24 註冊:2004-09-24
發送簡訊給我
|
引言:
引言:
有可能5.0沒有的問題 跑去6.0會出問題嗎@@?
目前我還沒遇到過@@" (大概因為我還沒碰這麼久-口-")
(明天去學校再試一次... 因該沒開錯><")
應該不會吧!! 我用的API都是很基本的, 應該和BCB版本沒什麼關係....
>>< face="Verdana, Arial, Helvetica"> .......還是閃了-口-"
在6.0真的會閃-口-" 有人知道為啥嗎= ="
------ 時與不時的撿起身旁的拼圖碎片
不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天
這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
|
Zard
尊榮會員
發表:24 回覆:396 積分:539 註冊:2003-11-26
發送簡訊給我
|
引言:
引言:
引言:
有可能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
發送簡訊給我
|
請問如果像這張圖
如何讓 Panel1 抓到真確的底圖呢?
|
rik
一般會員
發表:40 回覆:81 積分:24 註冊:2004-09-24
發送簡訊給我
|
引言:
請問如果像這張圖
如何讓 Panel1 抓到真確的底圖呢?
Zard大哥的方法因該可以@@ [只要讓2個都變成透明@@?]
Zard是這樣嗎-口-"?
------ 時與不時的撿起身旁的拼圖碎片
不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天
這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
|
Zard
尊榮會員
發表:24 回覆:396 積分:539 註冊:2003-11-26
發送簡訊給我
|
這樣變成Panel1還要在檢查它背後是否還有其它元件存在, 若存在則要抓該元件的圖, 以wsxcv123大大的例子來說, 就要找出Panel1和Panel2重疊處, 在取得重疊處Panel2的影像, 和form1的影像結合在一起. 這樣就更複雜了. 如果wsxcv123大大真的對這問題很有興趣請另開題目好嗎? 這問題已經拖很久了, 請別離題了
|