我們生活在一個分辨率爆炸和娛樂至上的時代,每一天都有成千上萬的影像產出,隨著5G的即將鋪開,視頻必將成為主流傳播的媒體,我們也逐漸習慣用以影像為核心的手機記錄生活,也在更優秀的播放終端上看分辨率更高的片子,回想這十年,到底發生了什么。分辨率從VCD的352 * 240到家用電視支持4K,去組建家庭影院看大片,又將大部分時間投入給抖音、快手的540x960分辨率。
4k將給我們帶來什么?更清晰的畫質,一部平庸的作品鍍金,重制經典電影還是看過之后再也回不去的視頻感受,本文將通過三個不沖突的時光軸,帶著大家一起回憶我們的“看片”進化史,一起回憶古惑仔、PS2、電腦、迅雷、愛情動作片帶給我們的無限快樂和快感。
光盤時代“看片”,以播放機解碼,連接電視來播放,畢竟那個時代個人PC還未普及,手機還只能滿足通話、短信等基本功能,家庭娛樂方式還只是大頭電視,在娛樂單一的年代,能自主選擇的“看片”方式基本上有且僅有家庭播放機了。“看片”之光盤時代興起于娛樂單一的年代,隨著個人PC和移動終端的普及和發展,基本已經成了電影收藏愛好者的小眾了。
VCD,是Video Compact Disc的縮寫,VCD使用的也是CD光碟,容量大小與CD相當,
用,通過MPEG-1壓縮編碼來壓縮,解析度到達352 * 240﹙NTSC﹚或352 * 288﹙PAL﹚,雖大的視頻流是1.15Mbps,聲音格式則采用44.1KHz取樣頻率,16 Bit取樣值,播放出來的整個視頻質量和VHS錄像帶相當。MPEG-1壓縮編碼技術讓容量有限的 CD 中存入占用空間更大的視頻文件,讓存儲影片的戒指從錄像帶變換成為了CD光盤。
正是由于VCD出現時,電腦還沒能普及到家家戶戶,VCD需要播放機來播放,就像當年的錄像帶一樣,國人生產了VCD播放機,這也算是的高光時刻。伴隨而來的,“租碟”業務多了起來。
回想自己,小伙伴們去湊湊錢,中午放棄秀氣去VCD放映廳偷偷看《古惑仔》,那時候還是大頭電視,或者偷偷出去3元一小時去玩的索尼PS游戲機,用的也是CD光盤。VCD真的承載了80后一代“看片”和娛樂的無數回憶。
DVD全稱是“Digital Video Disc”也有稱為“Digital Versatile Disc”,不管怎么稱呼,都離不開“數字”的字樣,DVD可以看作是VCD的升級版,在面積幾乎同樣大小的光盤上,存儲容量從600多MB升級到了4.3GB。DVD分別采用MPEG-2技術和AC-3標準對視頻和音頻信號進行壓縮編碼,可以記錄135分鐘的圖像,畫面分辨率為720×480,碼率達到10Mbps,也就是說,DVD可存儲的視頻分辨率比VCD提高了四倍多,音效質量也有所提高,并支持外掛的字幕和聲道。
在實際生活中,VCD容量系限制了影片的質量,相比之下,DVD帶來容量的同時也帶來了影片更大的信息量,但對于國人來說,光盤看片時代的輝煌不得不說還是VCD時代,VCD播放機價格便宜,普及率高,“看片”成本極低。再后來DVD播放機、平板電視和等離子電視,以及家用PC的普及讓DVD“看片”時代也火了起來。
冷知識:索尼PS2使用的就是DVD光盤作為存儲介質,作為一款家用游戲機,自帶了DVD播放器,價格比DVD播放器便宜不少,你有沒有跟父母說PS2是DVD播放器,來“說服”自己的父母購買PS2呀。
你要說DVD承載的720×480分辨率過時了么?其實沒有,選擇很多網絡的小視頻都是等于或者低于這個分辨率的,放在手機屏幕上,看著也還可以。
DVD時代,是個人PC硬件發展告訴發展的時代,很多影像大廠經歷了VCD、DVD標準者之后,知道必將有一個標準和技術超過DVD成為新的存儲介質,也許他們沒有預測到硬盤會快速擴容降價,也許他們也沒有預測到互聯網提速來得這么快。
日本的兩大本土公司想到一塊去了,都想成為下一代光盤的制定者(是不是有點類似如今的5G之爭),索尼的BD(藍光)和東芝的HD-DVD(高清DVD),簡單的說容量不同,藍光是25GB,HD-DVD是15GB,本來兩家還能對抗一下,但由于某些市場的支持,東芝被迫終止HD DVD事業,我們現在能買到的收藏到的電影光盤,就是藍光制式的了。藍光光盤的容量一般可達到25-50G,這一巨大容量為高清電影的存儲帶來了方便,一般情況下,藍光電影的分辨率可達1080p(1920x1080)。目前已經有4K規格(3840x2160)的藍光電影光盤銷售。(引用自百度百科)
我們實際生活中用藍光BD或者HD-DVD光盤“看片”還是少了一些,原因是互聯網提速和個人PC興起,讓我們用再買一個播放機來播放這類光盤了。另外,冷知識,索尼PS3支持的就是藍光BD,當然索尼還是想如法炮制PS2的輝煌,通過PS新主機發布來進一步推廣BD,微軟的第2代家用游戲主機xbox 360支持的是HD-DVD。
個人PC電腦的普及,互聯網從撥號變成寬帶,讓電腦在線播放成為可能,細數十年前,前,其實已經早已進入互聯網在線“看片”的年代了,PPlive、PPS、風行在線播放很流暢,優酷和土豆還不是一家,迅雷還能什么都下載得到,快播還活在我們生活中。
早起我們用的PPLive、PPS、風行視頻播放軟件,其實是基于P2P(點對點)技術開發的軟件,也可以說P2P是一種加速技術,簡單的說,就是讓每個使用的客戶端都能提供資源,包括帶寬,存儲空間和計算能力,讓視頻在線播放不卡頓。
這類軟件其實就是互聯網上大規模視頻播放的共享軟件,通過P2P技術有效解決了當前網絡視頻點播服務的帶寬和負載有限問題,實現用戶越多,播放越流暢的特性。回想2005年的超級女聲決賽期間,在PPlive上觀看湖南衛視的有上萬觀眾,至于快播就不說了哈。
06年上大學,家里給買了一個聯想的酷睿雙核第一代的筆記本,后來我用它一邊窗口化玩跑跑卡丁車,一邊用PPlive小窗口右下角看電影,那時候還沒有什么版權不版權,點什么看什么。
剛剛提到了早期P2P視頻播放軟件,談到BT真的是無所不知道,BT技術讓玩高清、燒高清成為現實,其實BT、磁力鏈下載也是基于P2P的一種共享下載方式,BT是BitTorrent的簡稱,BT是一種文件分發協議,一個文件的下載者們下載的同時也在不斷互相上傳數據,磁力鏈接,簡單的說以"magnet:?xt=urn:btih:"開頭的字符串,就是一條磁力鏈接(你敢說第一個BT種子不是下載大姐姐嘛~)。
這里不得不提迅雷,因為迅雷將P2P技術優勢發揚光大,其實不應該吧迅雷和BT、磁力鏈接放在并列說,畢竟迅雷是一個下載軟件,BT和磁力鏈接可以算作協議,迅雷也可以下載BT種子和磁力鏈接。迅雷超越傳統HTTP/FTP下載工具(網際快車)也稱為必然,當時,還有很多類似迅雷的下載軟件,提幾個你們記得么,QQ旋風、VeryCD、電驢等等。冷知識:網際快車的大佬侯延堂因為迷戀魔獸世界,軟件停更了一年,下載速度和用戶體驗都在下降,最后你懂的。另外一個我想提一下vagaa,還有記得這個軟件的嘛。
回想,我們用迅雷,下載了多少電影,觀看了多少愛情片、動作片和愛情動作片,認識了多少大姐姐,讓我們學會了多少姿勢,是知識,反正我的硬盤是滿了。
但這類軟件最后還是沒落了,有的CEO甚至被判刑了,原因1:盜版電影代名詞,這種下載方式不用給廠商版權費,用戶之間互相共享;原因2:“黃色”資源法外之地,下載方式很難對內容進行監管,所以大姐姐不知不覺的就來了;原因3:太占太寬,上網吧的時候,有沒有偷偷掛迅雷或者電驢,然后被罵,誰TMD掛迅雷呢,占我網速,你懂的。這種P2P下載變成了高清發燒友下載資源的小眾下載方式。
記得迅雷鼎盛時期,優酷和土豆視頻流媒體還在對立,并且都未盈利,經常看著看著就卡了,騰訊還未涉足視頻,不過那時候真的沒有廣告。隨著人們越來越重視版權,國家監管也越來越嚴格,P2P在線視頻播放軟件帶頭沒落,P2P下載軟件也自檢自查也讓人們改變了下載免費“看片”的習慣。
這個時候,互聯網提速到了一個好的時代,在線視頻播放軟件也不再卡頓,各大視頻網站都盯住了版權這塊蛋糕,從免費到會員、從廣告到會員廣告,從會員到會員付費,我們開始還電影票了,逐漸形成了優酷、騰訊、愛奇藝“三足鼎立”的局面。
這里有一個好消息一個壞消息,隨著在線視頻播放技術的發展,在線播放已經支持HDR、4K(別管真假4K,至少清晰啦)、杜比等音視頻技術,加之我們的電腦顯示器分辨率、顯示效果越來越好,價格越來越低,“看片”更加清晰、更加爽快了。快消息是你的觀看設備可能還打不到2k呢。
從家用播放機到個人PC電腦,我們看片的終端也在變化,當年喬布斯拿著iPad走上舞臺,質疑聲很大,人們不知道iPad存在的意義,然而蘋果催生出來平板電腦也真正的打開了市場,一句“買前生產力,買后愛奇藝”道出了我們躺在床上用平板看片的快樂。然而,隨著手機屏幕越來越大,平板電腦的市場越來越萎縮,直到今日,京東首頁很難再找到華為、蘋果、微軟以外的平板電腦了,零星能看到酷比魔方、臺電、聯想等品牌。
回想起手機看片,印象很深,記得那時候是高中,省吃儉用買了一個諾基亞6600“胖6”,176×208的屏幕分辨率,在塞班論壇下載別人分享出來的3gp格式的,176×208分辨率的電影和愛情動作片,然后上課的時候偷偷的在書本后面“看片”,別提有多神氣了。再后來換了諾基亞N93i,分辨率提升到了240×320,但仍然沒有改變在論壇下載后再倒入內存卡的宿命。
后來大學快畢業了,買了一臺魅族m8,屏幕大小來到了3.4英寸,分辨率一下飆升到了480×720,要知道同期發布的iPhone 3Gs是3.5英寸屏幕,分辨率也只有480×320,從未有過的電容屏觸控和高分辨率,更加方便的直連電腦,windows ce系統讓魅族m8能夠解碼更多格式的電影,也能下載到在線視頻軟件了,在大學寢室,我用魅族m8連接wifi就可以“看片”,這種體驗真的變化超級大。
時間來到了智能時代,我用過太多的手機,微軟的、安卓的、IOS的,短短7-8年,手機技術突飛猛進,到了當下,我也正手握iPhone 11,寫下這篇文章。全面屏讓手機更加同質化,但不得不說,讓我們的屏幕更大更清晰,那邊sony手機賣的不咋地,但早早的除了2k屏手機,這頭蘋果iPhone 4先提出視網膜屏幕,那頭三星頂級oled屏幕不挺炫技……我們何嘗不是開始在手機上用著優酷、騰訊、愛奇藝“看片”。
“買前生產力,買后愛奇藝”,誠實的跟我說,你的平板是不是“看片最多”,我承認,我買第一代ipad的時候,就是當時在安卓平板上用瀏覽器看優酷啥的很費勁,在商場直接點開Safari就能看優酷,還能全屏。
最早用ios系統并不是iPhone而是iPad,畢竟那個時候iPhone還沒有魅族那么吸引我(其實是窮),iPad也一直追著買,出了更小的mini開始更新mini,拿著更便利,直到手機屏幕愈來越大,我的iPad mini也放在角落吃灰了。
巡禮我們的“看片”進化史,可以看作是CD -> VCD -> DVD -> BD 的光盤進化史,也可以看作是480p -> 720p -> 1080p -> 2k -> 4k的進化史,還可以看作是家用播放機+電視機 -> 個人PC帶腦 -> 平板電腦、手機的進化史。而如今播放技術已經達到 4k甚至8k,但又有多少人家里有4K電視卻未真正看過真4k的片源,認為優酷、騰訊、愛奇藝在線播放的就是真4k了。
寫這篇文章的時候,我的內心一直是糾結的,人們總是自相矛盾,分辨率不行的時候我們不停的追求分辨率,當分辨率達到一定水準時我們又在追求移動終端“看片”的便利性,有著大好片源不看,卻窩在手機里刷快手和抖音,也許正是網速、硬件、手機的發展撕碎了我們每個人的時間,碎片化時間的同時也碎片化了每個人。
但反過來想,無論是哪一個“看片”進化史,都承載著我們“看片”時無數的回憶,回憶最重要的也許不是看什么片和用什么看片,而是陪著我們一起“看片”的人,以及之后的分享。這樣想,我們只要追求共同的愛好,享受十年來科技進步帶來的進步就好,同時,也容許又一小部分人,組建家庭影院,沉寂在自己的小世界里和愛人一起“看片”吧。
(參數資料引用自百度百科,部分圖片引用自unsplash,文中時間點為熱點時間)
入行已經7,8年了,一直想做一套漂亮點的自定義控件,于是就有了本系列文章。
本系列文章將講解各種控件的開發及思路,歡迎各位批評指正。
此系列控件開發教程將全部在原生控件基礎上進行重繪開發,目標的扁平化、漂亮、支持觸屏。
如果有什么好的建議也可以評論留言來交流。
源碼地址:
GitHub:https://github.com/kwwwvagaa/NetWinformControl
碼云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果覺得寫的還行,請點個 star 支持一下吧
歡迎前來交流探討: 企鵝群568015492
http://toutiao.com/item/6824291838963220999/
前面介紹了那么多控件(雖然重要的文本框還沒有出現),終于輪到窗體上場了
首先我們需要一個基類窗體,所有的窗體都將繼承基類窗體
基類窗體需要實現哪些功能呢?
添加一個Form,命名FrmBase
寫上一些屬性
1 [Description("定義的熱鍵列表"), Category("自定義")]
2 public Dictionary<int, string> HotKeys { get; set; }
3 public delegate bool HotKeyEventHandler(string strHotKey);
4 /// <summary>
5 /// 熱鍵事件
6 /// </summary>
7 [Description("熱鍵事件"), Category("自定義")]
8 public event HotKeyEventHandler HotKeyDown;
9 #region 字段屬性
10
11 /// <summary>
12 /// 失去焦點關閉
13 /// </summary>
14 bool _isLoseFocusClose=false;
15 /// <summary>
16 /// 是否重繪邊框樣式
17 /// </summary>
18 private bool _redraw=false;
19 /// <summary>
20 /// 是否顯示圓角
21 /// </summary>
22 private bool _isShowRegion=false;
23 /// <summary>
24 /// 邊圓角大小
25 /// </summary>
26 private int _regionRadius=10;
27 /// <summary>
28 /// 邊框顏色
29 /// </summary>
30 private Color _borderStyleColor;
31 /// <summary>
32 /// 邊框寬度
33 /// </summary>
34 private int _borderStyleSize;
35 /// <summary>
36 /// 邊框樣式
37 /// </summary>
38 private ButtonBorderStyle _borderStyleType;
39 /// <summary>
40 /// 是否顯示模態
41 /// </summary>
42 private bool _isShowMaskDialog=false;
43 /// <summary>
44 /// 蒙版窗體
45 /// </summary>
46 //private FrmTransparent _frmTransparent=null;
47 /// <summary>
48 /// 是否顯示蒙版窗體
49 /// </summary>
50 [Description("是否顯示蒙版窗體")]
51 public bool IsShowMaskDialog
52 {
53 get
54 {
55 return this._isShowMaskDialog;
56 }
57 set
58 {
59 this._isShowMaskDialog=value;
60 }
61 }
62 /// <summary>
63 /// 邊框寬度
64 /// </summary>
65 [Description("邊框寬度")]
66 public int BorderStyleSize
67 {
68 get
69 {
70 return this._borderStyleSize;
71 }
72 set
73 {
74 this._borderStyleSize=value;
75 }
76 }
77 /// <summary>
78 /// 邊框顏色
79 /// </summary>
80 [Description("邊框顏色")]
81 public Color BorderStyleColor
82 {
83 get
84 {
85 return this._borderStyleColor;
86 }
87 set
88 {
89 this._borderStyleColor=value;
90 }
91 }
92 /// <summary>
93 /// 邊框樣式
94 /// </summary>
95 [Description("邊框樣式")]
96 public ButtonBorderStyle BorderStyleType
97 {
98 get
99 {
100 return this._borderStyleType;
101 }
102 set
103 {
104 this._borderStyleType=value;
105 }
106 }
107 /// <summary>
108 /// 邊框圓角
109 /// </summary>
110 [Description("邊框圓角")]
111 public int RegionRadius
112 {
113 get
114 {
115 return this._regionRadius;
116 }
117 set
118 {
119 this._regionRadius=value;
120 }
121 }
122 /// <summary>
123 /// 是否顯示自定義繪制內容
124 /// </summary>
125 [Description("是否顯示自定義繪制內容")]
126 public bool IsShowRegion
127 {
128 get
129 {
130 return this._isShowRegion;
131 }
132 set
133 {
134 this._isShowRegion=value;
135 }
136 }
137 /// <summary>
138 /// 是否顯示重繪邊框
139 /// </summary>
140 [Description("是否顯示重繪邊框")]
141 public bool Redraw
142 {
143 get
144 {
145 return this._redraw;
146 }
147 set
148 {
149 this._redraw=value;
150 }
151 }
152
153 private bool _isFullSize=true;
154 /// <summary>
155 /// 是否全屏
156 /// </summary>
157 [Description("是否全屏")]
158 public bool IsFullSize
159 {
160 get { return _isFullSize; }
161 set { _isFullSize=value; }
162 }
163 /// <summary>
164 /// 失去焦點自動關閉
165 /// </summary>
166 [Description("失去焦點自動關閉")]
167 public bool IsLoseFocusClose
168 {
169 get
170 {
171 return this._isLoseFocusClose;
172 }
173 set
174 {
175 this._isLoseFocusClose=value;
176 }
177 }
178 #endregion
179
180 private bool IsDesingMode
181 {
182 get
183 {
184 bool ReturnFlag=false;
185 if (LicenseManager.UsageMode==LicenseUsageMode.Designtime)
186 ReturnFlag=true;
187 else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName=="devenv")
188 ReturnFlag=true;
189 return ReturnFlag;
190 }
191 }
快捷鍵處理
1 /// <summary>
2 /// 快捷鍵
3 /// </summary>
4 /// <param name="msg"></param>
5 /// <param name="keyData"></param>
6 /// <returns></returns>
7 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
8 {
9 int num=256;
10 int num2=260;
11 bool result;
12 if (msg.Msg==num | msg.Msg==num2)
13 {
14 if (keyData==(Keys)262259)
15 {
16 result=true;
17 return result;
18 }
19 if (keyData !=Keys.Enter)
20 {
21 if (keyData==Keys.Escape)
22 {
23 this.DoEsc();
24 }
25 }
26 else
27 {
28 this.DoEnter();
29 }
30 }
31 result=false;
32 if (result)
33 return result;
34 else
35 return base.ProcessCmdKey(ref msg, keyData);
36 }
1 protected void FrmBase_KeyDown(object sender, KeyEventArgs e)
2 {
3 if (HotKeyDown !=null && HotKeys !=null)
4 {
5 bool blnCtrl=false;
6 bool blnAlt=false;
7 bool blnShift=false;
8 if (e.Control)
9 blnCtrl=true;
10 if (e.Alt)
11 blnAlt=true;
12 if (e.Shift)
13 blnShift=true;
14 if (HotKeys.ContainsKey(e.KeyValue))
15 {
16 string strKey=string.Empty;
17 if (blnCtrl)
18 {
19 strKey +="Ctrl+";
20 }
21 if (blnAlt)
22 {
23 strKey +="Alt+";
24 }
25 if (blnShift)
26 {
27 strKey +="Shift+";
28 }
29 strKey +=HotKeys[e.KeyValue];
30
31 if (HotKeyDown(strKey))
32 {
33 e.Handled=true;
34 e.SuppressKeyPress=true;
35 }
36 }
37 }
38 }
重繪
1 /// <summary>
2 /// 重繪事件
3 /// </summary>
4 /// <param name="e"></param>
5 protected override void OnPaint(PaintEventArgs e)
6 {
7 if (this._isShowRegion)
8 {
9 this.SetWindowRegion();
10 }
11 base.OnPaint(e);
12 if (this._redraw)
13 {
14 ControlPaint.DrawBorder(e.Graphics, base.ClientRectangle, this._borderStyleColor, this._borderStyleSize, this._borderStyleType, this._borderStyleColor, this._borderStyleSize, this._borderStyleType, this._borderStyleColor, this._borderStyleSize, this._borderStyleType, this._borderStyleColor, this._borderStyleSize, this._borderStyleType);
15 }
16 }
17 /// <summary>
18 /// 設置重繪區域
19 /// </summary>
20 public void SetWindowRegion()
21 {
22 GraphicsPath path=new GraphicsPath();
23 Rectangle rect=new Rectangle(-1, -1, base.Width + 1, base.Height);
24 path=this.GetRoundedRectPath(rect, this._regionRadius);
25 base.Region=new Region(path);
26 }
27 /// <summary>
28 /// 獲取重繪區域
29 /// </summary>
30 /// <param name="rect"></param>
31 /// <param name="radius"></param>
32 /// <returns></returns>
33 private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
34 {
35 Rectangle rect2=new Rectangle(rect.Location, new Size(radius, radius));
36 GraphicsPath graphicsPath=new GraphicsPath();
37 graphicsPath.AddArc(rect2, 180f, 90f);
38 rect2.X=rect.Right - radius;
39 graphicsPath.AddArc(rect2, 270f, 90f);
40 rect2.Y=rect.Bottom - radius;
41 rect2.Width +=1;
42 rect2.Height +=1;
43 graphicsPath.AddArc(rect2, 360f, 90f);
44 rect2.X=rect.Left;
45 graphicsPath.AddArc(rect2, 90f, 90f);
46 graphicsPath.CloseFigure();
47 return graphicsPath;
48 }
還有為了點擊窗體外區域關閉的鉤子功能
1 void FrmBase_FormClosing(object sender, FormClosingEventArgs e)
2 {
3 if (_isLoseFocusClose)
4 {
5 MouseHook.OnMouseActivity -=hook_OnMouseActivity;
6 }
7 }
8
9
10 private void FrmBase_Load(object sender, EventArgs e)
11 {
12 if (!IsDesingMode)
13 {
14 if (_isFullSize)
15 SetFullSize();
16 }
17 if (_isLoseFocusClose)
18 {
19 MouseHook.OnMouseActivity +=hook_OnMouseActivity;
20 }
21 }
22
23 #endregion
24
25 #region 方法區
26
27
28 void hook_OnMouseActivity(object sender, MouseEventArgs e)
29 {
30 try
31 {
32 if (this._isLoseFocusClose && e.Clicks > 0)
33 {
34 if (e.Button==System.Windows.Forms.MouseButtons.Left || e.Button==System.Windows.Forms.MouseButtons.Right)
35 {
36 if (!this.IsDisposed)
37 {
38 if (!this.ClientRectangle.Contains(this.PointToClient(e.Location)))
39 {
40 base.Close();
41 }
42 }
43 }
44 }
45 }
46 catch { }
47 }
為了實現蒙版,覆蓋ShowDialog函數
1 public new DialogResult ShowDialog(IWin32Window owner)
2 {
3 try
4 {
5 if (this._isShowMaskDialog && owner !=null)
6 {
7 var frmOwner=(Control)owner;
8 FrmTransparent _frmTransparent=new FrmTransparent();
9 _frmTransparent.Width=frmOwner.Width;
10 _frmTransparent.Height=frmOwner.Height;
11 Point location=frmOwner.PointToScreen(new Point(0, 0));
12 _frmTransparent.Location=location;
13 _frmTransparent.frmchild=this;
14 _frmTransparent.IsShowMaskDialog=false;
15 return _frmTransparent.ShowDialog(owner);
16 }
17 else
18 {
19 return base.ShowDialog(owner);
20 }
21 }
22 catch (NullReferenceException)
23 {
24 return System.Windows.Forms.DialogResult.None;
25 }
26 }
27
28 public new DialogResult ShowDialog()
29 {
30 return base.ShowDialog();
31 }
設計效果就是這樣的
一般來說,這個基類窗體不直接使用,不過你高興用的話 也是可以的 ,比如設計個圓角窗體什么的
如果你喜歡的話,請到 碼云或Github 點個星星吧