2015/1/1

【C#】製作不規則形狀的控制元件,以按鈕為例

Custom Button, Irregularly shaped control
製作一個不規則的控制元件(Non-rectangular Controls)相對不規則視窗較為複雜一點,但也只是要自己多敲一些代碼而已,在示範中會運用GraphicsPath類別與控制元件的Paint事件來製作一對鬥雞眼按鈕:
  1. 首先在Form中加入一個按鈕(Button)元件,在此把該按鈕命名為CustomButton,並把Text顯示文字清空(清空文字只是為了讓外觀較為乾淨,若有需要可以設定要顯示的文字內容),按鈕大小設定為100x50
  2. 幫此按鈕註冊Paint事件,在此事件中運用GraphicsPath生成一個物件並設定欲顯示圖樣路徑,最將此物件指定給按鈕的Region屬性即可。
    private void CustomButton_Paint(object sender, PaintEventArgs e)
    {
        System.Drawing.Drawing2D.GraphicsPath myGraphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
        myGraphicsPath.AddEllipse(new Rectangle(0, 0, 50, 50));
        myGraphicsPath.AddEllipse(new Rectangle(30, 35, 10, 10));
        myGraphicsPath.AddEllipse(new Rectangle(50, 0, 50, 50));
        myGraphicsPath.AddEllipse(new Rectangle(60, 35, 10, 10));
        CustomButton.BackColor = Color.Brown;
        CustomButton.FlatStyle = FlatStyle.Flat;
        CustomButton.FlatAppearance.BorderSize = 0;
        CustomButton.Region = new Region(myGraphicsPath);
    }
    
補充:

  1. GraphicsPath內建多種預設圖形,如:圓形、舉行、三角形,甚至是文字等,因此可以輕易透過疊加方式繪出各種客製化的形狀。
  2. 在GraphicsPath中的圖形疊加具有互斥或的效果,意思是如果兩個圖案有重疊到的區域會呈現挖空效果,但如果又有第三張圖片重疊上去,則三張圖片重疊的區域會被顯示。

2014/12/31

【C#】製作不規則的視窗

  在C#中要建立不規則視窗(Irregularly Shaped Window)非常簡單,只需要準備一張欲顯示形狀的底圖並修改幾個視窗屬性(Window Properties)即可完成:
  1. 設定FormBorderStyleNone

    可透過設定頁面完成設定或是直接撰寫程式
    FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    
  2. 指定BackgroundImage並依據需求設定BackgroundImageLayout
  3. 設定TransparentKey為底圖不要顯示部分的顏色,若使用範例圖片則設定為白色
  4. 到目前為止已經完成客製化的視窗介面,編譯並執行可以看到視窗呈現愛心形狀,心型以外區域可以顯示桌面內容,點選心型以外的區域也可不受限制
  因為一開始我們把FormBorderStyle設定為None,邊框都不顯示連帶的最上面的標題列與控制盒(最小、縮小、最大化按鈕)也一併被取消了,因此若需要相關控制必須自行增加相關按鈕實現,底下示範移動視窗功能:
  1. 切換到檢視程式碼視窗,在視窗類別中增加變數
    private Point mouse_offset;
    
  2. 增加MouseDown事件
    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        mouse_offset = new Point(-e.X, -e.Y);
    }
    
  3. 增加MouseMove事件
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouse_offset.X, mouse_offset.Y);
            Location = mousePos;
        }
    }
    
  4. 若不是透過屬性視窗新增事件,記得自己手動加入事件註冊
    this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
    this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
    
  完成上述步驟後,此視窗就可以透過滑鼠左鍵拖曳進行移動了!

範例用圖:

2014/11/6

國父紀念館

  國父紀念館可說是陸客到台北市的必訪景點之一,從國父紀念館可以直接看到101大樓,兩個景點非常靠近,很多大陸團行程應該是早上到國父紀念館參觀接著就到101吃鼎泰豐到觀景台遠眺台北市景吧!

  國父紀念館外的走廊常常會被學生團體用來排練活動。

到國父紀念館參訪重要行程就是瞻仰國父雕像,跟中正紀念堂一樣雕像兩旁會有儀隊站崗,整點一到會有交接表演活動,很多遊客會在20分鐘前就先來卡位等候表演,若想觀賞表演的話可不能等到整點才到。

面對國父雕像右邊進去是東室,主要陳列國父生平相關史蹟,一進去會看到整片牆的建國大綱十分壯觀。

天花板則以國徽裝飾,館內有志工提供導覽講解。

面對國父雕像左側為西室,主要介紹國父提倡的三民主義思維與民主體驗,也有志工可做導覽解說。

西室有設置模擬投票所,可以體驗投票的感覺。

另外值得一提的是,國父紀念館也常是台灣影視娛樂三大獎(金馬獎、金鐘獎與金曲獎)的頒獎地點,時間來對的話說不定還可看到繽紛絢麗的星光大道!

2014/10/17

中正紀念堂

  中正紀念堂跟兩廳院(國家戲劇院和國家音樂廳)一起組成一個園區,在地人多半是專程來看展覽或藝文演出比較多,近年開放陸客觀光中正紀念堂因兩岸之間的歷史因素成了陸客來台的必訪景點之一。
遊客到中正紀念堂參訪重點大略有三:
  第一不外乎爬上階梯到最上層瞻仰蔣總統銅像,並且跟兩旁的儀隊合影。
  其中天花板的藻井設計並嵌入國徽也是很具特色的設計。
第二就是到一樓參觀文物陳列,從蔣總統用過的家具、衣著到行書公文都可以一窺究竟,連當年的總統座車都被收藏在此展覽。
第三個重點則是等到整點時到銅像廳堂觀賞儀隊的交接表演,儀隊從上午九點到下午五點每小時都會有交接儀式,很多人會把這表演視為旅遊重點呢!

  巧思的設計:
  紀念堂走上去到銅像大廳的階梯總共是89階,這數字表示的是蔣總統89歲高壽。
兩廳院分別坐落在中正紀念堂對出去的左右兩側,其形狀從天空俯瞰恰好是一個雙十的示意,表示中華民國的建國紀念日(10月10日)。
園區還有一個重要地標:自由廣場,當年野百合學運的發生地點,在台灣歷史上占據重要的篇章。

2014/8/20

高空彈跳(Bungy Jumping)

今年五月原本只是跟朋友約好去桃園兩日遊,不小心就加了一個高空彈跳行程,原本想說作個好咖跟大家一起報名,結果當天才知道只有三分之一的人報名。。。頭都洗一半了只好硬著頭皮排隊跳樓(不對,是跳橋。其實是因為錢都繳了,不跳實在很浪費)

一到大漢橋,往下一看不妙!跟想像的完全不一樣,溪裡沒什麼水,石頭倒是很多,如果一個不小心應該就是七天後回家了耶。去之前還在想上半身會不會進到水裡之類的,看來都是多想的。。。
在桃園大漢溪跳的高度是72公尺,一樓3公尺來算大概就是24樓高!

教練在把人推下去之前會先幫忙綁好繩子並作扣環的檢查(這是廢話),沒問題後就會要你站到橋邊上頭,跳之前會再一次口頭確認心理狀態準備好沒,當天有人太緊張被請下來(所以除非說準備好了,不然應該是不會硬推)。

三。二。一倒數完就是個人武術天份了,可以像這樣大鹏展翅帥帥的。。。掉下去

也可以像這樣緊握拳頭任由地心引力快速把人給吸下去

整個過程其實滿舒服的,有幾點心得:

  1. 人生跑馬燈其實沒有出現
  2. 真正讓人冒冷汗的時間點是在第一次彈起來又往下那一瞬間(因為心理沒預期會有第二個自由落體)
  3. 男人的第二個生命體並沒有傳說中的痛
  4. 鞋要穿緊,或是赤腳(同行友人就把剛買一個月的新鞋送給河神了,但這裡的河神沒這麼勤勞上來問你掉的是臭鞋還是金鞋,所以誠實的人也沒辦法拿回鞋子)
在下面擺盪一陣子後,教練會放一條鋼索下來,自己扣好後就會慢慢的被拉上來,爬上橋後就完成一次高空彈跳啦!

最後會領到一個挑戰證書,跟一張會員卡(下次跳有優惠),這次打卡有多送一個手環。還滿不錯的紀念!

2014/8/18

【Python】print不換行作法

網路上網路上Google:python print no new line,可以得到很多的討論串,多數會將Case分成python3與先前版本兩種來解決這問題,先看看這兩種作法(最後探討各版本間相容的作法):
  1. python3的作法
    1
    2
    print('Hello World', end='')
    print(', Same Line')
    
  2. 早期版本的作法
    1
    2
    print('Hello World'),
    print(', Same Line')
    
上面二分法的解決方法在能確保選定python版本後就不會作修改的情況下,一切都能運作正常不會發生"意外"。但實際上,在程式開發中很多臭蟲都是在這一念之間埋下惡果的!

在知道有版本相容性問題時,最好方法還是得找個兩全其美的方案會好些,參考下面思緒決定第三種解決方案:
  • 查閱手冊發現2.1版以後增加了Lib/__future__.py模組:在遇到換行的問題上可透過引入此模組的print_function讓2.1到2.X版都能使用python3的解法。
  • 但如上述所說必須2.1以後版本才支援此模組,稍微查了一下python2.1大約是2001年finally release的,掐指一算離現在大概也13年了,再查看手邊系統環境python版本是2.7。
  • 考量上述兩點,遇到2.1以前的版本機率應該遠小於之後更新python版本到3.X甚至更之後版本,因此採用第三種解決方法應該會是比較好的選擇。
1
2
3
4
from __future__ import print_function

print('Hello World', end='')
print(', Same Line')

2014/8/6

巴里島‧人

  前陣子聽了關於旅遊與攝影的演講,體認到旅行中文化體驗很重要的一環就是與當地人有互動,這次到巴里島便試著開口與當地人有些互動,確實讓旅行增添了很多樂趣與回憶!

  下面這張照片是在象洞(Goa Gajah)遇到的小兄妹,他們正一起享用午餐?鼓起勇氣說了Hello,回了我靦腆的笑容,接著用按快門手勢比著手機說Can I?小弟弟點點頭舉起了YA擺了個Pose給我拍。

  把手機的照片拿給他們欣賞,小妹妹接著拿起湯匙放在嘴巴,眼睛變看著鏡頭,顯然很有做Model的天分!

  下面這張照片是在Jatiluwih梯田(Jatiluwih Rice Terrace)拍的,這裡的人滿有趣的,看到你有拿拍照機器只要彼此有Eye Contact後,他們就會擺一個帥氣的姿勢定格,等待你按下快門,彼此Hello打個招呼發現他們也不太能說英文後就用笑容結束了這短暫的交流囉。

跟這YES小女孩互動的過程很有趣。
我:Hello, Can I have a picture for you?
小女孩:Yes!
說完擺了個YA讓我拍完照片。
我:You are so beautiful. What's your name?
小女孩:Yes!
我(揮手狀):Thank you, bye bye!
......好吧,原來我們剛剛成功完成拍照交流,是透過肢體語言成功的,我想因為這梯田已經成為重要觀光景點,大人可能教他們回應外來遊客都說Yes吧!

  在準備離開梯田前,不小心和這位阿伯Eye Contact到了,立馬拿起鐮刀擺起這帥氣姿勢,這下不拍可就尷尬了,所以有了下面這張照片。

  在塔曼阿雲寺(Pura Taman Ayun)裡有個亭子,有兩位畫家正在進行創作,原本看他們很專注不好意思上前打擾,但他們的畫像其實很漂亮,外面繞了又繞決定上前問問能不能拍照,得到的回應是:Of course。這次應該是真的用語言完成交流了吧!

  在水神廟遇到放風箏(很厲害,他們自己做的)的小男生們,一樣用手比著手機作勢拍照樣:Can I?得到了一個鬼臉定格。

友人問Can I?但沒做出拍照手勢,得到了這個No的鬼臉,猜想應該是以為要借風箏玩吧!

  這小鬼很皮,在拍照過程一直用風箏線要把我頭上帽子勾下來。

  這張是在飯店Check in時拍的,問他能不能拍,用滿標準英文回應:Sure。但臉上似乎有一點點的無奈感,當時是晚上八點左右。隔天早上七點多到大廳吃早餐發現他已經在那邊咚咚咚,終於明白他那臉上的疲累感是怎麼來的......

  在巴里島還能看到很多東南亞國家人民必備技能:頭頂工夫。這技能實在是一絕,而且不論男女老少都具備,連我們司機都很得意的說我也會喔!


  最後我決定把這兩隻猴子也歸為人,看看這猴子在懸崖邊惆悵的望著印度洋,眼神深的像是裝進了全世界的憂愁般,都想把張老師熱線抄給牠了。
  地點:烏魯瓦圖懸崖廟(Pura Luhur Uluwatu)。

  這隻坐在垃圾桶旁的也是,像是吞進多少的委屈悶在心頭似的。