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

如何去實作類似photoshop的圖層功能的管理機制

答題得分者是:暗黑破壞神
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-28 22:22:23 IP:59.117.xxx.xxx 訂閱
假設說我的程式內可供使用者畫的元件有三種,使用者在點選任一元件時,
其實是不知道其他元件在那的,但我可以利用BringToFront()或SendToBack()往前帶或往後帶
但程式要紀錄這個元件與別的元件之間的圖層關係
我要問的就是如何去實作類似photoshop的圖層功能的管理機制,才能使我下次開檔時
能在自動重畫給使用者畫的元件時,自動遵循元件與元件之間的圖層關係
也就是說我們程式要如何儲存那個元件在上,那個元件在下
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-01 16:29:43 IP:218.170.xxx.xxx 訂閱
每一個圖層都是”隱藏”的。
user 看到的都是那些隱藏圖層運算的結果。

這就是圖層的做法。
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-01 17:09:05 IP:59.120.xxx.xxx 訂閱
謝謝你的回覆
我知道是隱藏的,我現在自己實作也是如此
只是我現在自己想不透的我的程式要如何紀錄那個元件在上,那個元件在下
以及程式開啟後自動根據元件的上下來顯示
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-01 22:43:38 IP:218.170.xxx.xxx 訂閱
這就是資料結構了呀。
你在存檔時就要規畫
layerno, layerdata, layno, layerdata......
像這樣存就是一層一層存呀。
你自然就可以去讀出來時去知道它是第幾層。
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-02 15:27:56 IP:59.120.xxx.xxx 訂閱
或許我應該這樣子問,
我的程式是設計環境
當使用者在用我提供給他的元件在進行設計時
使用者可能會移到最上層或往下一層
那我應該要如何同步修改其他元件的上下層關係
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-02 20:44:43 IP:218.170.xxx.xxx 訂閱
不是回答過你了嗎?
如果你的圖層是這樣。
圖層1
圖層2
圖層3
那你要給USER看到的是這三個加起來的結果。
你不是回答你知道嗎?

那換個角度來看。當 user 要動到變成
2,1,3 的順序時。
你不也是依原來的方式來運算而已嗎?

===================引 用 文 章===================
或許我應該這樣子問,
我的程式是設計環境
當使用者在用我提供給他的元件在進行設計時
使用者可能會移到最上層或往下一層
那我應該要如何同步修改其他元件的上下層關係
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-03 08:15:03 IP:61.64.xxx.xxx 訂閱
我想你的回答他永遠聽不懂
由他一再問同樣的問題的狀況,可以想見他的設計能力,就是那樣了
不然也不會用 3 的元件,我的天阿,要是使用者開 20 個圖層,豈不要用 20 的元件
用元件,會有效能的問題,尤其是繪圖的圖層這種程式,最好不要用,可以的話自己畫,某部分自己呼叫指令集,這樣才會快

他還不懂什麼叫「山不轉路轉」
電腦麼,就是你說什麼它做什麼
一個元件就可以做所有的事了,所以他還停留在堆積木的階段,而且是重複一直堆到爛的那種
還有很大的進步空間,會不會進步,就看他自己的努力了

很多事情,是可以一蹴可及,但偏偏設計能力,就是不行

還見建議他去看資料結構的書,與設計概念的書先吧
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-03-03 09:47:12 IP:59.120.xxx.xxx 訂閱
我知道暗黑破壞神及syntax所指的是利用繪圖技巧在畫面上營造出圖層的效果
但我不是要問這個,這個技術我懂,

我之所以會用這麼多的元件,是因為我是開發一個設計環境,我提供使用者自行拉我所提供的元件在畫面上做控制或其他功能
所以使用者要拉幾個元件,我並不知道,且我所提供給使用者的元件數也不只一種,而我的程式也是設計成元件個數是無上限的,
所以我不可能用一個元件來做所有的事,而且我要做的事也不是繪圖(或許各位高手有不同的看法)
我所說的圖層或許不是像photoshop的功能,而是元件之間的堆疊管理
元件與元件之間有可能部份重疊,就像在bcb的form上一樣,所以我所提供給使用者的元件就有可能部份重疊,
我要問的是當某一個我所提供給使用者的元件選取往上一層,或往下一層時,自己這個元件當然可以往上一層或往下一層,
被異動的元件與相互重疊的元件之間的順序就必須一起修正
目前我想到的方法就是對所有在我提供給使用者的設計環境中的我所提供給使用者的元件進行scan,才能知道那些元件需要一起被修正
但我覺得這樣子太笨了,所以我才會問有沒有好方法

還是謝謝大家的回答,
如果大家覺得己經回答了,那也沒關係,我自己再想想看
可能我的程式功力真的很爛,在此致歉,我的表達能力也不好,不好意思,擔誤大家的時間

pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-03-03 10:04:10 IP:60.248.xxx.xxx 未訂閱
基本概念上就如前面大大所言沒錯啊,遊戲軟體的圖層概念也是這樣
在背景著繪
圖層1
圖層2
圖層3
合併到記憶體的緩衝區,然後一次輸出到顯像卡

這就是所謂DoubleBuffer ...flip

不過您要做到執行期拖拉元件擺放它的Z-Order次序,國外應該有現成的元件
http://www.greatis.com/delphicb/formdes/
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-03-03 10:26:44 IP:218.170.xxx.xxx 訂閱
其實。在點陣圖形處理上。你還要去了解什麼叫 MASK.
也就是在 photoshop 上頭。你看到的圖層上沒有圖的地方。
是以灰白格子相間的地方。那個地方可以做出”通透”的效果。
這個就是用 MASK 加上運算做出來的。
自己把影像處理的書再看一看。
你就會知道它是怎麼做的了。
也有人回答你用元件比較慢。
這是事實。只是你的程度還沒到脫離元件操作。
你先把元件操作學會了。再去修正成不用元件操作。這種方法也是不錯的。
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-03-03 10:50:30 IP:59.120.xxx.xxx 訂閱
我有去看TFormDesigner的demo
我的程式現在就是正在開發類似TFormDesigner的功能
但我不需要使用TFormDesigner
我就是要run-time去改變z-order的順序
而非繪圖
我也知道各位講的繪圖方式是對的
我也知道要用mask完成各圖形的推疊
我也知道繪圖用元件較慢,
但我要的功能不是要繪圖之間的堆疊

此外,我所提供的設計環境有開關,有儀表,有表格,有各種元件
全部改成非元件,我怎麼run time去供使用者產生??rum time去畫表格??rum time去畫儀表??
太累了
我現在就是要儀表,表格,開關之間的元件堆疊管理機制

對不起各位,雖然大家都認為已經講了正確答案,
但我還是腦袋沒轉過來,繪圖與我要的功能之間的關係
謝謝各位的指教,我會再加強我的程式能力,不好意思擔誤大家時間
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-03-03 12:21:09 IP:61.64.xxx.xxx 訂閱
--->  我現在就是要儀表,表格,開關之間的元件堆疊管理機制

這樣就簡單了,你想怎麼管理,就怎麼管理,依據你心裡想的,化成邏輯,變成程式
就這樣囉!你不試試,怎知道自己不行?一味要求別人給答案,不可能給你答案一輩子

你要自己做,最少你有試,這樣才有誠意,別人才會跟你說哪裡做的好,哪裡做好,這樣你才會進步

你連基本的嘗試都沒有,想幫也很難,幫的話就變成是我們的工作了,而不是你的

你以為回答問題的人都是只有輸出嗎?沒有來至提問者的回饋,就沒有學習,沒有學習,就沒動力回答
而回饋不是「你好神、你好棒」之類的廢話,回饋是能夠從問題中學習成長,不是只有你想變厲害!

最好的狀況是能變成一項討論,而不是像你這樣,連東西都沒有~

你想進步,就動手做吧!這裡所有人都會給你意見,但只有你能決定那個對你最好,但前提,你要先動手做
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-03-03 12:22:22 IP:218.170.xxx.xxx 訂閱
so what?
我再用更簡單的方式來反問你。
什麼叫元件。什麼叫 button?
它不過是在一個方框中的一張”圖”
你要去偵測你的 mouse 是不是在這個方框中。
你要去偵測目前 mouse click 時。是指在那個位置。
那個位置是屬於那個”元件”的範圍。
而所有的元件,都只有圖片。x1,y1,x2,y2 來標出來。
會有作用的是你在 x1,y1,x2,y2 這個範圍內的動作要用呼叫那個函數來處理。
會有重疊,我也知道。
這時候你要自己去排定 z order,你的視覺是由上到下。
你的 x1,y1,x2,y2 的比對就是由上一層一直比到最下層。
如果這個 mouse 座標 沒在任一個"元件" x1, y1, x2,y2 的範圍內
那就比它的下一層。

runtime 畫東西。也不過是像這樣處理而已。
不然你以為程式是怎麼寫的?

===================引 用 文 章===================
我有去看TFormDesigner的demo
我的程式現在就是正在開發類似TFormDesigner的功能
但我不需要使用TFormDesigner
我就是要run-time去改變z-order的順序
而非繪圖
我也知道各位講的繪圖方式是對的
我也知道要用mask完成各圖形的推疊
我也知道繪圖用元件較慢,
但我要的功能不是要繪圖之間的堆疊

此外,我所提供的設計環境有開關,有儀表,有表格,有各種元件
全部改成非元件,我怎麼run time去供使用者產生??rum time去畫表格??rum time去畫儀表??
太累了
我現在就是要儀表,表格,開關之間的元件堆疊管理機制

對不起各位,雖然大家都認為已經講了正確答案,
但我還是腦袋沒轉過來,繪圖與我要的功能之間的關係
謝謝各位的指教,我會再加強我的程式能力,不好意思擔誤大家時間
markov
中階會員


發表:55
回覆:135
積分:53
註冊:2003-12-01

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-03-03 12:52:09 IP:59.120.xxx.xxx 訂閱
謝謝大家的回答
我在寫程式之前習慣先思考怎麼做之後才去動手做
圖層這個部份我承認我還沒有去實作(但我程式的其他部份已經實作)
對不起,我原本只是想要一個hint而已,我並沒有要求大家幫我實作

我會自己再去想辦法排定z order
我原本只是想聽聽看有沒有什麼方法可以不用全部元件都去檢查一次是否在這個區域內
現在聽完暗黑破壞神的建議後,我知道怎麼做了

系統時間:2024-05-09 13:46:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!