台灣最大程式設計社群網站
線上人數
1108
 
會員總數:242929
討論主題:187836
歡迎您免費加入會員
討論區列表 >> C# >> 如何建立一透明的Window Form
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何建立一透明的Window Form
價值 : 10 QP  點閱數:6153 回應數:8

樓主

don
門外漢
0 2
32 3
發送站內信

我想建立一個透明的Form
但是只有form的backcolor是transparent的,在上面的東西不是透明的
但是form的backcolor不行設為transparent
若使用opacity,在form上的所有東西也會變透明
若使用transparencykey,所有的事件會穿過form
請問有人有解決方案嗎? 謝謝

搜尋相關Tags的文章: [ transparent form ] ,
本篇文章發表於2005-03-02 18:18
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

maduka
捐贈 VP 給 maduka 檢舉此回應
有個很簡單的方式
1.拉一個Panel在Form裡面,設定BackColor為紅色
2.拉一個Label在Panel裡面
3.設定Form的TransparencyKey為紅色
4.Run

試試看吧~^^
本篇文章回覆於2005-03-02 18:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

maduka
捐贈 VP 給 maduka 檢舉此回應
若是使用這種方式,放在panel上的控制項也會變透明
因為它的backcolor會跟著panel一起變

只要把控制項的backcolor改掉,不跟panel一樣就可以了
本篇文章回覆於2005-03-02 18:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

don
檢舉此回應
謝謝你
可是好像還是不行耶
我在透明區域按滑鼠,事件還是會傳到下面
我想做的事是在透明的form上用滑鼠畫東西
還有什麼方法嗎?謝謝
本篇文章回覆於2005-03-02 18:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
.net上面的背景透明的實作方式大約是像當年呼叫api裡面的CreateRectRgn
這種東西作出來的

背景透明, 其實就是直接看過去了..設定出一個區域, 讓表單根本不繪製, 或是讓背景重繪製
滑鼠遇到這個區域的時候, 事件是會直接給背景抓去的
所以您可以在透明表單中點選桌面的東西

所以, 先說明清楚需求是什麼喔
這樣比較好處理

ex: 若是想要在桌面塗鴨
建議在form裡面直接拉一個picturebox和桌面一樣大的
然後在Form1_HandleCreated事件裡面, 搶先在form畫出來以前先抓下桌面圖形
然後在Form1_Activated事件裡面, 確定form秀出之後, 把該圖形畫到picture上
然後在picture上面作畫...
畫完之後, 按下"存檔"(或是用timer邊畫邊存), 讓該picture的內容取代掉桌面(桌布)

以上是我亂想的啦, 不過剛剛實作過, 這方法可行...只是..這要幹嘛?!
除了耍寶好像沒有用哩

ex2: 還是只想耍寶, 要在表單作一塊透明, 並且可以處理滑鼠事件
這裡還是很多做法可以達到
同上先get到桌面圖形, 並在表單中想要透明的位置放一個picturebox, 裡面沒任何東西
然後依照表單所在位置, 從剛剛抓的桌面圖形裡面抓一塊填到picturebox裡面
這樣可以....偽造透明..^___^a
接下來您一定會了, 因為, 那個picturebox和原來一樣, 當然也可以處理任何事件
本篇文章回覆於2005-03-02 20:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
其實, 我覺得這種算是特殊需求, 在.net裡面應該也有方法可以直接作到的
印象中有看過
只是我比較熟練的就是vb6時代學到的一些技巧來作處理就是
本篇文章回覆於2005-03-02 20:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

don
檢舉此回應
謝謝你的回答

不過這個方法我也試過了,在桌面是靜態的時候,這個方法是可行的
當有一些動態的東西時,這方法就無效了;如果真的要的話,可能就要一直把圖copy上來
不過效果就不太好了

我想要的效果其實就是似類在螢幕前放一塊玻璃,我可以在這玻璃上畫上我想要的東西
原本螢幕裡的東西也都會透過玻璃讓我看到
本篇文章回覆於2005-03-02 22:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
最有價值解答

QQ的乖乖餃
捐贈 VP 給 QQ的乖乖餃 檢舉此回應
呃...好好玩的需求..
等我想一下喔...
不過...若真的想做到...
以我目前會的東西來說, 可能只剩下用api拼命的抓桌面這招^___^a

其實效果不會不好啊..每隔兩秒抓一次動態桌面...也還可以
另外..也可嘗試get到桌面的dc後, 為他create一個繪圖物件..直接對桌面畫圖如何..
反正利用getcursorpos等api一樣可以抓到滑鼠位置和按鈕
本篇文章回覆於2005-03-02 22:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Justice
檢舉此回應
版主maduka 的方法是可行的。
茲分享實作如下:
public SplashForm()
{
// ☆★ 使用表單和控制項的雙重緩衝以減少圖形重繪閃動 -- Added by Justice Lin 2017/12/12
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

// 使控制項可以支援透明背景色彩(必需先將控制項的BackColor先選系統AtiveBorder再選Web Transparent)
SetStyle(ControlStyles.SupportsTransparentBackColor, true);

InitializeComponent();

PictureBox spashPictureBox = new PictureBox();
spashPictureBox.Image = Resources.Welcome;

spashPictureBox.SizeMode = PictureBoxSizeMode.Zoom;
spashPictureBox.Dock = DockStyle.Fill;
this.Controls.Add(spashPictureBox);
this.StartPosition = FormStartPosition.CenterScreen;

/// ☆★ 使所有的控制項都對PictueBox spashPictureBox 背景圖片透明。
this.TransparencyKey = Color.Black;
spashPictureBox.BackColor = Color.Black;
}

本篇文章回覆於2018-07-25 11:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.