運行版本(純借地兒發布)

附件: Puzzle_Quest_Launcher.rar (3033986 字節)

 
說明:
綠色,但是推薦解包到PQ的安裝目錄,不然會觸發首啟動配置。
 
需要.net 3.5 CLR~ Linq的原因~.net 2.0 跑不起來~
 
本來搞了一個 Publish的版本~但是 VS2008 亂七八糟的給我又是簽名又是安全認證又是CodeFusion的~最后還弄出一個巨大無比的安裝包來,于是~嗯~決定就這樣原版發布~


[B]Source Code:

附件: PuzzleQuestLauncher.rar (231424 字節)

 
VS 2008 + C#+ .net 3.5
 
[B]說明:

PQLauncher中嘗試了一種偶某日腦袋被門板擠了以后搗騰出來的 UI Layout Pattern~
仿照了在CSS流行以前的HTML頁面用表格的布局方式(主要偶玩不轉CSS,不然估計就是個Xml 控制布局的什么皮膚引擎之類的東東了):
Form上的分為很多個Panel,在Panel不工作的時候,會自動隱藏,其下方的Panel會自動收縮上來,Form本身也會跟著Panel的多少撐開或收縮。
Panel還支持模式對話框,當對話框顯示的時候,非對話框有關的Panel會自動變灰
 
實現:
Form 底層是一個 Fill Dock 的 Table Layout Panel,把 Form 分割成了很多行。
每行里有個Dock的 Panel,有普通的 Panel,也有 Central Layout Panel,(這個東東是偶高出來的,用了一個偶自己的Layout Engine)
Form、Table layout Panel 的 Row 都打開了Autosize,Mode 是 Grow&Shrink~目的在于保證不要的地方可以自動收縮隱藏起來。
 
 
關于Centrall Layout Panel:
作用: 自動把Panel內的控件居中。
說明: 本來可以手動干這事,不過偶說過偶素懶人,所以就弄個這玩意兒來了[/B]
 
關于Dialog模式
Form上的Panel的管理是通過UIPanel類和PanelManager類完成的。
每個Panel控件與UIPanel類實例一一對應,UIPanel在PanelManager處注冊。
UIPanel有子類DialogUIPanel,表示對話框的按鈕所在的Panel。
其可以關聯其他的UIPanel作為對話框的一部分
 
DialogUIPanel具有方法ShowDialog,用于顯示對話框。當對話框顯示時,將自動把除自己和自己所關聯的Panel意外的所有Panel變灰。直至用戶點擊了Ok,或者Canel按鈕~
 
PanelManager具有一個WaitDialogResult的方法,可以阻塞線程,直至當前對話框結束,并返回結果。
 
存在的問題和改進
由于是一個實驗性的產品,偶又很懶,所以采用了這種靈異無比的控件和管理代碼分離的方式實現(不然偶還得重寫一大堆的Panel控件,很麻煩的說)。
這種實現方式很方便,在設計界面時Panel上的控件布局很容易(前提是在VS的IDE里,通過控件布局對齊線,可以很方便的對其各控件)
但是由于所有的控件都在一個Form里面,EventHandler一多就會讓代碼會顯得非常凌亂(雖然我層層疊疊的不知道用了多少#region來把代碼分塊,但是看起來還是很不爽!),而且不同功能的Panel之間的代碼完全沒有隔離度破壞了不符合 高內聚,低耦合原則。
另外一個問題就是Dialog模式沒有棧,因此在一個Dialog現實出來的時候,不可能再彈出一個新的Dialog(事實上我有這樣的需求,在編輯Schema的時候,我就希望能再彈出一個MessageBox來,但是~目前的架構下~不可能)~
第三個問題,也是最麻煩的問題,Form控件要求Form的Height不能超過當前Screen的縱向分辨率N個Pixel。因此Form不能無窮大~當Panel太多的時候,麻煩就來了(事實上,我已經遇到了這個問題,只是沒有對我的工作造成太大影響而已)。
 
解決問題的關鍵在于把每個Panel都重新弄一個控件(就像App里的每個Form都是System.Windows.Forms.Form的一個子類一樣)。
然后建立一個容器Form,用Flow Layout Panel 替代 Table Layout Panel~然后動態加載各個panel到Form,這樣靈活性才能達到最高,隔離度也能達到最高。
 
在PanelManager中加入Panel的Enable狀態的棧(其實我的代碼里有類似的嘗試,就是關于SchemaList中關于操作CurrentSchema的。當然這里沒有自定義一個棧,而是隱性的利用了方法調用本身的調用棧)。每次ShowDialog時把當前Panel的狀態壓棧,然后顯示新Panel,之后再出棧(和調用函數時,保存現場的方式是一樣的,因此我之前才可能利用調用棧去保存CurrentSchema的狀態)。
 
 
That's all
Any qustion then Q me,MSN me, Fetion me, GTalk me, Mail me, Call me, Space me, and most important KICK ME!
 
THX.