c#实现winform窗体逐渐显示效果,这个博客园里面已经有其它人已经实现了,原理很简单,就是通过定时改变窗体的透明度(从0到1,即透明度从完全透明到不透明),我这里也是按照这个思路来实现的,但是我做的这个窗体是可复用的,即其它窗体继承自它后,就能实现渐显效果,代码如下:
, P: u+ N$ M2 \0 ]" N8 q2 w B3 dusing system;; |. Y2 _% O: {" [$ K
using system.componentmodel;
5 C# O. E- {+ v- ^" H, ^using system.windows.forms;
, y' {( Q+ w) L9 lnamespace tems.forms
" {2 u7 W# ^9 c$ A7 I' k{
. \7 x% |% b+ h3 ~public partial class formbase : form
, l4 n& [4 ]/ J E{) w9 j2 V; ]. }
private timer formtimer = null;4 l; V0 [; q) G2 P+ ]: ~8 Y
/// <summary>
+ u* U$ i- @2 S5 P. m9 b `- u/// 获取opacity属性
; i3 f9 I9 w V0 ^/ i& Y/// </summary>
% r& C* L6 ]% Z9 i[defaultvalue(0)]- I# u: P; M: _
[browsable(false)]
$ q, D/ A8 z7 R8 w# Z2 [public new double opacity) }* l. k' _9 B, H# N ?
{
$ B/ w# G7 a* ^5 [- xget { return base.opacity; }7 v, G# J. c6 u9 i
set { base.opacity = 0; }# l) U1 d* m6 u' v5 [) ^4 i1 F
}
& i2 Y5 F2 L. @: E( Upublic formbase()
/ Z1 w3 Z+ w" j5 V{
2 }- I; K/ F; y6 k& o! l' rinitializecomponent();
) f" Z' l) M! i5 O1 ]formtimer = new timer() { interval = 100 };
. {) o% [: ]6 _formtimer.tick += new eventhandler(formtimer_tick);# y t/ e! N3 R! S: a# K6 l/ n7 m6 c
base.opacity = 0;" M: N% H$ y, z7 n' ]' P& }" C
}4 H& b# ^" f3 ] I/ O
private void formtimer_tick(object sender, eventargs e)
- C3 h" j3 ]9 ~' D{: c& }, H" E- U2 Q0 c9 l( ]
if (this.opacity >= 1)/ L+ }7 k1 i- r) q' |
{' c2 e3 {8 n8 `$ C$ t" i: @
formtimer.stop();) r- w h: p$ ]" ~# R) K% {
}
+ d( @: m8 s9 b: telse) {' X* D7 Q2 P# H4 n* x; O, V G
{
3 N5 s$ F# {! G" i; hbase.opacity += 0.2;
6 S1 t; n& G& ^/ t) X6 q: V2 E}# a5 t/ l; Y4 g, l. B$ u' s
}
6 z8 m. X S( ~: Qprivate void formbase_shown(object sender, eventargs e)
: [6 w/ e: S& e5 @) C9 v. S{: t% K* a# ]$ P
formtimer.start();- ]4 t$ A% `% X2 G8 i0 U
}6 {& j+ ]$ h: `3 l$ a
}7 H3 }) P. N- K
}5 L3 G8 f' N1 H
以下是自动生成的代码:/ |+ ?0 Z& D6 }4 j; A
namespace tems.forms
* U0 x! J9 n) r1 t& X( k{
: k" o7 h5 G4 _7 m0 Qpartial class formbase
" m/ k( a5 B* Y0 \0 B7 A{& \8 z7 K: i6 ]% M
/// <summary>
* t7 {" g& x& u' [% P/// required designer variable.% W( U3 [3 Y7 @& i% m; g7 \# V
/// </summary>0 V$ m8 n! l- y1 E4 ~! `" q" Q
private system.componentmodel.icontainer components = null;- [* E) f' n4 m; o
/// <summary>
- ~: ~8 j+ s z/// clean up any resources being used.. r" ?8 y/ x+ }2 K. L1 P" |
/// </summary>* Y3 T, E3 _1 R8 W& J+ z4 Q
/// <param name=disposing>true if managed resources should be disposed; otherwise, false.</param>
) y, Z8 F6 D& m! O" Bprotected override void dispose(bool disposing) x0 n* u. r% C3 @# p
{
' H" n2 g" u2 |if (disposing && (components != null))
/ X C0 e, Z7 F{
# d3 q* _. N4 N# a0 C* G, z' W7 Jcomponents.dispose();
* V2 v" k7 I. L) M* Z4 w! `& S}0 k4 s1 O- V1 W
base.dispose(disposing);
7 N6 n* c0 J0 o9 ^" G- z( V! E1 |}0 X A# x7 _. k: E/ J
#region windows form designer generated code# \8 {% v+ C ?+ s# a" f
/// <summary>
. h* c; H# c: k: _( s: j6 U/// required method for designer support - do not modify5 C3 w c, D. {: N2 Y2 J
/// the contents of this method with the code editor.' g$ C+ S M$ `. S& `: }
/// </summary>
( M7 E1 m/ p9 G1 v1 Pprivate void initializecomponent()
( j' l& [! k @( z. w. d{
! o8 ?+ j0 T4 c% S3 fthis.suspendlayout();) t$ j( a: W @$ q. [
//4 [9 D1 E/ x1 g f3 O
// formbase# y$ R1 e) p. P: S
//3 g9 V6 I* p6 k8 [9 S# N
this.autoscaledimensions = new system.drawing.sizef(6f, 12f);/ X5 r8 |3 r1 J P' z+ Q
this.autoscalemode = system.windows.forms.autoscalemode.font;
W5 j5 c$ Y2 r0 F+ x+ h" A& Cthis.clientsize = new system.drawing.size(284, 262);
( Z4 w: W ^# y5 b9 vthis.name = formbase;6 x, \3 M! ]+ }+ x i4 f, X
this.text = formbase;1 v# `- D( W3 J3 ]4 k
this.shown += new system.eventhandler(this.formbase_shown);
! r; r- Q/ B, P- l4 M qthis.resumelayout(false);
) j$ l; q7 D l# [& k m1 q2 n/ S+ g}
+ L3 D* x. r+ ?6 n6 u( c1 M#endregion
9 @: }8 w3 x9 P6 ~3 b6 Q2 p' F: y7 N* M}' y9 Y$ n+ b8 l# L+ h# a8 N( C4 O
}
3 s- d8 [% v2 T5 k4 Q! c代码中我用new关键字覆盖了form类中的opacity属性,使其只读并且不可编辑,有人可能会说这个属性的只读代码写得不规范,应该是去掉set访问器或将set设为私有,没错,标准的是应该这样做,而我为何不这样做呢?原因就是如果真正将属性设为私有,那么在其它窗体继承它的时候,由于我们一般都是先建一个标准窗体,标准窗体在创建时窗体的属性若有默认值的会自动生成初始化默认值,标准窗体创建后才将基类改为formbase类,这样就会造成报错:opacity是只读的,不能赋值,所以我们只可以让其外面看到是可读写,但实际子窗体的赋值不会生效,起到只读效果,当然了,如果你不觉得麻烦的话,你可以按标准属性设置,然后每建立一个窗体后,请先将opacity的代码清除,然后再更改继承类,这样也是可以的。
% U$ @% g1 k. S% d0 y使用就很简单了,与正常的窗体相同,在这里就不叙述了,大家可将以上代码复制到自己的项目中,便可直接使用。
# j3 r) b. ]7 w6 z其实通过以上代码的思路,我们可以设计通用的百叶窗切换效果的窗体基类,有空我会试着去实现这些功能,希望大家能支持,谢谢!1 p, B( q4 t9 j! r Q
' t1 F: f" ]# O* y更多网页制作信息请查看: 网页制作 |
|