You are on page 1of 82

Nguy n Ng c Bnh Ph ng L Tr n Nh t Qu nh

t ng h p & bin d ch

T PI
http://www.dvpub.com.vn/dv/details.aspx?itemid=244

N H X U T B N GI A O T H NG V N T I

13

M CL C

M CL C

L I NI QUY

U ..................................................................................................................... 5 C .......................................................................................................................... 9

C U TRC C A SCH ..................................................................................................... 7 YU C U V H TH NG................................................................................................ 11 M C L C......................................................................................................................... 13 Ch ng 1: CHU I V BI U TH C CHNH QUY 19

1.1 N i chu i ............................................................................................................. 21 1.2 L y chu i con ...................................................................................................... 22 1.3 T o chu i ch a m t k t c l p l i nhi u l n ................................................ 23 1.4 Thay i ki u ch hoa-th ng c a t t c cc k t trong chu i.......................... 23 1.5 Th c hi n php so snh chu i khng phn bi t ch hoa-th ng ....................... 24 1.6 Duy t qua t t c cc k t trong chu i ................................................................ 24 1.7 Phn tch chu i thnh t ..................................................................................... 25 1.8 Tm t t c hi n di n c a m t dy k t trong chu i ............................................. 27 1.9 Thay th t t c hi n di n c a m t dy k t trong chu i ..................................... 28 1.10 S d ng padding khi hi n th chu i ................................................................... 29 1.11 o chu i.......................................................................................................... 31 1.12 Chn k t ng t dng vo chu i........................................................................ 31 1.13 Chn k t c bi t vo chu i ........................................................................... 32 1.14 X l chu i nhanh chng b ng StringBuilder .................................................... 33 1.15 Chuy n chu i thnh m ng byte......................................................................... 35

14

1.16 Chuy n m ng byte thnh chu i......................................................................... 36 1.17 S d ng cc bi u th c chnh quy thng d ng ................................................... 37 1.18 Xc nh n tnh h p l c a u vo v i bi u th c chnh quy............................... 41 1.19 Tm t t c hi n di n c a m u trong chu i.......................................................... 41 1.20 Thay th t t c hi n di n c a m u trong chu i .................................................. 43 1.21 X l tn file ...................................................................................................... 44 1.22 X l URI .......................................................................................................... 45 1.23 Xc nh n tnh h p l c a th tn d ng b ng gi i thu t Luhn ............................. 46 1.24 Xc nh n tnh h p l c a ISBN ......................................................................... 47 1.25 So snh chu i b ng gi i thu t SoundEx............................................................ 48 Ch ng 2: S , NGY, V CC KI U D LI U KHC 51

2.1 Th c hi n cc thao tc ton h c ......................................................................... 53 2.2 Chuy n m t s thnh m t chu i c- nh-d ng ............................................... 54 2.3 T o s ng u nhin .............................................................................................. 56 2.4 Lm vi 2.5 Lm vi 2.6 Lm vi 2.7 Lm vi cv cv cv cv i cc h th ng s phi c s 10 ......................................................... 57 i s ph c .......................................................................................... 57 i vector ............................................................................................. 60 i ma tr n........................................................................................... 62

2.8 Lm vi c v i phn s (khng s d ng d ng th p phn)...................................... 63 2.9 Tnh m t bi u th c chu i..................................................................................... 66 2.10 L y ngy v gi h th ng.................................................................................. 67 2.11 C ng v tr ngy gi ........................................................................................ 68 2.12 Xc nh cc ngy trong tu n, n m nhu n..................................................... 69 2.13 L y tn ngy v thng cc ngn ng khc..................................................... 69 2.14 nh d ng m t ngy .......................................................................................... 70 2.15 T o m t chu i ngy v i nh d ng b t bi n .................................................... 73 2.16 Xc nh n tnh h p l c a ngy do ng i dng cung c p .................................. 73 2.17 T o GUID.......................................................................................................... 74 2.18 Chuy n cc ki u c b n thnh d ng nh phn .................................................. 75 2.19 Ki m tra cc m ng byte c b ng nhau hay khng............................................. 76 2.20 Chuy n tn c a m t gi tr li t k thnh gi tr t ng ng................................. 77 Ch ng 3: M NG V T P H P 3.1 T o v 79

nhanh d li u vo m ng..................................................................... 81

3.2 i kch th c m t m ng.................................................................................... 82 3.3 T o m ng khng c c n t i 0 .............................................................................. 83 3.4 T o m ng khng u .......................................................................................... 84 3.5 S d ng ArrayList ............................................................................................... 85 3.6 d li u t Array vo ArrayList ........................................................................ 86 3.7 Chuy n ArrayList thnh Array ............................................................................. 86 3.8 S p cc ph n t trong m t Array hay ArrayList................................................... 87 3.9 S p cc ph n t khng-th -so-snh trong m t Array hay ArrayList .................... 89 3.10 S d ng Hashtable thay cho t p h p t ng qut ................................................ 91 3.11 Li t k cc ph n t trong m t Hashtable........................................................... 93 3.12 S d ng Queue (t p h p FIFO) ........................................................................ 94 3.13 S d ng Stack (t p h p LIFO) .......................................................................... 94

15

3.14 S d ng SortedList ........................................................................................... 95 3.15 T o cc b n sao c n v su c a m t t p h p hay m ng .................................. 96 3.16 T o m t t p h p c- nh-ki u-m nh............................................................. 97 3.17 T o m t t p h p t i n c- nh-ki u-m nh................................................. 99 3.18 Lo i b ph n t trong lc duy t t p h p.......................................................... 100 3.19 Duy t cc ph n t c a t p h p theo th t ng u nhin .................................. 101 Ch ng 4: IT NG, GIAO DI N, V M U 105

4.1 T o ki u gi tr ................................................................................................... 107 4.2 T o i t ng kh -sao-chp ............................................................................. 110 4.3 T o ph ng th c an-ton-v -ki u-d -li u Clone .............................................. 112 4.4 T o i t ng kh -so-snh ............................................................................... 112 4.5 T o i t ng kh -h y...................................................................................... 114 4.6 T o 4.7 T o it it ng c th xu t hi n trong khay thnh ph n ..................................... 115 ng kh -chuy n- i .......................................................................... 117

4.8 T o i t ng kh -tu n-t -ha ......................................................................... 118 4.9 Tu n t ha i t ng ra a ............................................................................ 120 4.10 Sao m t i t ng kh -tu n-t -ha ................................................................ 121 4.11 Tu n t ha cc thnh vin cng khai c a m t i t ng khng-kh -tu nt -ha ..................................................................................................................... 123 4.12 Th c hi n php tu n t ha c-ch n-l a v i m u Memento .......................... 124 4.13 Nm bi t l ty bi n......................................................................................... 128 4.14 D ng s ki n ty bi n ..................................................................................... 130 4.15 S d ng m u Singleton................................................................................... 131 4.16 S d ng m u Factory...................................................................................... 132 4.17 S d ng m u Registry .................................................................................... 133 4.18 S d ng m u Lazy Initialization ...................................................................... 134 Ch ng 5: FILE V TH M C 137

5.1 X l file ............................................................................................................ 139 5.2 X l th m c.................................................................................................... 142 5.3 Truy xu t thng tin phin b n c a file................................................................ 143 5.4 S d ng php ton trn bit v i cc thu c tnh c a file....................................... 145 5.5 c v ghi file nh phn ..................................................................................... 146 5.6 L c file v i wildcard........................................................................................... 146 5.7 X l file m t cch quy ................................................................................. 147 5.8 Tm m t chu i bn trong m t file ....................................................................... 149 5.9 S d ng TreeView hi n th cy th m c trong lc ch y ............................... 151 5.10 Ki m tra hai file c trng nhau hay khng ....................................................... 152 5.11 Theo di h th ng file pht hi n thay i .................................................... 154 5.12 T o file t m ..................................................................................................... 156 5.13 L y ng d n c a file th c thi....................................................................... 156 5.14 Thi t l p ng d n lm vi c hi n hnh ......................................................... 156 5.15 S d ng khng gian l u tr ring ................................................................... 157 5.16 c cc thi t l p c u hnh ng d ng............................................................... 159 5.17 T o section c u hnh ty bi n.......................................................................... 160 5.18 c thng tin header t file MP3..................................................................... 162

16

5.19 Thao tc file ZIP .............................................................................................. 163 5.20 Thao tc file PDF ............................................................................................ 164 Ch ng 6: XML 167

6.1 N p ti li u XML vo b nh ............................................................................. 170 6.2 X l t t c cc nt trong m t ti li u ................................................................ 172 6.3 Chn thm nt vo ti li u XML ........................................................................ 173 6.4 Tm cc ph n t b ng tn ................................................................................. 175 6.5 Tm cc ph n t v i bi u th c XPath................................................................ 176 6.6 N p ti li u XML vo m t l p ............................................................................ 178 6.7 S d ng XML Serialization v i cc i t ng ty bi n...................................... 181 6.8 Th c hi n XSL Transform ................................................................................. 184 6.9 Xc nh n tnh h p l c a ti li u XML d a trn m t XML Schema ................... 186 6.10 L u tr d li u nh phn v i Base64 Transform.............................................. 191 Ch ng 7: L P TRNH 7.1 G 7.2 7.3 7.4 S A TI U TRNH 193

i b t ng b ph ng th c v i y nhi m...................................................... 195 i nhi u l i g i b t ng b hon t t .............................................................. 198 i m t trong nhi u l i g i b t ng b hon t t .............................................. 199 d ng callback v i m t l i g i b t ng b ................................................... 200

7.5 Th c hi n m t tc v b t ng b v i l p Thread............................................. 203 7.6 S d ng m l nh ng b ha v i nhi u ti u trnh............................................ 205 7.7 S d ng 7.8 S d ng it it ng Thread v i m t tc v c yu c u d li u........................... 208 ng Thread v i m t tc v c tr v d li u .............................. 209

7.9 D n m l nh giao di n ng i dng n ng ti u trnh..................................... 212 7.10 D ng ti u trnh m t cch l ch s ..................................................................... 215 7.11 T o l p v b c ti u trnh ................................................................................. 216 7.12 T o m t b x l tc v c th ti s d ng ..................................................... 218 7.13 S d ng pool cho cc ti u trnh....................................................................... 220 Ch ng 8: L P TRNH M NG 223

8.1 Ki m tra kh n ng k t n i Internet c a my tnh hi n hnh............................... 225 8.2 L y a ch IP c a my tnh hi n hnh............................................................... 226 8.3 Xc nh a ch IP t tn mi n.......................................................................... 227 8.4 Ping m t a ch IP.......................................................................................... 227 8.5 Download file b ng HTTP ................................................................................. 228 8.6 L y m t m u thng tin t m t trang web ........................................................... 229 8.7 Tm t t c cc lin k t trong m t trang web ....................................................... 230 8.8 Giao ti p b ng TCP........................................................................................... 232 8.9 T o m t TCP-server h -tr - a-ti u-trnh........................................................... 235 8.10 Giao ti p b ng UDP ........................................................................................ 237 8.11 G i m t thng i p broadcast ......................................................................... 239 8.12 G i e-mail thng qua SMTP............................................................................ 239 8.13 Nh n e-mail thng qua POP3.......................................................................... 241 8.14 Truy xu t m t FTP-server ............................................................................... 246 Ch ng 9: C CH PH N CHI U 253

9.1 T o h p About

ng.......................................................................................... 255

17

9.2 Li t k nh ng ph thu c

i v i m t assembly ................................................. 256

9.3 L y thng tin ki u t m t l p hay m t i t ng............................................... 257 9.4 Kh o st m t ki u tm ra cc thnh vin c a n ........................................... 259 9.5 Kh o st m t assembly tm ra cc ki u trong .......................................... 261 9.6 Th hi n ha m t ki u d a theo tn.................................................................. 263 9.7 N p assembly t m t n i xa ............................................................................. 265 9.8 G i m t ph ng th c d a theo tn................................................................... 266 9.9 T o, p d ng, v nh n bi t m t c tnh ty bi n.............................................. 268 9.10 Nh n bi t caller c a m t th t c ...................................................................... 270 9.11 Ph n chi u ln m t l p WMI ........................................................................... 273 9.12 Bin d ch Ch ng m ngu n................................................................................ 275 277

ng 10: L P TRNH WINDOWS

10.1 Truy xu t Windows Registry............................................................................ 279 10.2 L y cc bi n mi tr ng ................................................................................. 281 10.3 Th l cc s ki n h i u hnh...................................................................... 282 10.4 Truy xu t Desktop v Start menu .................................................................... 284 10.5 T o shortcut trn Desktop hay Start menu ...................................................... 285 10.6 Kh i ch y m t ng d ng Windows v i ph ng th c Main ............................. 287 10.7 L y cc i s dng l nh................................................................................. 289 10.8 Ch y ng d ng ang s h u m t ui file no .......................................... 290 10.9 Tm t t c cc ti n trnh ang ch y ................................................................. 292 10.10 K t thc m t ti n trnh ang ch y.................................................................. 294 10.11 Ch cho php m t th hi n c a ng d ng...................................................... 295 10.12 G i keystroke n m t ng d ng.................................................................. 296 10.13 Bu c Windows t t hay ng xu t .................................................................. 298 10.14 Ch i file WAV................................................................................................ 299 10.15 Hi n th h p tho i ch n th m c chu n ......................................................... 300 10.16 S d ng Clipboard ........................................................................................ 302 10.17 Hi n th tr gip c m-ng -c nh..................................................................... 304 10.18 B t cc l i ch ac-th -l ......................................................................... 306 10.19 T o d n ci t Windows Installer ............................................................. 307 10.20 Ci t .NET Framework trn my client ....................................................... 310 10.21 K t h p m t ki u file vo ng d ng c a b n ................................................. 310 10.22 Trch icon t file EXE .................................................................................... 312 10.23 L y thng tin v mn hnh ............................................................................. 313 Ch ng 11: I U KI M WINDOWS 315

11.1 Thm i u ki m vo form lc th c thi.............................................................. 317 11.2 L u tr d li u trong i u ki m ....................................................................... 319 11.3 Thay th m ng i u ki m ................................................................................ 321 11.4 Xa ph n text c a t t c cc i u ki m nh p trn form ................................... 322 11.5 L u tr cc i t ng trong m t danh sch .................................................... 323 11.6 Bu c ListBox cu n xu ng................................................................................ 325 11.7 S d ng hyperlink ........................................................................................... 326 11.8 Ch cho php nh p s vo TextBox................................................................. 328 11.9 S d ng ComboBox c tnh n ng auto-complete............................................ 328

18

11.10 S p x p ListView theo c t b t k ................................................................... 330 11.11 S d ng tnh n ng ko-v-th ....................................................................... 332 11.12 Lin k t menu ng c nh vo i u ki m......................................................... 333 11.13 S d ng m t ph n menu chnh cho menu ng c nh..................................... 334 11.14 T o form a ngn ng ................................................................................... 335 11.15 S d ng s th a k form .............................................................................. 337 11.16 T o form khng th di chuy n c.............................................................. 339 11.17 Lm cho form khngng-vi n c th di chuy n c .............................. 341 11.18 L u tr kch th c v v tr c a form ............................................................. 343 11.19 ng b cc i u ki m trn form................................................................... 344 11.20 T o ng d ng khay h th ng ........................................................................ 346 11.21 p d ng phong cch Windows XP ................................................................ 348 11.22 Thay Ch i c c a form.............................................................................. 350 353

ng 12: IN V V V I GDI+

12.1 Tm t t c cc my in c ci t ............................................................ 355 12.2 In v n b n n gi n ........................................................................................ 358 12.3 In v n b n c nhi u trang................................................................................ 360 12.4 Canh gi a text khi in ....................................................................................... 363 12.5 Th c hi n wrapping khi in............................................................................. 364 12.6 In d li u t m t file ........................................................................................ 366 12.7 Hi n th print-preview....................................................................................... 369 12.8 L y thng tin v hng i in ............................................................................ 371 12.9 Qu n l tc v in ............................................................................................. 372 12.10 Tm t t c cc font c ci t ............................................................... 374 12.11 Chuy n i nh d ng nh ............................................................................ 375 12.12 V n i dung t nh ............................................................................................ 377 12.13 V n i dung ng .......................................................................................... 379 12.14 S d ng mu h th ng.................................................................................. 381 12.15 C i thi n ch t l ng th hi n ........................................................................ 382 12.16 Th c hi n hit testing v i shape................................................................... 383 12.17 V hnh d ng thumbnail ............................................................................. 384 12.18 S d ng double buffering t ng t c v l i........................................... 387 12.19 Hi n th c a s c hnh dng b t th ng ...................................................... 389 12.20 T o menu v i c ch owner-drawn ............................................................ 391 12.21 T o ListBox v i c ch owner-drawn.......................................................... 394 TI LI U THAM KH O.................................................................................................. 399

277

Ch

ng 10: L P TRNH WINDOWS

10

278

Ch

279 ng 10: L p trnh Windows

i v i h u h t cc l p trnh vin, vi c pht tri n t p trung vo cc tnh n ng c a h i u hnh Microsoft Windows. Trong ch ng ny, chng ta s xt m t s v n th ng c h i nh t v vi c pht tri n v i Microsoft Visual Basic .NET. B n s bi t cch s d ng cc ti nguyn c-th-Windows nh bi n mi tr ng, Registry, Start menu, Clipboard, v Windows help. B n c ng s bi t cch t ng tc v i cc ti n trnh Windows hi n ang ch y, th l cc s ki n h i u hnh, v tri n khai ng d ng c a b n v i ti n ch ci t Windows Installer. B n c n hi u r ng Microsoft .NET Framework khng sao ton b Win32 API, m ch sao cc tnh n ng c t li c a n. Vi c t o cc giao di n c-qu n-l cho m i hm API s l m t nhi m v n ng n (v ph n tc d ng). H u h t cc nh pht tri n nh n nh r ng .NET cung c c n n nh t v khi n n d s d ng h n bao c p 99% cc ch c n ng Windows th ng gi h t. Tuy nhin, s d ng m t vi tnh n ng, b n s c n o su vo th gi i khngc-qu n-l. t o cc m c cho ch ng ny, chng ta s c n nhi u ki u gi i php khc nhau, bao g m: Khng gian tn Microsoft.Win32 Trong n l c lm cho .NET tr nn t ng qut h n (v d mang n cc n n khc), m t l ng ng k cc ch c n ng c-th-Windows c gi trong khng gian tn ny, bao g m cc l p dng truy xu t Registry (m c 10.1) v th l cc s ki n h i u hnh (m c 10.3). Khng gian tn System.Diagnostics Khng gian tn ny ch a m t s ch c n ng m c-th p dng m (m c 10.8), kh o st (m c 10.9), v k t thc (m c 10.10) cc ti n trnh Windows. Win32 API B n s c n s d ng cc l i g i API cho m t vi tc v , ch ng h n ch i file WAV (m c 10.14), v t t Windows (m c 10.13). Windows Script Host S d ng COM Interop, b n c th truy xu t thnh ph n Windows Script Host; thnh ph n ny cho php b n t o shortcut (m c 10.5), g i keystroke n cc ng d ng khc (m c 10.12), v.v...

10.1

Truy xu t Windows Registry

B n mu n l u tr v l y cc gi tr trong Windows Registry. S d ng cc l p Registry v RegistryKey trong khng gian tn Microsoft.Win32. Khc v i cc phin b n tr c c a Visual Basic, Visual Basic .NET cung c p quy n truy xu t khng h n ch n Windows Registry thng qua cc l p Registry v RegistryKey. Registry l i m kh i u cho vi c truy xu t Windows Registry: n cung c p cc tr ng chia s , tr v ng d n m c- u-tin (hay cc kha c s ). Hai tr ng cc i t ng RegistryKey cho cc quan tr ng nh t l: ch a cc s thch (preference) c-th-ng i-dng. y l v tr th ng c s d ng l u tr thng tin Registry trong m t ng d ng, v n t ng ng v i kha c s HKEY_CURRENT_USER.
CurrentUser LocalMachine ch a d li u c u hnh p d ng cho t t c cc ng i dng trn my tnh hi n hnh. B n c th s d ng ng d n ny l u tr cc thng tin c-th- ngd ng nh ng d n ci t. Tr ng ny t ng ng v i kha c s HKEY_ LOCAL_MACHINE.

280 Ch ng 10: L p trnh Windows

M t khi c i t ng RegistryKey, b n c th chuy n xu ng cc m c d i b ng m t c php gi ng ng d n, k thi t l p v l y cc gi tr ring r . Thng th ng, m t ng d ng s l u tr cc thi t l p trong ng d n con \Software\CompanyName\ProductName ho c \Software\CompanyName\ProductName\Category d i m t kha c s . l y m t i t ng RegistryKey cho m t kha n m trong, b n hy s d ng ph ng th c RegistryKey.OpenSubKey. N u mu n m m t kha ch ghi, b n ph i s d ng thng s ty ch n True trong ph ng th c OpenSubKey.
Dim Key As RegistryKey Key = Registry.LocalMachine.OpenSubKey("Software\MyCompany\MyApp", True)

ghi m t gi tr , b n hy s d ng SetValue; v GetValue. Cc gi tr th ng c l y d ng chu i.


Dim Value As String ' L y gi tr MyValueName. Value = CType(Key.GetValue("MyValueName"), String) ' L u gi tr MyValueName. Key.SetValue("MyValueName", Value)

l y m t gi tr , b n hy s

d ng

B th th th

n c th hi n th c vi c truy xu t Registry trong ng d ng c a b n theo nhi u cch. B n c l y t t c cc gi tr khi ng d ng b t u v l u chng khi ng d ng ng, ho c b n c l y v l u chng m t l t. L p RegistryData trnh by d i y s d ng cch ti p c n c l y khi l p c kh i t o (v kha hai. M t tham chi u n RegistryKey thch h p c t o n u c n). T , th t c Get s l y gi tr t Registry, v th t c Set s ghi gi tr vo Registry.
Imports Microsoft.Win32 Public Class RegistryData Private Key As RegistryKey Private Const RegistryPath As String = _ "Software\TestCompany\TestApp\" Public Property DefaultDocumentPath() As String Get ' N u kha khng c tm th y, ng d n ' startup c a ng d ng c s d ng m c nh. Return CType(Key.GetValue("DefaultDocumentPath", _ Application.StartupPath), String) End Get Set(ByVal Value As String) Key.SetValue("DefaultDocumentPath", Value) End Set End Property Public Sub New() Key = Registry.CurrentUser.OpenSubKey(RegistryPath, True) If Key Is Nothing Then ' Kha khng t n t i. T o n. Key = Registry.CurrentUser.CreateSubKey(RegistryPath) End If End Sub End Class

Ch

281 ng 10: L p trnh Windows

o n m d i y trnh by cch s d ng l p RegistryData Open trong m t ng d ng Windows:


Public Class RegistryTestForm Inherits System.Windows.Forms.Form Public RegistryData As New RegistryData()

l y thng tin cho h p tho i

Private Sub cmdTest_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdTest.Click Dim dlgOpen As New OpenFileDialog() ' L y gi tr t Registry. dlgOpen.InitialDirectory = RegistryData.DefaultDocumentPath ' Hi n th h p tho i Open. dlgOpen.ShowDialog() ' Ki m tra xem filename c c ch n hay khng. If dlgOpen.FileName = "" Then ' Ng i dng nh p Cancel. Khng lm g c . Else ' L u tr th m c ch a file c ch n. RegistryData.DefaultDocumentPath = _ System.IO.Path.GetDirectoryName(dlgOpen.FileName) End If End Sub End Class

10.2
B n mu n l y thng tin t m t bi n mi tr my tnh, tn ng i dng, logon server...).

L y cc bi n mi tr ng
ng Windows (ch ng h n, tm tn

S d ng ph ng th c GetEnvironmentVariable hay GetEnvironmentVariables c a l p System.Environment. H i u hnh Windows l u tr cc thng tin th ng c s d ng trong cc bi n mi tr ng. B n c th truy xu t thng tin ny b ng ph ng th c Environment. GetEnvironmentVariable. o n m d i y s d ng k thu t ny l y tn c a my tnh hi n hnh:
Dim ComputerName As String ComputerName = Environment.GetEnvironmentVariable("COMPUTERNAME")

Cc ng d ng c th nh ngh a v thi t l p cc bi n mi tr ng c a chng (b c ny th ng c th c hi n b i ch ng trnh ci t). B n c th l y b t k bi n mi tr ng no trong m .NET, n u b n bi t tn c a n v s d ng ph ng th c GetEnvironmentVariable. Tuy nhin, thi t l p bi n mi tr ng. N u c n th c l p Environment khng cung c p ph ng th c no c m t trong m c 10.5). hi n cng vi c ny, b n nn s d ng Windows Script Host (s Ngoi ra, b n c th l y t t c cc bi n mi tr ng trn my tnh hi n hnh b ng ph GetEnvironmentVariables. K thu t ny c s d ng trong o n m d i y: ng th c

282 Ch ng 10: L p trnh Windows Dim Variables As IDictionary Variables = Environment.GetEnvironmentVariables() Dim Variable As System.Collections.DictionaryEntry For Each Variable In Variables Dim listItem As New ListViewItem(Variable.Key.ToString()) listItem.SubItems.Add(Variable.Value.ToString()) listSettings.Items.Add(listItem) Next

Hnh 10-1 Danh sch cc bi n mi tr

ng

10.3
Thm m t hm th l s

Th l cc s ki n h i u hnh
ki n vo m t trong cc s ki n chia s do l p

B n mu n m l nh c a b n ph n ng v i cc s ki n h th ng Windows, ch ng h n m t thay i c a h th ng hay cc thi t l p Desktop.


Microsoft.Win32.SystemEvents cung c p.

L p SystemEvents cung c p cc tham chi u


DisplaySettingsChanged

n nhi u s ki n h th ng, bao g m: phn gi i

x y ra khi cc thi t l p hi n th (ch ng h n, x y ra khi ng

mn hnh) b thay th ng.

i. i dng thm font vo hay g b font kh i h

InstalledFontsChanged

Ch LowMemory

283 ng 10: L p trnh Windows

x y ra n u h th ng ang ch y v

t qu RAM hi n c.

PaletteChanged

x y ra khi ng i dng chuy n sang m t ng d ng s d ng b ng mu khc 256 mu. S ki n ny ch x y ra ch 256 mu. x y ra khi ng i dng t m ng ng (suspend) hay ph c h i (resume) h th ng.

PowerModeChanged

x y ra khi ng i dng ng xu t (log-off) hay t t (shut-down) h th ng. Lc ny, cc ng d ng khc (bao g m ng d ng .NET c a b n ang th l s ki n) c th h y b vi c t t my. B n c ng c th l y m t gi tr cho bi t ng i dng hi n t i c ang ng xu t hay ton b h i u hnh ang t t hay khng.
SessionEnding

x y ra khi ng i dng ng xu t hay t t h th ng. Lc ny, b n khng th cho d ng vi c t t my c n a. Tuy nhin, b n c th l y m t gi tr cho bi t ng i dng hi n t i c ang ng xu t hay ton b h i u hnh ang t t hay khng.
SessionEnded TimeChanged

x y ra n u ng i

i dng thay

i th i gian trn

ng h h th ng. i (ni cch

UserPreferenceChanging

khc, m t thay

x y ra khi m t s thch ng c ngh ). x y ra khi m t s thch ng

i dng g n thay i dng thay i.

UserPreferenceChanged

y l cc s ki n chia s , ngh a l b n c th thm m t hm th l s ki n m khng c n t o i t ng SystemEvents. V d d i y g n hm th l s ki n cho s ki n SessionEnding:


AddHandler SystemEvents.SessionEnding, AddressOf SessionEnding

B n c n ch r ng cc callback s ki n di n ra trn m t ti u trnh h th ng, khng ph i trn ti u trnh ng d ng. Do , n u mu n c p nh t giao di n ng i dng ho c thay i m t bi n chia s trong hm th l s ki n cho m t s ki n h th ng, b n s c n s d ng cc b c ng b ha c trnh by trong ch ng 7 (m c 7.6 v 7.9). Ngoi ra, b n khng nn th c hi n b t k cng vi c no t n nhi u th i gian trong hm th l s ki n khng lm ch m cc ng d ng khc ang i s ki n. V d d i y th l s ki n SessionEnding v h y b vi c t t my n u n ng v i m t thao tc ng xu t ng i dng. th nghi m v d ny, b n ph i bin d ch ch ng trnh v ch y n bn ngoi mi tr ng Microsoft Visual Studio .NET.
Public Class ShutdownTestForm Inherits System.Windows.Forms.Form Private Sub ShutdownTestForm_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load AddHandler Microsoft.Win32.SystemEvents.SessionEnding, _ AddressOf SessionEnding End Sub Private Sub SessionEnding(ByVal sender As Object, _ ByVal e As Microsoft.Win32.SessionEndingEventArgs) If e.Reason = Microsoft.Win32.SessionEndReasons.Logoff Then e.Cancel = True MessageBox.Show("Attempting to cancel the logoff operation.") Else

284 Ch ng 10: L p trnh Windows MessageBox.Show("System is shutting down.") End If End Sub End Class

Ch r ng n u h th ng ang t t, ng d ng c a b n c m t kho ng th i gian h n ch k t nhanh, ng d ng c a b n s b t t m t thc. N u b n nh p OK trn h p thng bo khng cch p bu c.

10.4

Truy xu t Desktop v Start menu

B n mu n truy xu t cc shortcut hay cc file khc trn Desktop hay Start menu. B n c th truy xu t tr c ti p cc th m c Start menu v Desktop b ng cch l y cc bi n mi tr ng t ng ng. .NET khng cung c p l p no t ng tc v i Desktop hay Start menu. Tuy nhin, b n c th tm th y cc th m c t ng ng b ng cc bi n mi tr ng. V d , b n c th l y th m c profile c a ng i dng hi n t i t bi n mi tr ng USERPROFILE. Th m c ny c hai th m c con quan tr ng: \Desktop (l u gi cc file c hi n th trn Desktop c a ng i dng hi n t i) v \Start Menu (l u gi cc shortcut c-thng i-dng trn Start menu). B n c ng c th s d ng bi n mi tr ng ALLUSERSPROFILE l y th m c profile \All Users (c cc thi t l p p d ng cho t t c cc ng i dng). Th c m c \All Users ch a th m c \Start Menu v i cc shortcut ton c c ( a s ng d ng u ci t ). V d d trnh i y s d ng c hai cch trn c ci t trn my tnh: hi n th cc file trn Desktop v m t vi ch ng

Public Module DesktopShortcutTest Public Sub Main() ' L y th m c Desktop c a ng i dng hi n t i v ' l y th m c Start menu c a t t c ng i dng. Dim DesktopDir, StartMenuDir As String DesktopDir = _ Environment.GetEnvironmentVariable("USERPROFILE") & _ "\Desktop" StartMenuDir = _ Environment.GetEnvironmentVariable("ALLUSERSPROFILE") & _ "\Start Menu" ' Hi n th tn cc file trn Desktop c a ng i dng hi n t i. Console.WriteLine("These are the files on your desktop:") Dim Dir As New System.IO.DirectoryInfo(DesktopDir) Dim File As System.IO.FileInfo For Each File In Dir.GetFiles() Console.WriteLine(File.Name) Next ' Hi n th cc nhm shortcut m c u tin trong ' Start menu c a t t c ng i dng (d i nhm Programs). Console.WriteLine("These are shortcut groups " & _ "in your Programs menu:")

Ch

285 ng 10: L p trnh Windows

Dir = New System.IO.DirectoryInfo(StartMenuDir & "\Programs") Dim ShortcutGroup As System.IO.DirectoryInfo For Each ShortcutGroup In Dir.GetDirectories() Console.WriteLine(ShortcutGroup.Name) Next Console.ReadLine() End Sub End Module

K thu t dng bi n mi tr ng h u ch cho vi c l y thng tin t cc ng d n c bi t ny, nh ng n khng gip b n t o shortcut v shortcut l m t ki u file c bi t (s d ng nh d ng c m t ring). Tuy nhin, b n c th t o shortcut b ng Windows Script Host (WSH), s trong m c 10.5. Th m c profile c a m t ng i dng th ng c ng d n l C:\Documents and Settings\[username], trong khi th m c profile c a t t c cc ng i dng th ng c ng d n l C:\Documents and Settings\All Users.

10.5

T o shortcut trn Desktop hay Start menu

B n mu n thm m t shortcut m i vo Desktop hay Start menu. S d ng COM Interop truy xu t thnh ph n Windows Script Host, thnh ph n ny cung c p ph ng th c WshShell.CreateShortcut. C nhi u cch t o m t file shortcut. B n c th s d ng m t l i g i hm API (nh Visual Basic 6 Setup Toolkit DLL), t o shortcut b ng tay (trong tr ng h p b n mu n hi u r nh d ng c a n), ho c t o m t ch ng trnh ci t Windows Installer chuyn bi t. Cch ti p c n d nh t l s d ng thnh ph n Windows Script Host, c trong h i u hnh Windows. B n c th t ng tc v i thnh ph n COM ny thng qua COM Interop. B n ch c n thm m t tham chi u nh trong hnh 10-2. Windows Script Host c g n vo Microsoft Windows 98, Windows Me, Windows 2000, Windows XP, v Windows Server 2003 thng qua file wshom.ocx (trong th m c Windows\System32). B n c ng c th download phin b n m i nh t c a Windows Script Host t i [http://msdn.microsoft.com/scripting]. Windows Script Host c ng c th c s d ng nh x cc a m ng, k t n i n my in, l y v ch nh s a cc bi n mi tr ng, v ch nh s a Registry. B n hy tham kh o thm t i [http://msdn.microsoft.com/library/en-us/script56/htm/wsconwhatiswsh.asp]. D dng t o m t shortcut m i v i Windows Script Host. Tr c h t, b n c n t o i t ng WshShell. K , s d ng t p h p WshShell.SpecialFolders l y ng d n c a b t k th m c no sau y: AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartup, Desktop, Favorites, Fonts, MyDocuments, NetHood, PrintHood, Programs, Recent, SendTo, StartMenu, Startup, Templates. M t khi c ng
WshShell.CreateShortcut

thay i cc thu c tnh c a cu i cng.

d n thch h p, b n c th s d ng ph ng th c t o i t ng IWshShortcut. K , c u hnh shortcut b ng cch l u k t qu i t ng IWshShortcut v g i ph ng th c Save

286 Ch ng 10: L p trnh Windows

Hnh 10-2 Thm m t tham chi u

n Windows Script Host

V d d

i y t o m t shortcut

n ng d ng Notepad c a Windows:

Public Module CreateShortcutTest Public Sub Main() ' T o i t ng Windows Script Host shell. Dim WshShell As New IWshRuntimeLibrary.WshShell() Dim DesktopDir As String = _ CType(WshShell.SpecialFolders.Item("Desktop"), String) Dim Shortcut As IWshRuntimeLibrary.IWshShortcut ' File shortcut c ph n m r ng ( n) l .lnk Shortcut = CType( _ WshShell.CreateShortcut(DesktopDir & "\NotepadShortcut.lnk"), _ IWshRuntimeLibrary.IWshShortcut) ' Ch nh cc thu c tnh c b n c a shortcut. Shortcut.TargetPath = "C:\Windows\notepad.exe" Shortcut.WindowStyle = 1 Shortcut.Hotkey = "CTRL+SHIFT+N" Shortcut.Description = "Run Notepad" Shortcut.WorkingDirectory = DesktopDir ' Ch nh icon u tin trong file notepad.exe. Shortcut.IconLocation = "notepad.exe, 0" ' L u file shortcut. Shortcut.Save() Console.WriteLine("Shortcut created.") Console.ReadLine() End Sub End Module

Ch

287 ng 10: L p trnh Windows

B n c ng c th t o shortcut tham chi u n m t website (v chn n vo menu Favorites, n u mu n). B n ch c n thay i thu c tnh TargetPath nh sau:
Shortcut = _ CType(WshShell.CreateShortcut(DesktopDir & "\dvpub.lnk"), _ IWshRuntimeLibrary.IWshShortcut) Shortcut.TargetPath = "http://www.dvpub.com.vn" ' (B qua cc c u hnh khc.)

Shortcut.Save()

10.6

Kh i ch y m t ng d ng Windows v i ph ng th c Main

B n mu n kh i ch y m t ng d ng Windows m khng c n startup form. T o m t module v i ph ng th c cng khai Main. Hi n th t t c cc form m t cch h p th c, ho c s d ng ph ng th c Application.Run. C nhi u l do khi n b n mu n kh i ch y m t ng d ng Windows m khng s d ng startup form, bao g m: B n mu n hi n th nhi u form cng m t lc. B n c n x l cc B n c n quy t i s dng l nh (s c m t trong m c 10.7). c hi n th vo lc u. nh (b ng m l nh) form no s

B n mu n ch y ch ng trnh pha n n v cung c p m t icon trong khay h th ng cho php ng i dng truy xu t giao di n y c a ch ng trnh. Trong cc tr ng h p ny, b n c th kh i ch y ng d ng b ng ph ng th c startup. y l m t ph ng th c cng khai v i tn l Main, b n hy t n vo b t k module no trong d n. V d :
Public Module StartModule Public Sub Main() ' (B qua m l nh.) End Sub End Module

K , b n c th c u hnh d n s d ng o n m ny kh i ch y. Nh p ph i vo d n, ch n Properties, v r i chuy n n Common Properties | General. Bn d i Startup Object, ch n Sub Main (xem hnh 10-3). C m t i u quan tr ng c n l u v cc ph ng th c startup: ngay khi ph ng th c Main hon t t vi c th c thi, ng d ng s k t thc v b t k c a s ang m no s t ng b ng. Cch x tr ny khc v i Visual Basic 6 (gi cho ng d ng v n ch y cho n khi t t c cc c as u b ng). Do v y, trong ph ng th c startup, b n nn hi n th cc c a s m t cch h p th c, nh trong v d d i y:
Public Module StartModule Public Sub Main() Dim frm As New Form1()

288 Ch ng 10: L p trnh Windows ' ShowDialog hi n th m t c a s h p th c, lm gin ' Ph ng th c Main khng ti p t c cho n khi c a s frm.ShowDialog() o n m l nh. b ng.

' Show hi n th m t c a s khng h p th c, khng lm gin o n ' m l nh. Ph ng th c Main ti p t c, ng d ng k t thc s m, ' v c a s t ng b ng. frm.Show() End Sub End Module

Hnh 10-3 C u hnh ph

ng th c startup

M t ty ch n khc l s d ng ph ng th c Application.Run t o m t vng l p thng i p (message loop). V d , n u mu n hi n th nhi u c a s cng m t lc, b n c th hi n th t t c ci t m t vng l p chng theo cch khng h p th c v r i s d ng Application.Run thng i p trn c a s chnh. Khi c a s ny b ng, ng d ng s k t thc.
Public Module StartModule Public Sub Main() Dim frmMain As New MainForm() Dim frmSecondary As New Form1() ' Hi n th c hai c a s frmMain.Show() frmSecondary.Show() theo cch khng h p th c.

' Gi cho ng d ng v n ch y cho Application.Run(frmMain) End Sub End Module

n khi frmMain b

ng.

Ch

289 ng 10: L p trnh Windows

B n c ng c th s d ng Application.Run m khng ph i cung c p tn c a s vng l p thng i p cho n khi b n k t thc n.


Application.Run()

ch y m t

Cch ti p c n ny h u ch n u b n mu n quy t nh khi no k t thc ng d ng. N c ng cho php b n hi n th nhi u c a s v k t thc ng d ng khi m t trong cc c a s ny b ng. B n c n s d ng ph ng th c Application.Exit b t c u trong ch ng trnh. o n m d i y k t thc vng l p thng i p khi m t c a s b ng:
Private Sub Form1_Closed(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Closed Application.Exit() End Sub

10.7
B n c n l y cc i s dng l nh dng

L y c c
th c thi ng d ng.

i s dng l nh
ng nh n cc is

T o th t c Main nh n m t m ng cc chu i. M ng ny s t dng l nh.

i s dng l nh th ng c s d ng nh t trong cc ng d ng Console. Th c t , nhi u ti n is ch Console yu c u cc i s dng l nh c p m t l ng thng tin t i thi u no . m nhanh cc dng l nh cn c s d ng trong cc ng d ng Windows d a-trn-ti-li u file no . V d , l nh winword.exe mydoc.doc c th c s d ng ch y Microsoft Word v m file mydoc.doc ch trong m t thao tc. l y cc i s dng l nh trong m t ng d ng Windows hay Console, ch ng trnh c a b n n nh n m t m ng cc ph i kh i ch y v i th t c Main. B n c n thay i th t c Main chu i:
Public Module StartModule Public Sub Main(args() As String) ' (B qua m l nh.) End Sub End Module

M ng args s nh n t t c cc i s dng l nh (theo th t ). V d , n u b n th c thi l nh myapp.exe /a /b /c, s c ba chu i trong m ng. Ty thu c vo ng d ng, th t c a cc i s c th quan tr ng ho c khng. V d d i y in ra t t c cc i s c cung c p:
Public Module CommandLineArgumentTest Public Sub Main(ByVal args() As String) Console.WriteLine("You supplied " & args.Length().ToString() & _ " parameters.") Dim Argument As String For Each Argument In args Console.WriteLine(Argument) Next End Sub End Module

290 Ch ng 10: L p trnh Windows

B n c th th nghi m v d ny m khng c n vi n n dng l nh. Nh p ph i vo d n trong Solution Explorer v ch n Properties. K ti p, chuy n n Configuration Properties | Debugging (xem hnh 10-4) v cung c p danh sch cc i s .

Hnh 10-4 S d ng

i s dng l nh trong Visual Studio .NET

Cc i s c phn cch b ng kho ng tr ng. V d , l nh myapp.exe /a/b/c s ch tr v m t i s /a/b/c. N u c n cung c p m t i s c ch a kho ng tr ng, b n c th s d ng d u ngo c kp. Cch ny c n thi t khi b n mu n ch nh m t i s filename v filename c ch a kho ng tr ng. V d :
myapp.exe "my file with spaces.txt" /d /e

L nh ny cung c p ba
my file with spaces.txt /d /e

is :

Ch r ng d u ngo c kp b lo i b tr danh sch cc i s .

c khi ch

ng trnh c a b n nh n

10.8
S d ng ph

Ch y ng d ng ang s h u m t ui file no
c ng k x l m t ki u file c th no . ng th c Start c a l p System.Diagnostics.Process.

B n mu n ch y ng d ng

Trong Visual Basic 6, cch duy nh t th c thi m t ch ng trnh l cho g i tr c ti p file th c c c i thi n v i l p thi ho c s d ng Win32 API. Trong Visual Basic .NET, tnh hnh Process, l p ny c th ch y m t ng d ng d a trn cc ki u file c ng k v i Windows.

Ch

291 ng 10: L p trnh Windows

L p Process cho php b n ch y m t ng d ng nh Microsoft Word ( hi n th file .doc) hay Adobe Acrobat Reader ( hi n th file .pdf) m khng c n bi t v tr ch xc c a ng d ng trn a c ng c a my tnh. B n ch c n truy n tn c a file ti li u vo ph ng th c chia s Start c a l p System.Diagnostics.Process. o n m d i y hi n th m t h p tho i ch n file v r i t ng m file b ng ng d ng c ng k. o n m ny c th lm vi c, b n ph i nh p khng gian tn System.Diagnostics.
Dim dlgOpen As New OpenFileDialog() If dlgOpen.ShowDialog() = DialogResult.OK Then Process.Start(dlgOpen.FileName) End If

N u b n ch y m t file v ch a c ng d ng no c ng k x l ki u file ny, b n s nh n c bi t l System.ComponentModel.Win32Exception. B n c th b t bi t l ny v bo cho ng i dng bi t. Trong vi tr ng h p, b n c th mu n c u hnh cc thi t l p startup m t cch chi ti t h n. B n c th th c hi n nh th b ng cch t o m t i t ng System.Diagnostics.ProcessStartInfo ng gi cc thng tin s c s d ng ch y ng d ng, r i truy n n cho ph ng th c shia s Process.Start.
Dim dlgOpen As New OpenFileDialog() If dlgOpen.ShowDialog() = DialogResult.OK Then Dim ProcessStart As New ProcessStartInfo(dlgOpen.FileName) Process.Start(ProcessStart) End If

B n c th thay i cch th c th c thi c a ng d ng b ng cch ch nh s a cc thu c tnh c a i t ng ProcessStartInfo. V d , b n c th thay i cc thng s startup hay th m c lm vi c. c bi t, b n c th ch n s d ng m t ng t khc. Theo m c nh, khi ng i dng s c s d ng v ti li u s c n p trong ng d ng d ng Process.Start, ng t "open" s t ng ng. Tuy nhin, nhi u ng d ng ng k cc ng t cho nh ng hnh ng khc, ch ng h n nh in. V d d i y ki m tra xem ng t "print" c hi u l c i v i m t ki u file no hay khng v r i s d ng ng t . N u b n s d ng cch ny v i m t file .doc v b n ci t Microsoft Word, Word s in ti li u ny pha n n.
Dim dlgOpen As New OpenFileDialog() If dlgOpen.ShowDialog() = DialogResult.OK Then Dim ProcessStart As New ProcessStartInfo(dlgOpen.FileName) Dim CanPrint As Boolean = False Dim Verb As String For Each Verb In ProcessStart.Verbs If Verb.ToLower() = "print" Then ' y l ti li u c th in CanPrint = True ' C u hnh ProcessStart ProcessStart.Verb = Verb Exit For End If Next s

c. d ng hnh ng "print".

292 Ch ng 10: L p trnh Windows If CanPrint Then Process.Start(ProcessStart) Else MessageBox.Show("Can't print this type of document.") End If End If

10.9
S d ng ph

Tm t t c cc ti n trnh ang ch y

B n mu n l y thng tin v cc ti n trnh hi n ang ch y. ng th c GetProcesses hay GetProcessesByName c a l p System. Diagnostics.Process. L p System.Diagnostics.Process m t m t ti n trnh Windows. N cung c p m t danh sch cc thu c tnh, c trnh by chi ti t trong ti li u MSDN. S d ng nh ng thng tin ny, b n c th : Kh o st memory, thread, v CPU usage c a m t ng d ng. Xc nh ng d ng b t u khi no v n th c thi c s d ng c bao lu. L y thng tin t file th c thi ( ch y ng d ng).

B n c ng c th s d ng l p Process k t thc m t ti n trnh (s c m t trong m c ph n ng khi m t ti n trnh khc k t 10.10), v b n c th th l s ki n Process.Exited thc v i b t c l do g. B n c th thu l y m ng cc i t ng Process m t t t c cc ti n trnh hi n ang th c thi trn my tnh b ng ph ng th c Process.GetProcesses. B n c th l y thng tin v m t ti n trnh b ng ph ng th c Process.GetProcessesByName (b n ph i cung c p tn ti n trnh; tn ti n trnh th ng cng tn v i file th c thi, nh ng khng c ph n m r ng). C GetProcesses v GetProcessesByName u c m t phin b n n p ch ng cho php b n ch nh tn my tnh. B n c th s d ng cc ph ng th c ny l y thng tin v cc ti n trnh ang ch y trn m t my tnh khc. ng d ng Console d i y trnh by m t s thng tin v ti n trnh c a chnh n. Thng tin ny ch l m t ph n nh c a ton b thng tin m l p Process c th s d ng.
Public Module ProcessInfoTest Public Sub Main() Dim Proc As Process ' L y ti n trnh hi n t i (b ng tn). ' B n c th s d ng ph ng th c GetCurrentProcess. Proc = Process.GetProcessesByName("10-09")(0) Console.WriteLine("Start time: " & Proc.StartTime.ToString()) Console.WriteLine("Memory use: " & _ Proc.PagedMemorySize.ToString()) Console.WriteLine("Number of threads: " & Proc.Threads.Count) Console.WriteLine("Executable file: " & Proc.MainModule.FileName) Console.WriteLine("Responding: " & Proc.Responding.ToString()) ' Hi n th cc module m ti n trnh ny n p.

Ch Console.WriteLine("Loaded modules:") Dim ProcModule As ProcessModule For Each ProcModule In Proc.Modules Console.WriteLine(" " & ProcModule.FileName) Next Console.ReadLine() End Sub End Module

293 ng 10: L p trnh Windows

K t xu t c a ng d ng ny c trnh by d i y. M t ph n trong l danh sch cc module c n p. Ch r ng: m c d ch c m t ti u trnh ang c s d ng trong ng qu n l n. d ng nh ng .NET s d ng t ng c ng 9 ti u trnh
Start time: 6/3/2006 1:02:59 PM Memory use: 8105984 Number of threads: 9 Executable file: I:\VB.NET\Chuong10\10-09\bin\10-09.exe Responding: True Loaded modules: I:\VB.NET\Chuong10\10-09\bin\10-09.exe C:\WINDOWS\System32\ntdll.dll C:\WINDOWS\system32\mscoree.dll C:\WINDOWS\system32\KERNEL32.dll C:\WINDOWS\system32\ADVAPI32.dll C:\WINDOWS\system32\RPCRT4.dll C:\WINDOWS\system32\SHLWAPI.dll C:\WINDOWS\system32\msvcrt.dll C:\WINDOWS\system32\GDI32.dll C:\WINDOWS\system32\USER32.dll C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\MSVCR71.dll C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\fusion.dll C:\WINDOWS\system32\SHELL32.dll C:\WINDOWS\WinSxS\x86_Microsoft.Windows.CommonControls_6595b64144ccf1df_6.0.10.0_x-ww_f7fb5805\comctl32.dll C:\WINDOWS\system32\comctl32.dll c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll ...

Ngay l n u tin b n truy xu t m t thu c tnh c a i t ng Process, t t c thng tin s c l y v l u tr . N u mu n c p nh t cc thng tin c l u tr trong i t ng Process v i cc gi tr hi n t i, b n hy g i ph ng th c Process.Refresh. ng d ng d i y thu l y t t c cc ti n trnh hi n ang ch y v hi n th chng trong m t DataGrid (s d ng k thu t data binding):
Public Class ProcessViewForm Inherits System.Windows.Forms.Form ' (B qua ph n m designer.)

Private Sub ProcessViewForm_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load gridProcesses.DataSource = _ System.Diagnostics.Process.GetProcesses() End Sub End Class

294 Ch ng 10: L p trnh Windows

Hnh 10-5 Thng tin v cc ti n trnh hi n ang ch y

B n c th g p m t l i b o m t n u c l y thng tin v m t ti n trnh c- cquy n. B n c th b t l i ny khi truy xu t cc thu c tnh c a Process. Tuy nhin, n u b n th c hi n data binding v i m t ti n trnh nh th , m t l i khng-th b y s x y ra khi b n chuy n sang hng t ng ng v i u ki m DataGrid l y thng tin v ti n trnh .

10.10

K t thc m t ti n trnh ang ch y

B n mu n k t thc m t ti n trnh hi n ang ch y. Tm ti n trnh b ng Process.GetProcessesByName, v r i k t thc n b ng Process.CloseMainWindow hay Process.Kill. L p Process cung c p hai ph ng th c dng k t thc m t ti n trnh: CloseMainWindow v Kill. CloseMainWindow g i thng i p " ng" n c a s chnh c a m t ng d ng (t ng c a chu ng h n Kill v n ng v i vi c ng i dng ng c a s ). CloseMainWindow th c hi n thao tc t t c tr t t . V d , ng d ng Microsoft Word nh c ng i dng l u l i b t

Ch

295 ng 10: L p trnh Windows

k ti li u no ang m . Tuy nhin, CloseMainWindow c th khng k t thc m t ng d ng. H u h t cc ng d ng u c n ng i dng xc nh n tr c khi thot. M t khc, Kill k t thc ti n trnh ngay l p t c, v c th gy m t d li u. Kill t ng ng c s d ng lm k v i vi c k t thc ti n trnh v i Windows Task Manager. Kill ch nn sch cu i cng. V d , khi t t h i u hnh Windows, Windows ng t t c cc ng d ng ang m v s "gi t" chng n u ti n trnh v n ch y sau m t kho ng th i gian (kho ng 30 giy). Kill c ng l cch duy nh t k t thc m t ti n trnh khng c giao di n. Tr c khi s d ng CloseMainWindow hay Kill, b n ph i tm Process thch h p. N u bi t tn ti n trnh (th ng l tn file th c thi nh ng khng c ph n m r ng .exe), b n c th s d ng ph ng th c GetProcessesByName. B n c ng c th l y t t c cc ti n trnh v i ph ng th c GetProcesses v r i xt cc thu c tnh khc c a Process tm i t ng c n thi t ( c m t trong m c 10.9). ng d ng Console d i y s ng Microsoft Excel. N u ch ng trnh ny v n ch y sau 30 giy k t g i ph ng th c CloseMainWindow, n s b k t thc b ng ph ng th c Kill.
Public Module ProcessKillTest Public Sub Main() ' S d ng m ng v c th c nhi u i t ng Excel Dim Proc, Processes() As Process Processes = Process.GetProcessesByName("excel") For Each Proc In Processes ' ng c a s (v nh c l u l i cc thay i ' n u c m t ti li u Excel ch a c l u). Proc.CloseMainWindow() ' i 30 giy. Proc.WaitForExit(30000) ' K t thc ti n trnh n u n v n cn ch y. If Not Proc.HasExited Then Proc.Kill() Console.WriteLine("Application was terminated forcibly.") Else Console.WriteLine("Application ended peacefully.") End If Next Console.ReadLine() End Sub End Module ang ch y.

B n khng th s d ng CloseMainWindow hay Kill ch y trn cc my tnh xa.

k t thc cc ti n trnh ang

10.11

Ch cho php m t th hi n c a ng d ng
xem ng d ng

B n mu n m b o r ng: ch c m t th hi n, ch khng th c nhi u th hi n c a m t ng d ng ch y cng m t lc. Trong m l nh startup, ki m tra cc ti n trnh hi n ang ch y c ab n c n p hay ch a.

296 Ch ng 10: L p trnh Windows

ch c m t th hi n, ng d ng c a b n khng kh i ch y n u nh n th y c m t th hi n khc ang t n t i. B n c th xt cc ti n trnh hi n ang ch y b ng l p System.Diagnostics.Process ( c m t trong m c 10.9). Xt ng d ng d i y. N u nh n th y c nhi u th hi n ang ch y, b n s k t thc ng d ng m t cch yn ng khi startup. Tuy nhin, v d ny s hi n th m t thng bo d th nghi m.
Public Module OneInstanceTest Public Sub Main() Dim Proc() As Process ' Xc nh tn c a ti n trnh hi n t i. Dim ModuleName, ProcName As String ModuleName = Process.GetCurrentProcess.MainModule.ModuleName ProcName = System.IO.Path.GetFileNameWithoutExtension(ModuleName) ' Tm t t c cc ti n trnh v i tn ny. Proc = Process.GetProcessesByName(ProcName) If Proc.Length > 1 Then ' C nhi u h n m t ti n trnh v i tn ny. ' Do , th hi n ny s k t thc. Console.WriteLine("This instance should end.") Else Console.WriteLine("This instance can continue.") End If Console.ReadLine() End Sub End Module

N u ngh r ng c th c nhi u ng d ng trng tn v i ng d ng c a mnh, b n c th l y danh sch cc ti n trnh b ng ph ng th c Process.GetProcesses. Sau , xt m i ti n trnh xc nh tn file bi t thm chi ti t. V d , b n c th xt thu c tnh Process.MainModule th c thi.

10.12
B n mu n t

G i keystroke n m t ng d ng
ng tc v i m t ng d ng b ng cch g i keystroke.

S d ng ph ng th c WshShell.SendKeys c a Windows Script Host. C ng c th s d ng l p SendKeys trong khng gian tn System.Windows.Forms, k t h p v i ph ng th c FindWindow v SetForegroundWindow c a Win32 API. M t cch l t ng, s t ng tc v i ng d ng nn c ti n hnh thng qua cc giao di n c bi t. V d , b n c th v n hnh Microsoft Office b ng cc thnh ph n Office COM chuyn bi t (s c m t trong ch ng 19). Tuy nhin, nhi u ng d ng khng tr ng b t c giao di n l p trnh (programmatic interface) no; trong tr ng h p ny, cch duy nh t m b n c th t ng tc v i ng d ng l g i keystroke n giao di n ng i dng (user interface). C nhi u cch g i keystroke n m t ng d ng ang ch y. Cch ti p c n trong m c ny s c gi i thi u trong m c 10.5. M t ty ch n khc d ng thnh ph n Windows Script Host, l s d ng l p System.Windows.Forms.SendKeys, lm vi c h u nh gi ng h t. Tuy nhin,

Ch

297 ng 10: L p trnh Windows

.NET Framework khng cung c p l p no kch ho t cc c a s khc. Do , n u mu n g i keystroke n m t ng d ng khc b ng l p SendKeys, th tr c h t, b n ph i s d ng cc hm khngc-qu n-l c a Win32 API nh FindWindow v SetForegroundWindow. s d ng Windows Script Host, b n ph i thm m t tham chi u n Windows Script Host Object Model (xem hnh 10-2). Sau , b n c th t o m t i t ng WshShell v s d ng ph ng th c SendKeys. Ph ng th c ny cho php b n g i b t k keystroke no. C ba ki u keystroke m b n c th g i: Tr c ki n V d , abc g i phm a, k n l phm b, r i n phm c. K t c bi t n m trong d u ngo c nh n V d , t {F1} n {F12}, {UP}, {DOWN}, {LEFT}, {RIGHT}, {DEL}, {INSERT}, {BACKSPACE}, {HOME}, {END}, {ENTER}, {ESC}, {CAPSLOCK}, {NUMLOCK}, {TAB}, {PGDN} (page down), v {PGUP} (page up). B n c ng c th s d ng d u ng (~) thay cho {ENTER}. T h p phm Trong tr ng h p ny, + m t phm Shift, ^ m t phm Ctrl, v % m t phm Alt. Do , +a l A (vi t hoa). B n c ng c th nhm nhi u phm b ng d u ngo c n. Do , %(ec) l t h p Alt+e+c, v %ec l t h p Alt+e, r i n phm c. C Windows Script Host v l p SendKeys nh keystroke. u s d ng c php gi ng nhau khi ch

Khi s d ng ph ng th c SendKeys, vi c g i cc thng i p c th nhanh h n vi c x l chng. V l do , b n nn c n th n khi chen cc kho ng d ng ng n gi a cc c nh n phm. th c hi n m t php tnh n gi n. ng d ng d i y s ch y Calculator v s d ng n K ti p, chp k t qu vo Clipboard r i hi n th k t qu trong c a s Console (s d ng k thu t Clipboard trong m c 10.16).
Public Module SendKeyTest Private Shell As IWshRuntimeLibrary.WshShell Public Sub Main() Shell = New IWshRuntimeLibrary.WshShell() ' Kh i ch y Calculator. Shell.Run("calc") Threading.Thread.Sleep(100) ' Truy n focus cho Calculator, Shell.AppActivate("Calculator") ' G i m t dy phm (m t SendKeys("101") SendKeys("*") SendKeys("2~") n nh n keystroke.

php tnh 101 * 2).

' S d ng kh n ng c a Calculator SendKeys("^c")

chp k t qu

vo Clipboard.

' L y d li u t Clipboard. Console.Write("The calculator result is: ") Console.WriteLine( _ Clipboard.GetDataObject().GetData(DataFormats.Text))

298 Ch ng 10: L p trnh Windows Console.ReadLine() End Sub ' G i phm v t m d ng 500 mili-giy. Private Sub SendKeys(ByVal key As String) Shell.SendKeys(key) Threading.Thread.Sleep(500) End Sub End Module

10.13
B n mu n S d ng hm khng-

Bu c Windows t t hay
ng xu t hay t t Windows (b ng m l nh). c-qu n-l ExitWindowsEx c a Win32 API.

ng xu t

.NET Framework khng ch a cc ch c n ng c n thi t t t hay kh i ng l i Windows. Tuy nhin, b n c th d dng th c hi n nh th b ng hm ExitWindowsEx t th vi n user32.dll. Hm ny nh n vo m t thng s cho bi t b n mu n ng xu t (gi tr 0), kh i ng l i (gi tr 2), hay t t (gi tr 1). Ngoi ra, b n c th s d ng gi tr 4 bu c h th ng th c hi n m t hnh ng c-ch - nh (ngay c khi ng i dng h y b n). i u ny th ng gy b c t c cho ng i dng v b n nn s d ng n m t cch c n tr ng. ng d ng d i y nh p hm ExitWindowsEx, yu c u ng xu t h th ng:
Public Module ShutdownTest ' y l hm API dng thot kh i Windows. Private Declare Function ExitWindowsEx Lib "user32" _ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ' Ki u li t k ny gi cc h ng lin quan. Private Enum ExitWindowsFlags ' S d ng h ng ny ng xu t m khng kh i Logoff = 0 ' S d ng h ng ny Reboot = 2 kh i ng l i h th ng.

nh ngh a cc h ng lin quan, v s d ng n

ng l i.

' S d ng h ng ny t t h th ng ' (v t t my tnh, n u ph n c ng h Shutdown = 1

tr ).

' S d ng h ng ny bu c h th ng t t hay ' kh i ng l i (ngay c khi ng i dng h y b Force = 4 End Enum Public Sub Main() ExitWindowsEx(ExitWindowsFlags.Logoff, 0&) End Sub End Module

n).

Ch

299 ng 10: L p trnh Windows

10.14
B n c n ch i m t file WAV. S d ng hm khng-

Ch i file WAV
c-qu n-l sndPlaySoundA c a Win32 API.

.NET Framework khng ch a b t c l p c-qu n-l no ch i file audio. Tuy nhin, th vi n winmm.dll trong Windows c m t hm v i tn l sndPlaySoundA nh n vo tn c a m t file WAV v m t thng s cho bi t cch ch i file ny. B n c th ch n ch i m thanh m t cch ng b , m t cch b t ng b , hay theo m t vng l p pha n n. Khi ch i m thanh m t cch ng b , hm s gin o n s th c thi c a ch ng trnh cho n khi m thanh ch i xong. N u ch i m thanh m t cch b t ng b , hm s tr v ngay l p t c, v m thanh s ch i pha n n. V d d i y cho php m thanh c ch i theo nhi u cch khc nhau:

Hnh 10-6

ng d ng th nghi m m thanh

Public Class SoundTestForm Inherits System.Windows.Forms.Form ' (B qua ph n m designer.)

' Hm ny ch i m t file WAV. Private Declare Function PlaySound Lib "WINMM.DLL" Alias _ "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As _ Long) As Long ' Ki u li t k ny gi cc h ng lin quan. Private Enum PlaySoundFlags ' C ny t m d ng ng d ng cho n khi m thanh ch i xong. Sync = &H0 ' C ny cho bi t m thanh s c ch i m t cch b t ng b ' pha n n trong khi ng d ng c a b n v n ti p t c th c thi. Async = &H1 ' Ch i m thanh lin t c trong m t vng l p. ' C ny ph i c s d ng v i SND_ASYNC. d ng ch i, ' g i sndPlaySound l n n a v i 0& l i s u tin. [Loop] = &H8 ' Theo m c nh, n u b n ch i m t m thanh m i trong khi m t

300 Ch ng 10: L p trnh Windows ' m thanh khc v n ang ch i, m thanh u tin s ' Thay vo , c ny s b o ng d ng i. NoStop = &H10 b gin o n.

' Theo m c nh, n u b n ch i m t file khng t n t i, ' Windows s ch i m thanh m c nh c a h th ng. C ny ' s ng n vi c ch i m thanh m c nh trong tnh hu ng ny. NoDefault = &H2 End Enum Private Sub cmdPlaySync_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPlaySync.Click Me.Cursor = Cursors.WaitCursor PlaySound("testsound.wav", PlaySoundFlags.Sync) Me.Cursor = Cursors.Default End Sub Private Sub cmdPlayAsync_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPlayAsync.Click Me.Cursor = Cursors.WaitCursor PlaySound("testsound.wav", PlaySoundFlags.Async) Me.Cursor = Cursors.Default End Sub Private Sub cmdPlayLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPlayLoop.Click PlaySound("testsound.wav", _ PlaySoundFlags.Async Or PlaySoundFlags.Loop) End Sub Private Sub cmdEndLoop_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdEndLoop.Click PlaySound(Nothing, PlaySoundFlags.Async) End Sub End Class

c s i u khi n m nh h n trn m thanh v h a, b n c th s d ng Microsoft DirectX 9. Microsoft cung c p m t t p y cc giao di n c-qu nDirectX v DirectX SDK t i l cho DirectX 9. B n c th t i c [http://msdn.microsoft.com/downloads/list/directx.asp].

10.15
Trong .NET 1.1, s

Hi n th h p tho i ch n th m c chu n
ch n th m c.

B n mu n hi n th m t h p tho i chu n

d ng l p FolderBrowserDialog trong khng gian tn System.Windows.Forms. Trong .NET 1.0, b n ph i d n xu t m t l p t System.Windows.Forms.Design.FolderNameEditor c th s d ng l p c-b o-v FolderBrowser. .NET Framework ch a nhi u l p b c l y cc h p tho i chu n, nh l p OpenFileDialog v SaveFileDialog. Tuy nhin, .NET 1.0 khng ch a l p no ch n m t th m c. .NET 1.1 ( i ny b ng cch thm vo l p cng Visual Studio .NET 2003) kh c ph c v n

Ch FolderBrowserDialog. M c ny s trnh by cch s

301 ng 10: L p trnh Windows

d ng l p ny, v cch t o m t gi i php

ng t cho cc ng d ng .NET 1.0.

s d ng FolderBrowserDialog, b n c n t o i t ng ny, thi t l p l i m t v ng d n hi n th c a s . o n m d i y trnh by ban u, v r i g i ph ng th c ShowDialog k thu t ny, v c a s k t qu c hi n th trong hnh 10-7.
Dim dlgDirectory As New FolderBrowserDialog() ' Thi t l p ng d n ban u v l i m t . dlgDirectory.SelectedPath = "C:\" dlgDirectory.Description = "Select a folder." ' Hi n th c a s ch n th m c. If dlgDirectory.ShowDialog() = DialogResult.OK Then MessageBox.Show("You chose: " & dlgDirectory.SelectedPath) End If

Hnh 10-7 H p tho i ch n th m c chu n

N u ang s d ng .NET 1.0, b n khng c s tr gip c a l p FolderBrowserDialog. B n c th t t o m t i u ki m cho mnh, nh ng khng d g t o c m t i u ki m sao cho gi ng v i m c nh Windows v cung c p t t c cc ch c n ng. C m t gi i php l s d ng hm API SHBrowseForFolder trong th vi n shell32.dll. Tuy nhin, vi c g i SHBrowseForFolder g p r c r i b i nhi u v n v tnh lin tc (hm ny s d ng c u trc v con tr ), do v y c ng ch ng d h n vi c t o ch c n ng ny t u.
Windows.Forms.Design cung c p m t hi n th c

Tuy v y, c ng c m t l i t t. L p FolderNameEditor trong khng gian tn System. c-qu n-l b c l y Win32 API trong l p FolderBrowser. Khng may, FolderBrowser l l p c-b o-v , ngh a l n ch c hi u l c i v i m l nh FolderNameEditor v cc l p d n xu t t FolderNameEditor. C m t cch truy xu t FolderBrowser l t o m t l p d n xu t t FolderNameEditor v tr ng ra ch c n ng c a FolderBrowser. L p ty bi n CustomFolderBrowserDialog d i y trnh by k thu t ny. Tr c khi d n n assembly xu t m t l p t FolderNameEditor, b n ph i thm m t tham chi u System.Design.dll.
Public Class CustomFolderBrowserDialog Inherits System.Windows.Forms.Design.FolderNameEditor

302 Ch ng 10: L p trnh Windows ' M t th hi n c a l p c-b o-v Private Browser As FolderBrowser Public Sub New() Browser = New FolderBrowser() ' C u hnh cc thu c tnh c a FolderBrowser khi c n. ' B n c th b c logic ny trong cc th t c thu c tnh ty ' bi n, nh ng b n s c n t o cc ki u li t k m i, v khng ' th truy xu t cc ki u li t k FolderBrowserFolder v ' FolderBrowserStyles bn ngoi l p ny. Browser.StartLocation = FolderBrowserFolder.Desktop Browser.Style = FolderBrowserStyles.RestrictToFilesystem End Sub ' Hi n th h p tho i ch n th m c. Public Function ShowDialog() As DialogResult Return Browser.ShowDialog() End Function ' L i m t (xu t hi n trong c a s ). Public Property Description() As String Get Return Browser.Description End Get Set(ByVal Value As String) Browser.Description = Value End Set End Property ' ng d n m ng i dng ch n. Public ReadOnly Property SelectedPath() As String Get Return Browser.DirectoryPath End Get End Property End Class FolderBrowser.

By gi , b n c th s d ng l p ty bi n trn hi n th c a s ch n th m c. N lm vi c ng h u nh gi ng h t FolderBrowserDialog trong .NET 1.1, ch thi u kh n ng thi t l p d n ban u.


Dim dlgDirectory As New CustomFolderBrowserDialog() ' Thi t l p l i m t . dlgDirectory.Description = "Select a folder." ' Hi n th c a s ch n th m c. If dlgDirectory.ShowDialog() = DialogResult.OK Then MessageBox.Show("You chose: " & dlgDirectory.SelectedPath) End If

C a s ch n th m c

c trnh by trong hnh 10-7.

10.16

S d ng Clipboard

B n mu n dn d li u vo ho c l y d li u t Windows Clipboard.

Ch

303 ng 10: L p trnh Windows

d ng

ph

ng

th c

SetDataObject

GetDataObject

c a

l p

System.Windows.Forms.Clipboard.

L p System.Windows.Forms.Clipboard cho php b n t d li u vo Windows Clipboard v r i thu l y n. B n c th s d ng l p Clipboard trong b t k ki u ng d ng no, t ng d ng Windows n ng d ng Console (m c d b n s c n thm m t tham chi u n assembly System.Windows.Forms.dll). D li u Clipboard h p l bao g m cc ki u .NET c t li (chu i, s ...) v b t k ki u kh -tu n-t -ha no (bao g m cc l p ty bi n n u chng c c tnh Serializable). Xt l p PersonData c trnh by d i y:
<Serializable()> _ Public Class PersonData Private _FirstName As String Private _LastName As String Public Property FirstName() As String Get Return _FirstName End Get Set(ByVal Value As String) _FirstName = Value End Set End Property Public Property LastName() As String Get Return _LastName End Get Set(ByVal Value As String) _LastName = Value End Set End Property Public Sub New(ByVal firstName As String, ByVal lastName As String) Me.FirstName = firstName Me.LastName = lastName End Sub End Class

t d li u vo Clipboard, b n s d ng ph

ng th c chia s Clipboard.SetDataObject:

Dim Person As New PersonData("Bill", "Gate") Clipboard.SetDataObject(Person)

l y d li u, b n s d ng ph ng th c chia s Clipboard.GetDataObject, ph ng th c ny xc nh n c ch a m t tr v i t ng IDataObject. K , b n c th xt IDataObject ki u d li u c th no hay khng. IDataObject.GetDataPresent ki m tra m t ki u d li u c th v tr v True n u n t n t i, IDataObject.GetData l y d li u c a chnh n, v IDataObject.GetFormats l y t t c cc nh d ng d li u hi n c trn Clipboard. o n m d i y thu l y it ng PersonData t Clipboard:

' L y d li u trn Clipboard. Dim Data As IDataObject = Clipboard.GetDataObject() ' Ki m tra xem Clipboard c ch a i t ng PersonData hay khng. If Data.GetDataPresent(GetType(PersonData)) Then

304 Ch ng 10: L p trnh Windows Dim Person As PersonData Person = CType(Data.GetData(GetType(PersonData)), PersonData) MessageBox.Show("Retrieved: " & Person.FirstName & " " & _ Person.LastName) Else MessageBox.Show("No PersonData found.") End If

o n m d

i y hi n th t t c cc

nh d ng d li u hi n c trn Clipboard:

Dim Data As IDataObject = Clipboard.GetDataObject() Dim Format As String For Each Format In Data.GetFormats() MessageBox.Show(Format) Next

10.17
B n mu n hi n th m t ch ang c ch n. S .NET h

Hi n th tr gip c m-ng -c nh
c th trong file tr gip d a trn i u ki m hi n r ng

d ng thnh ph n HelpProvider, v thi t l p cc thu c tnh m tr tnh n ng tr

HelpKeyword v HelpNavigator cho m i i u ki m.

gip c m-ng -c nh (context-sensitive help) thng qua l p System.Windows.Forms.HelpProvider. L p ny l m t i u ki m m r ng c bi t. Khi b n thm n vo khay thnh ph n, n s thm m t s thu c tnh vo t t c cc i u ki m trn form. V d , hnh 10-8 trnh by m t form g m hai i u ki m v m t HelpProvider. ListBox (hi n ang c ch n) c thm cc thu c tnh HelpKeyword, HelpNavigator, v HelpString (do HelpProvider c p).

Hnh 10-8 Cc thu c tnh m r ng do HelpProvider c p cho ListBox

Ch

305 ng 10: L p trnh Windows

s d ng tr gip c m-ng -c nh v i HelpProvider, b n c n th c hi n ba b 1. 2. 3.

c sau y:

Thi t l p thu c tnh HelpProvider.HelpNamespace l tn c a file tr gip (ch ng h n, myhelp.chm). i v i m i i u ki m yu c u tr gip c m-ng -c nh, thi t l p thu c tnh m r ng
HelpNavigator l HelpNavigator.Topic.

i v i m i i u ki m yu c u tr gip c m-ng -c nh, thi t l p thu c tnh m r ng HelpKeyword l tn c a ch s c lin k t v i i u ki m ny (tn ch ph i n m trong file tr gip v c th c c u hnh trong cc cng c tc ch ).

Hnh 10-9 Tr gip d a-trn- i u-ki m, d a-trn-frame, v d a-trn-form

Hnh 10-10 File tr gip v i ng c nh TextBox ang nh n focus


[

306 Ch ng 10: L p trnh Windows

N u ng i dng nh n phm F1 trong khi m t i u ki m no ang nh n focus, file tr gip s c ch y m t cch t ng v ch lin k t v i i u ki m ny s c hi n th trong c a s tr gip. N u ng i dng nh n phm F1 trong khi ang trn m t i u ki m khng c ch tr gip (v d , GroupBox ho c Panel), cc thi t l p tr gip cho i u ki m n m bn trong s c s d ng. N u khng c i u ki m no n m bn trong ho c i u ki m n m bn trong khng c thi t l p tr gip no, cc thi t l p tr gip cho form s c s d ng. N u cc thi t l p tr gip cho form c ng khng c, HelpProvider s ch y b t k file tr gip no c nh ngh a m c d n. B n c ng c th s d ng cc ph ng th c c a HelpProvider thi t l p hay s a i php nh x tr gip c m-ng -c nh lc th c thi. V d m u trong a CD nh km s d ng tr gip c m-ng -c nh theo cch ny cung c p s tr gip d a-trn- i u-ki m, d a-trn-frame, v d a-trn-form.

10.18

B t cc l i ch a-

c-th -l

B n mu n nh n c thng bo khi ng d ng c a b n s p k t thc v m t l i ch ac-th -l, c l b n ghi nh t k ho c th c hi n d n d p. T o hm th l s ki n AppDomain.UnhandledException. S ki n AppDomain.UnhandledException pht sinh khi m t l i ch ac-th -l x y ra, tr khi ng d ng k t thc. S ki n ny khng cho b n c h i ch nh s a l i, nh ng cung c p t ng bi t l , cho php b n ghi nh t k l i v th c hi n d n d p vo pht cu i. ng d ng Console d l i ph m. i y s d ng k thu t ny. Tr c khi k t thc, n hi n th thng tin v c i

Public Module ErrorHandlerTest Public Sub Main() ' K t n i m t hm th l bi t l ch ac-th -l. AddHandler AppDomain.CurrentDomain.UnhandledException, _ AddressOf UnhandledException ' K t thc ch ng trnh v i bi t l Dim x As Integer x = x \ x End Sub ch ac-th -l.

Private Sub UnhandledException(ByVal sender As Object, _ ByVal e As UnhandledExceptionEventArgs) Console.WriteLine("*** An error was encountered. ***") Console.WriteLine(e.ExceptionObject.ToString()) Console.WriteLine("*** Press any key to exit. ***") Console.ReadLine() End Sub End Module

Cch d nh t th nghi m ng d ng ny l ch y n bn ngoi mi tr ng Visual Studio .NET. S ki n UnhandledException s khng x y ra khi b n ch y ng d ng trong Visual Studio .NET, tr khi b n c u hnh cc thi t l p g r i (trong Debug | Exceptions) l Continue trn cc bi t l ch ac-th -l (xem hnh 10-11).

Ch

307 ng 10: L p trnh Windows

Hnh 10-11 H p tho i Exceptions

10.19
T o m t d n ci

T o d n c i

t Windows Installer
ng trnh ci t c th chp

B n mu n tri n khai ng d ng c a b n b ng m t ch file, t o shortcut, v thm cc thi t l p Registry.

t Windows Installer b ng Visual Studio .NET.

V i m hnh tri n khai zero-touch c a .NET, b n c th chp ng d ng c-bin-d ch sang b t k my tnh no khc m khng ph i ng k cc thnh ph n hay ch nh s a Registry. Tuy nhin, h u h t cc ng d ng chuyn nghi p u i h i c m t ch ng trnh ci t t ng chp file vo cc v tr thch h p v thm cc shortcut c a ng d ng vo Start menu. Visual Studio .NET cho php b n xy d ng ki u ch ng trnh ci t nh th v i m t d n ci t (Setup Project). D n ci t l m t ki u d n c bi t trong Visual Studio .NET. Khc v i cc ki u d n khc, n thu c d ng khng- c-th-ngn-ng . Thay v vi t m hay k ch b n ci t, b n c u hnh cc ty ch n ci t thng qua trnh thi t k v c a s Properties. D n ny bin d ch thnh m t ng d ng ci t Windows Installer (file .msi). t o m t d n ci t, b n hy m d n c n tri n khai, nh p ph i vo gi i php trong c a s Solution Explorer, v ch n Add | New Project. Ch n Setup Project t nhm Setup And Deployment Projects (hnh 10-12).

308 Ch ng 10: L p trnh Windows

Hnh 10-12 D n ci

t trong Visual Studio .NET

t o m t trnh ci 1.

n gi n, b n c n hon t t cc b

cd

i y:

Nh p cc thng tin ci t c b n (nh Author, Manufacturer, ManufacturerUrl, Title, ProductName, v Version) trong c a s Properties. H u h t cc thi t l p ny u l nh ng m t s c s d ng trong Setup Wizard hay trong c a s Add/Remove Programs. Nh p ph i vo d n ci t trong Solution Explorer, v ch n View | File System c ci t (xem hi n th File System Designer. T i y, b n c th ch nh cc file s hnh 10-13).

2.

Hnh 10-13 File System Designer

Ban u, File System Designer ch hi n th m t s th m c th ng c s d ng. B n c th lin k t thm cc th m c b ng cch nh p ph i vo vng tr ng v ch n Add Special Folder. C cc ty ch n nh x n cc th m c Fonts, Favorites, Startup c a my tnh, cho php b n ci t file v shortcut t i cc v tr khc nhau.

Ch

309 ng 10: L p trnh Windows

3. 4.

Ch n Application Folder. S d ng c a s Properties, c u hnh th m c m c c n (m c nh s l Program Files\[Manufacturer]\ [ProductName]).

nh n u

thm ng d ng c a b n, ch n Application Folder, nh p ph i vo ph n bn ph i c a c a s v ch n Add | Project Output (xem hnh 10-14). Ch n Primary output, v nh p OK. B n c ng c th thm cc file khc (b ng cch ch n Add | File), ch ng h n icon m b n mu n s d ng cho shortcut c a ng d ng.

Hnh 10-14 Thm Project Output (file assembly)

5.

thm shortcut, ch n User's Programs Menu, nh p ph i vo ph n bn ph i c a c a c bi t s xu t hi n, cho php b n ch n s , v ch n Create New Shortcut. M t c a s m t file t m t trong cc th m c khc (xem hnh 10-15). V d , b n c th tm n th m c ng d ng v ch n file .exe c a ng d ng lm ch c a shortcut.

Hnh 10-15 Thm shortcut

310 Ch ng 10: L p trnh Windows

By gi , b n c m t d n ci t v i y ch c n ng, v b n c th bin d ch v tri n khai n. t o file .msi, nh p ph i vo d n ci t v ch n Build. M t file .msi cho d n ci t s c t o trong th m c bin, v i tn d n c a b n. B n c th s d ng cc trnh thi t k ci t khc c u hnh giao di n ci t, v thm cc thi t l p Registry, ci t cc file ph tr V d trong a CD nh km ch a m t ng d ng m u v d n ci t Windows Installer cho ng d ng ny. D n ci t c a Visual Studio .NET khng th ci t .NET Framework. N u c n .NET Framework, b n ph i ci t n b ng m t trong cc k thu t s c trnh by trong m c 10.20 tr c khi ci t ng d ng c a b n trn m t my client m i.

10.20
S d ng file Dotnetfx.exe.

Ci

t .NET Framework trn my client


n c th ch y cc

B n mu n ci t .NET Framework trn m t my tnh khc ng d ng .NET ty bi n.

D n ci t c a Visual Studio .NET khng th c s d ng ci t .NET Framework. B n nn ci t .NET Framework trn cc my client b ng file Dotnetfx.exe tr c khi ci t m t ng d ng .NET. B n c th thu l y Dotnetfx.exe b ng nhi u cch: B n c th t i Dotnetfx.exe t Microsoft [http://msdn.microsoft.com/library/default.asp? url=/downloads/list/netdevframework.asp]. Client c th t i Dotnetfx.exe b ng tnh n ng Microsoft Windows Update. B n c th tm th y Dotnetfx.exe trn .NET Framework SDK CD (trong th m c dotNETRedist). N c ng c trn Microsoft Visual Studio .NET CD (trong th m c dotNetFramework c a a 3) v trn Microsoft Visual Studio .NET DVD (trong th m c \wcu\dotNetFramework). B n c th t o m t bootstrapper setup ci t .NET Framework v r i ch y ng d ng ci t m t cch t ng. Cch ny lm cho vi c tri n khai thm r c r i v khng mang l i l i ch no thuy t ph c trong h u h t cc ng c nh. Tuy nhin, n u mu n th c hi n theo cch ny, b n hy tham kh o ti li u MSDN t i [http://msdn.microsoft.com/library/en-us/dnnetdep/html/dotnetframedepguid.asp].

10.21

K t h p m t ki u file vo ng d ng c a b n
ng m khi ng c u hnh d n ci i dng ch n cc ki u file no t.

B n mu n ng d ng c a b n t trong Windows Explorer. S d ng File Types Designer

B n c th ng k cc ki u file b ng cch ch nh s a Registry b ng tay (s d ng k thu t c trnh by trong m c 10.1). Tuy nhin, c m t cch hay h n l th c hi n cc c u hnh ny m t l t lc ci t v i cc tnh n ng i cng d n ci t Visual Studio .NET. Tr c h t, b n hy t o m t d n ci cc b c d i y: t nh c m t trong m c 10.19. K ti p, th c hi n

Ch

311 ng 10: L p trnh Windows

1.

Nh p ph i vo d n ci t trong Solution Explorer, v ch n View | File Types hi n th File Types Designer (xem hnh 10-16). T i y, b n c th ch nh cc ki u file c th s c ng k cho ng d ng c a b n trong qu trnh ci t.

Hnh 10-16 File Types Designer

2.

Nh p ph i vo trong c a s File Types Designer, v ch n Add File Type. ki u file, b n ph i ch nh cc thng tin sau y (xem hnh 10-17): Name: tn c a ki u ti li u. Extensions: ph n m r ng c a file. Command: ch ng trnh c ng k x l ki u file ny.

iv im i

Ngoi ra, b n c th ch nh icon (s d ng thu c tnh Icon) v l i m t (g m hai hay s d ng thu c tnh Description). ba t

Hnh 10-17 Thm m t ki u file

3.

Thm cc hnh ng (xem hnh 10-18): Name: m t hnh

c h tr cho ki u file. M i hnh

ng c ba m u thng tin

ng (v d , trong m t menu ng c nh c a Windows Explorer).

Arguments: l cc i s dng l nh s c truy n cho ng d ng. Bi u t ng %1 ngh a l truy n tn file. Thng th ng, m t thao tc open s ch truy n tn file, trong khi cc hnh ng khc c th truy n thm i s (v d , l nh print c th

312 Ch ng 10: L p trnh Windows

truy n tn file v i s /p). Ch ng trnh c a b n ph i ki m tra cc i s dng l nh v th c hi n hnh ng thch h p (trong tr ng h p ny l m file), nh c m t trong m c 10.7. Verb: cho bi t ki u hnh ng, nh open hay print.

Hnh 10-18 Thm hnh

ng cho ki u file

ng s d ng File Types Designer ti p qu n cc ki u file c b n nh .bmp, a .html, hay .mp3. H u h t ng i dng my tnh u c cc ng d ng m h chu ng truy xu t cc ki u file ny, v vi c ghi cc s thch ny ch lm t c gi n ng i dng c a b n thi!

10.22
B n mu n trch cc icon t m t file *.exe. S d ng hm khng-

Trch icon t file EXE


c-qu n-l ExtractIcon c a Win32 API.

B n c th g i hm ExtractIcon c a Win32 API c icon t m t file kh thi no (*.exe, c *.dll, *.ocx). L u r ng m t file th c thi c th ch a nhi u icon khc nhau, m i icon nh n d ng thng qua m t ch s t 0 n n. o n m d i y c icon u tin trong file *.exe r i hi n th n ln gc trn tri c a form hi n hnh.

Hnh 10-19 Trch icon t explorer.exe Private Declare Function ExtractIcon Lib "shell32.dll" _ Alias "ExtractIconA" (ByVal hInst As Integer, _ ByVal lpszExeFileName As String, ByVal nIconIndex As Integer) _ As System.IntPtr Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click

Ch ' Khai bo bi n qu n l icon. Dim hIcon As System.IntPtr Dim ic As Icon ' c icon u tin (ch s 0) c a file *.exe. hIcon = ExtractIcon(0, "C:\Windows\explorer.exe", 0) ' T o i t ng icon t ng ng. ic = Icon.FromHandle(hIcon) ' Hi n th icon ln gc trn tri c a form hi n hnh. Me.CreateGraphics.DrawIcon(ic, 0, 0) End Sub

313 ng 10: L p trnh Windows

10.23
S d ng l p System.Windows.Forms.Screen. L p System.Windows.Forms.Screen c s d ng thi t b hi n th trn m t h th ng n.

L y thng tin v mn hnh


phn gi i mn hnh) trn

B n c n l y thng tin v thi t b hi n th (ch ng h n m t h th ng.

bi u di n m t thi t b hi n th hay nhi u

V d d i y trnh by cch s d ng cc ph ng th c v thu c tnh c a l p Screen. Tr c thu l y m t m ng g m t t c cc mn hnh ck tn i tin, ta g i thu c tnh AllScreens c tr v , ta s thm tn thi t b , cc c n ( phn gi i), v i h th ng. i v i m i Screen vng lm vi c,... vo m t ListBox.

Hnh 10-20 Thng tin v mn hnh Private Sub BtnGetScreenInfo_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnGetScreenInfo.Click Dim Index As Integer Dim UpperBound As Integer ' Thu l y m ng g m t t c cc mn hnh c k t n i v i h th ng.

Dim Screens() As System.Windows.Forms.Screen = _ System.Windows.Forms.Screen.AllScreens UpperBound = Screens.GetUpperBound(0) For Index = 0 To UpperBound

314 Ch ng 10: L p trnh Windows ' i v i m i mn hnh, thm cc thu c tnh c a mn hnh ' vo ListBox. ListBox1.Items.Add("Device Name: " + Screens(Index).DeviceName) ListBox1.Items.Add("Bounds: " + Screens(Index).Bounds.ToString()) ListBox1.Items.Add("Type: " + Screens(Index).GetType().ToString()) ListBox1.Items.Add("Working Area: " + _ Screens(Index).WorkingArea.ToString()) ListBox1.Items.Add("Primary Screen: " + _ Screens(Index).Primary.ToString()) Next End Sub

315

Ch

ng 11: I U KI M WINDOWS

11

316

Ch

317 ng 11: i u ki m Windows

icrosoft .NET Framework c p m t m hnh i t ng a n ng cho vi c t o v c u hnh Windows Form. Cc ki u thu c khng gian tn System.Windows.Forms tr u t ng ha h u h t cc v n hc ba c a Win32 API v c ng c th th c hi n cc tc v v cng ph c t p khc. i u c ng c ngh a: h u h t cc gi i php b n c p d ng. s d ng trong th gi i Microsoft Visual Basic 6 s khng cn c Trong ch ng ny, b n s bi t cch n m b t cc l p i u ki m .NET. V d , b n s h c m t s nguyn t c c b n nh thm i u ki m vo form lc th c thi (m c 11.1), s d ng thao tc ko-v-th (m c 11.11), l u v tr v kch th c c a c a s (m c 11.18). B n c ng s bi t cch nng cao TextBox v ComboBox (m c 11.8 v 11.9), s d ng s th a k form (m c 11.15) v menu ng c nh (m c 11.12 v 11.13), lm vi c trong nhi u ngn ng (m c 11.14), v p d ng phong cch Windows XP (m c 11.21).

M
11.1

Thm i u ki m vo form lc th c thi


it ng i u ki m ny vo

B n c n thm m t i u ki m vo form lc th c thi, khng ph i lc thi t k . T o m t th hi n c a l p i u ki m ph h p, v thm m t form hay m t i u ki m container.

Trong th gi i .NET, khng c s khc bi t no gi a vi c t o i u ki m lc thi t k v vi c t o i u ki m lc th c thi. Khi b n t o m t i u ki m lc thi t k , Microsoft Visual Studio .NET s thm o n m .NET c n thi t vo th t c InitializeComponent c a form. B n c ng c th t o i u ki m v i o n m gi ng nh v y sau khi form c hi n th . lm c nh th , b n c n th hi n ha m t l p i u ki m, c u hnh cc thu c tnh ( c bi t l kch th c v t a v tr), v r i thm i u ki m ny vo form ho c i u ki m u cung c p thu c tnh Controls tham chi u n m t container. M i i u ki m ControlCollection g m t t c cc i u ki m con. thm m t i u ki m con, b n c n g i ph ng th c ControlCollection.Add. Ngoi ra, n u mu n th l cc s ki n cho i u ki m m i, b n c th g n chng vo cc th t c hi n c b ng l nh AddHandler. ng d ng d i y s t o ng cc Button v g n cc hm th l s ki n Click c a chng. Cc nt c t vo m t v tr ng u nhin trn c a s , c nh s b ng m t bi n m m c-form, v c theo di trong m t ArrayList. Nt Clear All cho php ng i dng g b t t c cc nt c-t o- ng (s d ng ph ng th c ControlCollection.Remove).
Public Class ButtonGenerator Inherits System.Windows.Forms.Form ' (B qua ph n m designer.)

Private ButtonCounter As Integer = 0 Private DynamicButtons As New ArrayList() Private Sub cmdCreateNew_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdCreateNew.Click ' T o Button m i. Dim NewButton As New Button() ' C u hnh cc thu c tnh c a Button. Dim Rand As New Random()

318 Ch ng 11: i u ki m Windows NewButton.Size = New System.Drawing.Size(88, 28) NewButton.Left = Rand.Next(150, Me.Width - NewButton.Width) NewButton.Top = Rand.Next(100, Me.Height - NewButton.Height) ButtonCounter += 1 NewButton.Text = "New Button " & ButtonCounter.ToString() ' Thm Button vo form. Me.Controls.Add(NewButton) ' G n hm th l s ki n Click. AddHandler NewButton.Click, AddressOf NewButton_Click ' L u tr Button vo t p h p. DynamicButtons.Add(NewButton) End Sub Private Sub NewButton_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) ' L y tham chi u n Button c nh p vo. Dim Button As Button = CType(sender, Button) MessageBox.Show("You clicked: " & Button.Text) End Sub Private Sub cmdClear_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdClear.Click Dim Button As Button For Each Button In DynamicButtons ' G b Button. Me.Controls.Remove(Button) Next ' Xa r ng t p h p. DynamicButtons.Clear() ButtonCounter = 0 End Sub End Class

Hnh 11-1 T o Button b ng m l nh

Ch

319 ng 11: i u ki m Windows

11.2
S d ng thu c tnh Control.Tag.

L u tr d li u trong i u ki m

B n mu n lin k t m t m u d li u vo m t i u ki m.

M i l p d n xu t t System.Windows.Forms.Control u cung c p thu c tnh Tag v b n c th s d ng n l u tr m t tham chi u n b t k ki u i t ng no. Thu c tnh Tag khng c i u ki m hay .NET Framework s d ng m c dnh lm n i l u tr cc thng tin c-th- ng-d ng. Khi l y d li u t thu c tnh Tag, b n s c n p i t ng t ki u System.Object thnh ki u g c c a n. Ngoi ra, m t vi l p khc khng d n xu t t Control c ng cung c p thu c tnh Tag, ch ng h n cc l p ListViewItem v TreeNode (trnh by cc item trong m t ListView hay TreeView). M t l p khng cung c p thu c tnh Tag l MenuItem. Xt l p ty bi n Person d
Public Class Person Private _Name As String Private _Address As String Private _BirthDate As Date Public Property Name() As String Get Return _Name End Get Set(ByVal Value As String) _Name = Value End Set End Property Public Property Address() As String Get Return _Address End Get Set(ByVal Value As String) _Address = Value End Set End Property Public Property BirthDate() As Date Get Return _BirthDate End Get Set(ByVal Value As Date) _BirthDate = Value End Set End Property Public Sub New(ByVal name As String, ByVal address As String, _ ByVal birthdate As Date) Me.Name = name Me.Address = address Me.BirthDate = birthdate End Sub End Class

i y (l u tr thng tin v m i c nhn):

320 Ch ng 11: i u ki m Windows

th nghi m thu c tnh Tag, b n c th t o m t form v i m t TreeView v thm vo nhi u nt. M i nt s m t m t ng i. M t vi thng tin s c hi n th trong ph n text c a nt, s c l u tr trong thu c tnh Tag. nh ng i t ng Person y
Private Sub TagTestForm_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Thm b n item vo TreeView. Dim NewPerson As New Person("Nguy n Ng c Bnh Ph "Ti n Giang", New DateTime(1981, 2, 17)) Dim NewNode As New TreeNode(NewPerson.Name) NewNode.Tag = NewPerson treePersons.Nodes.Add(NewNode) NewPerson = New Person("L Tr n Nh t Qu nh", _ "Lm ng", New DateTime(1982, 11, 26)) NewNode = New TreeNode(NewPerson.Name) NewNode.Tag = NewPerson treePersons.Nodes.Add(NewNode) NewPerson = New Person("Nguy n Quang Nam", _ "Lm ng", New DateTime(1981, 6, 30)) NewNode = New TreeNode(NewPerson.Name) NewNode.Tag = NewPerson treePersons.Nodes.Add(NewNode) NewPerson = New Person(" inh Phan Ch Tm", _ "Long An", New DateTime(1981, 4, 11)) NewNode = New TreeNode(NewPerson.Name) NewNode.Tag = NewPerson treePersons.Nodes.Add(NewNode) End Sub
[

ng", _

Hnh 11-2 L u tr d li u trong thu c tnh Tag

Khi m t nt d ng lm t

c ch n, i Label.

it

ng Person t

ng ng

c l y ra, v thng tin ny

cs

Private Sub treePersons_AfterSelect(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.TreeViewEventArgs) _ Handles treePersons.AfterSelect

Ch

321 ng 11: i u ki m Windows

Dim SelectedPerson As Person = CType(e.Node.Tag, Person) lblSelected.Text = "B n ang ch n " & SelectedPerson.Name & _ " (sinh ngy " & SelectedPerson.BirthDate.ToString() & _ " t i " & SelectedPerson.Address & ")" End Sub

B n c th s d ng cch ti p c n t ng t l u tr cc d li u ph c t p h n (ch ng h n, m t tham chi u n m t DataRow bi u di n nt) ho c cc thng tin n gi n h n (ch ng h n, m t nh danh duy nh t cho php b n tm n p thng tin khi c n).

11.3
B n mu n cung c p ch c n ng gi ng nh trong Visual Basic .NET. m ng

Thay th m ng i u ki m
i u ki m c a Visual Basic 6

T o m t hm th l s ki n th l nhi u i u ki m, v xt thng s sender nh n bi t i u ki m no pht sinh s ki n. C th t o m t m ng i u ki m trong Visual Basic .NET b ng cch s d ng khng gian tn VisualBasic.Compatibility. Tuy nhin, c cc gi i php khc ch s d ng cc tnh n ng .NET s n c, ho t ng t t h n, v d dng qu n l h n l s d ng cc tnh n ng c ny. M t trong cc cch ti p c n d nh t l th l nhi u s ki n ch v i m t hm th l s ki n. Sau , b n c th xc nh i u ki m no pht sinh s ki n b ng cch xt thng s sender. i m h n ch c a cch ti p c n ny l t t c cc s ki n c th l b i hm ph i c cng ch k. Th t c d i y th l s ki n CheckedChanged cho ba RadioButton. Ty thu c RadioButton no c nh p vo, m t TextBox khc s c kch ho t.

Hnh 11-3 Th l nhi u s ki n ch v i m t hm th l s ki n


[

Public Class MultipleControlHandlerTest Inherits System.Windows.Forms.Form ' (B qua ph n m designer.)

Private Sub RadioButton_CheckedChanged( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, _ RadioButton3.CheckedChanged ' Xc nh i u ki m no pht sinh s ki n. Dim RadioButton As RadioButton = CType(sender, RadioButton)

322 Ch ng 11: i u ki m Windows ' V hi u t t c TextBox1.Enabled TextBox2.Enabled TextBox3.Enabled cc TextBox. = False = False = False

' Kch ho t TextBox k t giao. If RadioButton Is RadioButton1 Then TextBox1.Enabled = True ElseIf RadioButton Is RadioButton2 Then TextBox2.Enabled = True ElseIf RadioButton Is RadioButton3 Then TextBox3.Enabled = True End If End Sub End Class

Trong vi tr ng h p, c th b n khng c n xt n ki u i u ki m. Thay vo , b n p sender thnh m t i t ng Control v r i l y thng tin c n thi t. V d , b n mu n hi n th dng text tr gip trong m t i u ki m khc khi ng i dng di chuy n chu t trn m t Button. B n c th l u tr ph n text ny cho m i Button trong thu c tnh Tag c a Button. Trong s ki n MouseMove, b n ch c n l y ph n text ny v hi n th t ng ng:
Private Sub Button_MouseMove(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles Button1.MouseMove, Button2.MouseMove, _ Button3.MouseMove, Button4.MouseMove Dim ctrl As Control = CType(sender, Control) lblHelpText.Text = CType(ctrl.Tag, String) End Sub

11.4

Xa ph n text c a t t c cc i u ki m nh p trn form

B n mu n xa ph n text c a t t c cc i u ki m nh p (input control) trn m t form. Duy t ( quy) qua t p h p cc i u ki m, v xa thu c tnh Text m i khi tm th y m t i u ki m nh p. B n c th duy t qua cc i u ki m trn form b ng t p h p Form.Controls, t p ny ch a t t c cc i u ki m n m tr c ti p trn b m t form. Tuy nhin, n u vi i u ki m trong s l i u ki m container (nh GroupBox, Panel, ho c TabPage), chng c th ch a nhi u i u ki m n a. Do , c n s d ng k thu t quy ki m tra t p h p Controls. V d , form d cc TextBox: i y s g i hm ClearControls m t cch quy xa ph n text c a t t c

Public Class TestClearForm Inherits System.Windows.Forms.Form ' (B qua ph n m designer.)

Private Sub cmdClear_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdClear.Click

Ch ClearControls(Me) End Sub Private Sub ClearControls(ByVal ctrl As Control) ' i u ki m s b xa n u n l TextBox. If TypeOf ctrl Is TextBox Then ctrl.Text = "" End If

323 ng 11: i u ki m Windows

' X l cc i u ki m m t cch quy. ' i u ny c n thi t khi c m t i u ki m ch a nhi u ' i u ki m khc (v d , khi b n s d ng Panel, ' GroupBox, ho c i u ki m container no khc). Dim ctrlChild As Control For Each ctrlChild In ctrl.Controls ClearControls(ctrlChild) Next End Sub End Class

Hnh 11-4 Form t xa

11.5
B n mu n l u tr cc hi n th c a chng.

L u t r c c
it

i t ng trong m t danh sch

ng ty bi n trong m t danh sch, v ty bi n vi c

B n c th tr c ti p thm cc i t ng ty bi n vo t p h p ListBox.Items. Tuy thi t l p ph n nhin, b n ph i chp ph ng th c ToString trong l p ty bi n text s xu t hi n trong ListBox, ho c thi t l p thu c tnh ListBox.DisplayMember. i u ki m danh sch .NET (ListBox, ComboBox, v CheckedListBox) c th l u tr b t k ki u i t ng no, cho d l m t chu i thng th ng ho c m t l p hay c u trc ty bi n c ch a nhi u m u thng tin. Tuy nhin, khi b n l u tr cc l p ty bi n trong m t ListBox, ph n text khng hi n th ng. Thay vo , tn l p y s c hi n th cho m i item trong ListBox (xem hnh 11-5 bn tri). l v ListBox g i ph ng th c ToString c a i t ng n m trong l y ph n text s hi n th . N u b n khng thm ph ng th c ToString, l p c a b n s s d ng hi n th c ToString m c nh m n th a k t l p System.Object (ch tr v tn l p y ).

324 Ch ng 11: i u ki m Windows

L p ty bi n d

i y c th

c s d ng trong m t ListBox m khng g p tr ng i g:

Public Class Person Private _Name As String Private _Address As String Private _BirthDate As Date Public Property Name() As String Get Return _Name End Get Set(ByVal Value As String) _Name = Value End Set End Property Public Property Address() As String Get Return _Address End Get Set(ByVal Value As String) _Address = Value End Set End Property Public Property BirthDate() As Date Get Return _BirthDate End Get Set(ByVal Value As Date) _BirthDate = Value End Set End Property Public Sub New(ByVal name As String, ByVal address As String, _ ByVal birthdate As Date) Me.Name = name Me.Address() = address Me.BirthDate = birthdate End Sub Public Overrides Function ToString() As String Return Name End Function End Class

B n c th thm cc

it

ng Person vo ListBox gi ng nh thm thng tin chu i:


ng", "Ti n Giang", _

Dim NewPerson As New Person("Nguy n Ng c Bnh Ph New DateTime(1981, 2, 17)) lstPersons.Items.Add(NewPerson) NewPerson = New Person("L Tr n Nh t Qu nh", "Lm New DateTime(1982, 11, 26)) lstPersons.Items.Add(NewPerson)

ng", _

NewPerson = New Person("Thi Thanh Phong", "Tr Vinh", _ New DateTime(1979, 12, 10)) lstPersons.Items.Add(NewPerson)

Ch NewPerson = New Person("Thi Kim Ph ng", "TP.HCM", _ New DateTime(1982, 4, 3)) lstPersons.Items.Add(NewPerson)

325 ng 11: i u ki m Windows

B n c ng c th l y

it

ng Person

i v i item

c ch n:

Dim SelectedPerson As Person SelectedPerson = CType(lstpersons.SelectedItem, Person)

Trong ListBox, cc item s xu t hi n nh hnh 11-5 bn ph i. K thu t ny lm vi c t t nh t n u b n c kh n ng ch nh s a m l nh cho l p ty bi n khi c n. Tuy nhin, c tr ng h p b n mu n s d ng m t i t ng nh ng l i khng th ch nh s a m l nh c a n c th l m t l p trong .NET Class Library. Trong tr ng h p ny, b n c th s d ng thu c tnh ListBox.DisplayMember. N nh n vo tn c a m t thu c tnh bn trong i t ng. V d , b n c th thi t l p DisplayMember thnh Name v ListBox s c hi n th c l hi n th tn i v i m i item. cch ny c th lm vi c c, Name ph i m t thu c tnh y , ch khng ch l m t bi n cng khai.

Hnh 11-5 Cc

it

ng ty bi n trong m t ListBox

11.6
B n mu n cu n m t ListBox (b ng m l nh) sch c th c nhn th y.

Bu c ListBox cu n xu ng
nh ng item no trong danh c nhn th y u tin).

Thi t l p thu c tnh ListBox.TopIndex (thi t l p item

Trong vi tr ng h p, b n c m t ListBox l u tr m t l ng thng tin ng k ho c m t ListBox m b n ph i thm thng tin vo m t cch nh k . Tr ng h p th ng g p l thng tin m i nh t ( c thm vo cu i danh sch) l i l thng tin quan tr ng h n thng tin c th nhn th y cc item v a m i thm vo. u danh sch. M t gi i php l cu n ListBox Form d i y g m m t ListBox v hai Button (xem hnh 11-6). M t Button s thm 10 item vo ListBox, trong khi Button kia s thm 10 item vo ListBox r i cu n n trang cu i cng b ng thu c tnh TopIndex.
Public Class ListScrollTest Inherits System.Windows.Forms.Form ' (B qua ph n m designer.)

Private Sub cmdAdd_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdAdd.Click AddTenItems() End Sub Private Sub cmdAddScroll_Click(ByVal sender As System.Object, _

326 Ch ng 11: i u ki m Windows ByVal e As System.EventArgs) Handles cmdAddScroll.Click AddTenItems() ListBox1.TopIndex = ListBox1.Items.Count - 1 End Sub Private Counter As Integer Private Sub AddTenItems() Dim i As Integer For i = 0 To 9 Counter += 1 ListBox1.Items.Add("Item " & Counter.ToString()) Next End Sub End Class

Hnh 11-6 Cu n ListBox

n trang cu i cng

11.7

S d ng hyperlink

B n mu n thm m t hyperlink vo form sao cho khi c nh p vo, n s th c hi n m t hnh ng (ch ng h n, m m t website no trong Microsoft Internet Explore). S d ng i u ki m LinkLabel.
LinkLabel l m t ki u Label

c bi t, c th ch a cc hyperlink. B n c n nh ngh a cc xc nh hnh ng no s c th c hi n. hyperlink v r i th l s ki n LinkClicked

t o m t hyperlink, b n hy thm i u ki m LinkLabel vo form, r i nh p ton b text vo thay i ph n text lin thu c tnh Text. Theo m c nh, t t c text u n m trong lin k t. k t, b n hy tm thu c tnh LinkArea trong c a s Properties v nh p vo nt ba ch m (...) m m t trnh so n th o c bi t cho php b n nh d u ph n text lin k t (xem hnh 11-7).

Hnh 11-7 Thi t l p ph n text lin k t cho LinkLabel

Ch

327 ng 11: i u ki m Windows

Tuy nhin, m t ty ch n linh ho t h n l thm cc lin k t b ng ph ng th c LinkLabel.Links.Add. Cch ny cho php b n ch nh nhi u lin k t cho cng m t LinkLabel. B n ph i cho bi t v tr ( nh s t 0) c a m u t u tin trong ph n text lin k t, v chi u di c a ph n text lin k t. B n cn c th k t h p thm d li u vo m i lin k t b ng cch cung c p m t thng s Object (ty ch n). V d , o n m d i y thm hai lin k t v k t h p m i lin k t v i m t chu i cho bi t website t ng ng:
Private Sub LinkTest_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Thm lin k t cho "www.alibaba.com" lnkSite.Links.Add(51, 15, "http://www.alibaba.com") ' Thm lin k t cho "Microsoft" lnkSite.Links.Add(77, 9, "http://www.microsoft.com") End Sub

Khi s ki n LinkClicked x y ra, b n c th th c thi b t k m .NET no. N u LinkLabel c a b n c nhi u lin k t c nh ngh a, c th b n s c n xt i t ng LinkLabelLinkClickedEventArgs l y d li u k t h p v xc nh hnh ng t ng ng. o n m d i y s m Internet Explorer v i ph n text c k t h p v i lin k t.
Private Sub lnkSite_LinkClicked(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) _ Handles lnkSite.LinkClicked ' nh d u lin k t e.Link.Visited = True c vi ng th m.

' Thu l y URL. Dim Url As String = CType(e.Link.LinkData, String) ' M trnh duy t web m c Process.Start(Url) End Sub nh.

N u mu n thay i mu c a lin k t c nh p vo (nh trong trnh duy t web), b n hy thi t l p thu c tnh LinkLabelLinkClickedEventArgs.Visited l True.

Hnh 11-8 LinkLabel v i hai lin k t

328 Ch ng 11: i u ki m Windows

11.8
Thm hm th l s

Ch cho php nh p s vo TextBox


ki n TextBox.KeyPress, v thi t l p thu c tnh b qua c nh n phm khng h p l .

B n c n t o m t TextBox sao cho TextBox ny b qua t t c cc c nh n phm khng ph i s .


KeyPressEventArgs.Handled l True

Cch t t nh t hi u ch nh u vo khng h p l l khng cho n c nh p ngay t u. D dng hi n th c cch ti p c n ny v i TextBox v n cung c p s ki n KeyPress, s ki n ny x y ra sau khi c nh n phm c ti p nh n nh ng tr c khi n c hi n th . B n c th s h y b c nh n phm khng h p l b ng cch thi t d ng i s s ki n KeyPressEventArgs l p thu c tnh Handled l True. cho php u vo ch l s , b n c n cho php m t c nh n phm ch khi n t ng ng v i m t s (0 n 9) ho c m t phm i u khi n c bi t (nh phm delete ho c m i tn). K t v a nh n c c p cho s ki n KeyPress thng qua thu c tnh KeyPressEventArgs.KeyChar. ki m tra B n c th s d ng hai ph ng th c chia s c a l p Char l IsDigit v IsControl nhanh k t . D i y l hm th l s ki n m b n s s d ng ng n u vo khng ph i s :
Private Sub TextBox1_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TextBox1.KeyPress If Not Char.IsDigit(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then e.Handled = True End If End Sub

Ch r ng o n m trn b qua d u ch m th p phn. ch nh o n m nh sau:

cho php k t ny, b n c n hi u

If Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Then ElseIf e.KeyChar = "." And TextBox1.Text.IndexOf(".") = -1 Then Else e.Handled = True End If

o n m ny ch cho php m t d u ch m th p phn, nh ng n khng gi i h n s ch s c th c dng.

11.9

S d ng ComboBox c tnh n ng auto-complete


ng hon t t nh ng g ng i dng g vo d a trn

B n c n t o m t ComboBox t danh sch cc item c a n.

B n c th hi n th c m t ComboBox c tnh n ng auto-complete b ng cch th l s ki n KeyPress. Cc ng d ng chuyn nghi p th ng s d ng m t d ng i u ki m auto-complete no . i u ki m ny c th l p y cc gi tr d a trn danh sch cc l a ch n tr c (nh

Ch

329 ng 11: i u ki m Windows

Microsoft Excel th ng lm khi nh p gi tr cho cell) ho c x xu ng m t danh sch cc gi tr g n gi ng (nh Microsoft Internet Explorer th ng lm khi g vo URL). B n c th t o m t ComboBox c tnh n ng auto-complete b ng cch th l s ki n KeyPress v TextChanged, tm ki m cc item trng kh p trong danh sch, v r i i n item thch h p vo. B c quan tr ng l sau khi i n item trng kh p, b n ph i ch n (bi en) cc k t gi a i m chn hi n t i v i m cu i c a text. i u ny cho php ng i dng ti p t c g v thay th ph n auto-complete khi c n.

Hnh 11-9 ComboBox c tnh n ng auto-complete ' Bi n c dng khi m t phm c bi t c nh n ' (trong tr ng h p ny, thao tc thay th text s Private ControlKey As Boolean = False

c b

qua).

' Xc nh xem phm c bi t c c nh n hay khng. Private Sub TestCombo_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles TestCombo.KeyPress ' L y tham chi u n ComboBox g i s ki n ny. Dim Combo As ComboBox = CType(sender, ComboBox) If Asc(e.KeyChar) = Keys.Escape Then ' Xa text. Combo.SelectedIndex = -1 Combo.Text = "" ControlKey = True ElseIf Char.IsControl(e.KeyChar) Then ControlKey = True Else ControlKey = False End If End Sub ' Th c hi n thay th text. Private Sub TestCombo_TextChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles TestCombo.TextChanged ' L y tham chi u n ComboBox g i s ki n ny. Dim Combo As ComboBox = CType(sender, ComboBox) If Combo.Text <> "" And Not ControlKey Then ' Tm ki m item trng kh p. Dim MatchText As String = Combo.Text Dim Match As Integer = Combo.FindString(MatchText) ' N u tm th y th chn n vo. If Match <> -1 Then Combo.SelectedIndex = Match ' Ch n (bi en) ph n text v a thm vo

330 Ch ng 11: i u ki m Windows ' n c th c thay th n u ng i dng ki p t c g. Combo.SelectionStart = MatchText.Length Combo.SelectionLength = Combo.Text.Length Combo.SelectionStart End If End If End Sub

11.10

S p x p ListView theo c t b t k
ng th c Sort ch d a trn c t u tin

B n c n s p x p m t ListView, nh ng ph m s p.

T o m t hi n th c cho giao di n System.Collections.IComparer c th s p x p cc i t ng ListViewItem (ki u IComparer c th s p x p d a trn b t k tiu chu n no b n mu n). Thi t l p thu c tnh ListView.ListViewItemSorter v i m t th hi n c a ki u IComparer tr c khi g i ph ng th c ListView.Sort. ng th c Sort s p cc item theo th t alphabet d a trn ph n text trong c t u tin. N u mu n s p x p d a trn cc gi tr c t khc ho c s p th t cc item theo b t k cch no khc, b n c n t o m t hi n th c ty bi n cho giao di n IComparer. Giao di n IComparer c gi i thi u trong m c 3.9. N nh ngh a m t ph ng th c c tn cs p l Compare, ph ng th c ny nh n vo hai i t ng v xc nh i t ng no s tr c. L p ty bi n ListViewItemComparer d i y hi n th c giao di n IComparer v c p c s d ng s p x p; thm hai thu c tnh: Column v Numeric. Column cho bi t c t no s c thi t l p l True n u b n mu n th c hi n so snh theo th v Numeric l m t c Boolean, t s thay v so snh theo th t alphabet.
ListView cung c p ph

Hnh 11-10 S p x p ListView theo c t b t k Public Class ListViewItemComparer Implements IComparer Private _Column As Integer Private _Numeric As Boolean = False Public Property Column() As Integer Get

Ch Return _Column End Get Set(ByVal Value As Integer) _Column = Value End Set End Property Public Property Numeric() As Boolean Get Return _Numeric End Get Set(ByVal Value As Boolean) _Numeric = Value End Set End Property Public Sub New(ByVal columnIndex As Integer) Column = columnIndex End Sub

331 ng 11: i u ki m Windows

Public Function Compare(ByVal x As Object, ByVal y As Object) _ As Integer Implements System.Collections.IComparer.Compare Dim ListX As ListViewItem = CType(x, ListViewItem) Dim ListY As ListViewItem = CType(y, ListViewItem) If Numeric Then ' Chuy n text thnh s tr c khi so snh. ' N u chuy n i th t b i, s d ng gi tr 0. Dim ListXVal, ListYVal As Decimal Try ListXVal = Decimal.Parse(ListX.SubItems(Column).Text) Catch ListXVal = 0 End Try Try ListYVal = Decimal.Parse(ListY.SubItems(Column).Text) Catch ListYVal = 0 End Try Return Decimal.Compare(ListXVal, ListYVal) Else ' Gi nguyn text nh d ng chu i ' v th c hi n so snh theo th t alphabet. Dim ListXText As String = ListX.SubItems(Column).Text Dim ListYText As String = ListY.SubItems(Column).Text Return String.Compare(ListXText, ListYText) End If End Function End Class

By gi , s p x p ListView, b n c n t o m t i t ng ListViewItemComparer, c u hnh n m t cch h p l, v r i g n n vo thu c tnh ListView.ListViewItemSorter tr c khi g i ph ng th c ListView.Sort.

332 Ch ng 11: i u ki m Windows

o n m d i y (hm th l s ki n ColumnClick) s t ng i dng nh p vo header c a m t c t trong ListView.

ng s p x p cc item m i khi

Private Sub ListView1_ColumnClick(ByVal sender As Object, _ ByVal e As System.Windows.Forms.ColumnClickEventArgs) _ Handles ListView1.ColumnClick Dim Sorter As New ListViewItemComparer(e.Column) ListView1.ListViewItemSorter = Sorter ListView1.Sort() End Sub

11.11
Kh i ng thao tc ko-v-th b ng ph s ki n DragEnter v DragDrop.

S d ng tnh n ng ko-v-th
ng th c DoDragDrop, v r i ph n ng v i

B n c n s d ng tnh n ng ko-v-th trao i thng tin gi a hai i u ki m (c ng c th trong cc c a s ho c cc ng d ng khc nhau)

Thao tc ko-v-th cho php ng i dng chuy n thng tin t n i ny n n i khc b ng cch nh p vo m t item v ko r n n m t v tr khc. Thao tc ko-v-th g m ba b c c b n sau y: 1. 2. Ng i dng nh p vo m t i u ki m, gi chu t, v b t u ko r. N u i u ki m ny h tr tnh n ng ko-v-th , n s thi t l p m t vi thng tin. Ng i dng r chu t ln m t i u ki m khc. N u i u ki m ny ch p nh n ki u n i dung c r n, con tr chu t s i thnh m t bi u t ng ko-v-th c bi t hnh m i tn v trang th ng bn trong 3. . cg i n i u ki m ch, v i u ki m ny c . N u khng, con tr chu t s i thnh m t vng trn v i m t v ch

Khi ng i dng th chu t, d li u th x l n m t cch ph h p.

b t u m t thao tc ko-v-th , b n hy g i ph ng th c DoDragDrop c a i u ki m ngu n. Lc ny, b n c n cung c p d li u v ch nh ki u ho t ng s c h tr (chp, di chuy n). V d d i y s kh i ng m t thao tc ko-v-th khi ng i dng nh p vo m t TextBox:
Private Sub TextBox_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles TextBox1.MouseDown, TextBox2.MouseDown Dim txt As TextBox = CType(sender, TextBox) ' Ch n text ( ng txt.SelectAll() i dng bi t c d li u g ang c r).

' Kh i ng thao tc ko-v-th . txt.DoDragDrop(txt.Text, DragDropEffects.Copy) End Sub

Ch

333 ng 11: i u ki m Windows

c th nh n d li u c r n, i u ki m ch ph i c thu c tnh AllowDrop l True. i u ki m ny s nh n s ki n DragEnter khi chu t r d li u ln n. Lc ny, b n c th ki m tra d li u ang c r n, quy t nh xem i u ki m c th ch p nh n vi c th hay khng, v thi t l p thu c tnh DragEventArgs.Effect t ng ng, nh c trnh by trong o n m d i y:
Private Sub TextBox_DragEnter(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles TextBox1.DragEnter, TextBox2.DragEnter ' Cho php d li u text. If (e.Data.GetDataPresent(DataFormats.Text)) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub

Hnh 11-11 M t ng d ng th nghi m tnh n ng ko-v-th

B c cu i cng l ph n ng v i s ki n DragDrop, s ki n ny x y ra khi ng chu t:


Private Sub TextBox_DragDrop(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) _ Handles TextBox1.DragDrop, TextBox2.DragDrop ' Nh p d li u vo TextBox. Dim txt As TextBox = CType(sender, TextBox) txt.Text = CType(e.Data.GetData(DataFormats.Text), String) End Sub

i dng th

S d ng cc o n m trn, b n c th t o m t ng d ng th nghi m tnh n ng ko-v-th n gi n (xem hnh 11-11): cho php text c ko r t TextBox ny n TextBox khc. B n c ng c th ko r text t m t ng d ng khc v th n vo m t trong hai TextBox ny.

11.12

Lin k t menu ng c nh vo i u ki m

B n c n lin k t m t menu ng c nh vo m i i u ki m trn form (cc menu ny khc nhau). Tuy nhin, b n khng mu n vi t nhi u hm th l s ki n ring r hi n th menu ng c nh cho m i i u ki m.

334 Ch ng 11: i u ki m Windows

Vi t m t hm th l s ki n chung thu l y menu ng c nh m t i u ki m, v r i hi n th menu ny trn i u ki m ph h p.

ck th pv i

B n c th lin k t m t i u ki m v i m t menu ng c nh b ng cch thi t l p thu c tnh ContextMenu c a i u ki m. Tuy nhin, y ch l m t ti n l i hi n th menu ng c nh, b n ph i thu l y menu v g i ph ng th c Show c a n. Thng th ng, b n hi n th c logic ny trong hm th l s ki n MouseDown. Th c ra, logic dng hi n th menu ng c nh hon ton gi ng nhau, khng quan tm n c th a k t l p c s i u ki m g. M i i u ki m u h tr thu c tnh ContextMenu ( Control), ngh a l b n c th d dng vi t c m t hm th l s ki n chung hi n th cc menu ng c nh cho t t c cc i u ki m. Th t c d i y th l s ki n MouseDown cho m t Label, m t PictureBox, v m t TextBox, v hi n th menu ng c nh k t giao:
Private Sub Control_MouseDown(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles PictureBox1.MouseDown, Label1.MouseDown, TextBox1.MouseDown If e.Button = MouseButtons.Right Then Dim ctrl As Control = CType(sender, Control) If Not ctrl.ContextMenu Is Nothing Then ctrl.ContextMenu.Show(ctrl, New Point(e.X, e.Y)) End If End If End Sub

11.13
S d ng ph

S d ng m t ph n menu chnh cho menu ng c nh


ng th c CloneMenu sao l i m t ph n menu chnh.

B n mu n t o m t menu ng c nh g m cc item gi ng v i m t s item trong menu chnh c a ng d ng.

Trong nhi u ng d ng, menu ng c nh c a m t i u ki m sao l i m t ph n trong menu chnh. Khc v i Visual Basic 6, .NET phn bi t menu ng c nh v menu chnh, v m t item ch c th thu c v m t menu t i m t th i i m. Gi i php l t o b n sao c a m t ph n menu chnh b ng ph ng th c CloneMenu. Ph ng th c ny khng ch chp cc MenuItem (v cc submenu), m cn ng k m i MenuItem v i cng hm th l s ki n. Do , khi ng i dng nh p vo m t item trong menu ng c nh (b n sao), hm th l s ki n t ng ng s c pht sinh nh th ng i dng nh p vo item trong menu chnh. o n m d i y s sao l i t t c cc item trong menu File:
Dim mnuContext As New ContextMenu() Dim mnuItem As MenuItem ' Chp cc item t menu File vo menu ng c nh. For Each mnuItem In mnuFile.MenuItems mnuContext.MenuItems.Add(mnuItem.CloneMenu()) Next

Ch ' G n menu ng c nh vo TextBox. TextBox1.ContextMenu = mnuContext

335 ng 11: i u ki m Windows

Gi

y b n c th hi n th menu ng c nh ny nh bnh th

ng:

Private Sub TextBox1_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles TextBox1.MouseDown If e.Button = MouseButtons.Right Then TextBox1.ContextMenu.Show(TextBox1, New Point(e.X, e.Y)) End If End Sub

M t ng d ng th nghi m

n gi n

c trnh by trong hnh 11-12.

Hnh 11-12 Chp m t ph n menu chnh vo menu ng c nh

11.14

T o form a ngn ng

B n c n t o m t form kh -b n- a-ha (localizable form), ngh a l form ny c th c tri n khai nhi u ngn ng khc nhau. L u tr t t c cc thng tin c-th-b n- a trong cc file resource (cc file ny s c bin d ch thnh Satellite Assembly). .NET Framework h tr s b n a ha (localization) thng qua vi c s d ng file resource. t ng c b n l l u tr cc thng tin c-th-b n- a (ch ng h n, ph n text c a m t Button) trong m t file resource. Theo , b n c th t o nhi u file resource cho nhi u b n a khc nhau r i bin d ch chng thnh cc Satellite Assembly. Khi b n ch y ng d ng, .NET s t ng s d ng ng Satellite Assembly d a trn cc thi t l p b n a (locale setting) c a my tnh hi n hnh. B n c th c v ghi cc file resource b ng m l nh. Tuy nhin, Visual Studio .NET c ng h tr vi c thi t k cc form c-b n- a-ha: 1. Tr c tin, thi t l p thu c tnh Localizable c a form l True trong c a s Properties.

336 Ch ng 11: i u ki m Windows

2.

Thi t l p thu c tnh Language c a form l b n a m b n mu n nh p thng tin (xem hnh 11-13). K , c u hnh cc thu c tnh kh -b n- a-ha cho t t c cc i u ki m trn form. Thay v l u tr nh ng thay i ny trong ph n m thi t k form, Visual gi d li u c a b n. Studio .NET t o m t file resource m i

Hnh 11-13 Ch n m t ngn ng

b n

a ha form

3.

L p l i b c 2 cho m i ngn ng m b n mu n h tr . M i l n nh th , m t file resource m i s c t o ra. N u b n thay i thu c tnh Language thnh b n a m b n c u hnh, cc thi t l p tr c c a b n s xu t hi n tr l i, v b n c th ch nh s a chng.

By gi , b n c th bin d ch v th nghi m ng d ng c a b n trn cc h th ng b n a khc nhau. Visual Studio .NET s t o m t th m c v m t Satellite Assembly ring bi t i v i m i file resource trong d n. B n c th ch n Project | Show All Files t thanh trnh n c a Visual Studio .NET xem cc file ny c b tr nh th no (xem hnh 11-14). B n c ng c th bu c ng d ng ch p nh n m t b n a c th b ng cch thay i thu c tnh Thread.CurrentUICulture. Tuy nhin, b n ph i thay i thu c tnh ny tr c khi form c n p.
Public Module Startup Public Sub Main() If MessageBox.Show("Switch to Vietnamese mode?", "Set Culture", _ MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _ DialogResult.Yes Then System.Threading.Thread.CurrentThread.CurrentUICulture = _ New System.Globalization.CultureInfo("vi") End If Dim frm As New Form1 frm.ShowDialog() End Sub End Module

Ch

337 ng 11: i u ki m Windows

Hnh 11-14 Satellite Assembly cho b n


[[

a Vietnamese

B n c th s d ng ti n ch WinRes.exe (n m trong th m c \Program hi u ch nh thng tin Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin) resource. Ti n ch ny cung c p m t trnh so n th o cho form nh ng khng cung c p kh n ng thay i m l nh, l t ng cho cc nh phin d ch v cc chuyn gia phi l p trnh c n nh p cc thng tin c-th-b n- a.

Hnh 11-15 Ti n ch Windows Resource Localization Editor

11.15

S d ng s th a k form

B n mu n t o v p d ng m t template nh t qun cho nhi u form.

338 Ch ng 11: i u ki m Windows

T o m t l p form c s , v d n xu t t t c cc form khc t l p ny. S d ng s th a k (inheritance) v i cc l p form c ng d dng nh s d ng n v i b t k ki u l p i u ki m no khc. B n c th s d ng n chu n ha ki u dng tr c quan cho nhi u c a s t ng t nhau (ch ng h n, trong m t trnh thu t s ) ho c cc c a s t ng t nhau trong nhi u ng d ng. s d ng s th a k form, b n c n th c hi n ba b 1. 2. 3. T o form c s . Bin d ch d n. T o form d n xu t. c sau y:

C hai cch t o form d n xu t. B n c th t o n m t cch t ng v i Visual Studio .NET b ng cch nh p ph i vo d n trong Solution Explorer v ch n Add | Inherited Form. B n s c yu c u nh p tn form m i v ch n form m n s th a k (xem hnh 11-16).

Hnh 11-16 Thm m t form d n xu t


[

B n c ng c th thm l nh Inherits vo m t form hi n c:


Public Class DerivedForm Inherits MyNamespace.BaseForm

Cch d nh t qu n l cc form c s l t chng trong m t Class Library Assembly ring bi t. Theo , b n c th tham chi u DLL ny trong b t k d n no c n t o cc form d n xu t. Tuy nhin, b n c th t cc form c s v d n xu t vo cng d n, mi n l b n bin d ch l i d n tr c khi cc thay i trong form c s xu t hi n trong cc form d n xu t. Khi s d ng s th a k form, b n s nh n th y r ng cc i u ki m trn form c s khng th c ch nh s a. B n khng th g n cc hm th l s ki n thng qua trnh so n th o form, m c d b n c th vi t m l nh v n lm vi c hon ton t t. tinh ch nh cch hnh x ny, b n c nhi u ty ch n: Theo m c nh, t t c cc i u ki m trong form c s c nh d u v i t kha Friend, v b n khng th truy xu t chng c. Tuy nhin, n u thay i cc khai bo i u khi n nh m s d ng t kha Protected, b n s c th truy xu t chng v ch nh s a cc thu c tnh c a chng trong form d n xu t.

Ch

339 ng 11: i u ki m Windows

N u mu n c p m t kh n ng h n ch khi ty ch nh m t i u ki m (v d , thay i ph n text c a m t Button nh ng khng thay i v tr c a n), b n c n thm m t th t c thu c tnh vo form c s gi m t thu c tnh c a i u ki m. Theo , form d n xu t c th s d ng thu c tnh ny th c hi n s thay i (n s xu t hi n trong c a s Properties c a form). i lc, b n c th mu n nh ngh a cc hm th l s ki n cho cc i u ki m trong form c s . Trong tr ng h p ny, b n c th nh d u m t hm th l s ki n v i t kha Overridable n u mu n form d n xu t c th thay th hm th l s ki n ny. C ng nh s th a k l p, b n c th nh d u m t ph ng th c trong form c s v i t bu c form d n xu t ph i hi n th c n. kha MustOverride

11.16

T o form khng th di chuy n

B n mu n t o m t form chi m gi m t v tr c di chuy n c.

nh trn mn hnh v khng th

T o m t form khngng-vi n b ng cch thi t l p thu c tnh FormBorderStyle l None. Ho c b n c th hi n th c thu c tnh Moveable cho form. B n c th t o m t form khngng-vi n b ng cch thi t l p thu c tnh FormBorderStyle l None. Cc form th ny khng th di chuy n c. V chng c ng thi u m t ng vi n n u mu n c ng vi n, b n ph i vi t m l nh v ho c s d ng hnh n n. C m t cch khc t o m t form khng th di chuy n c v form ny c ng vi n gi ng i u ki m. Tr c tin, thi t l p cc thu c tnh ControlBox, MinimizeBox, v MaximizeBox l False. K ti p, thi t l p thu c tnh Text l chu i tr ng. Khi , form s c ng vi n n i mu xm ho c ng k mu en (ty thu c vo ty ch n FormBorderStyle m b n s d ng), t ng t nh Button.

Hnh 11-17 Hai ki u form khng th di chuy n

Ph n d i y s trnh by m t cch ti p c n khc: hi n th c thu c tnh Moveable cho form (trong Visual Basic 6, form c thu c tnh Moveable, nh ng trong .NET, thu c tnh ny khng cn n a). Tr c tin, chng ta xy d ng l p ImmoveableForm nh sau (th a k t System.Windows.Forms.Form):

340 Ch ng 11: i u ki m Windows Public Class ImmoveableForm Inherits System.Windows.Forms.Form Private Declare Function EnableMenuItem Lib "user32.dll" _ Alias "EnableMenuItem" (ByVal hMenu As IntPtr, _ ByVal uIDEnableItem As Int32, ByVal uEnable As Int32) As Int32 Private Const HTCAPTION As Int32 = &H2 Private Private Private Private Const Const Const Const MF_BYCOMMAND As Int32 = &H0& MF_ENABLED As Int32 = &H0& MF_GRAYED As Int32 = &H1& MF_DISABLED As Int32 = &H2&

Private Const SC_MOVE As Int32 = &HF010& Private Const WM_NCLBUTTONDOWN As Int32 = &HA1 Private Const WM_SYSCOMMAND As Int32 = &H112 Private Const WM_INITMENUPOPUP As Int32 = &H117& Private bMoveable As Boolean = True Public Sub New() MyBase.New() End Sub <System.ComponentModel.Category("Behavior"), _ System.ComponentModel.Description("Allows the form to be moved")> _ Public Overridable Property Moveable() As Boolean Get Return bMoveable End Get Set(ByVal Value As Boolean) If bMoveable <> Value Then bMoveable = Value End If End Set End Property Protected Overrides Sub WndProc( _ ByRef m As System.Windows.Forms.Message) If m.Msg = WM_INITMENUPOPUP Then ' Th l vi c hi n th menu h th ng. If m.LParam.ToInt32 \ 65536 <> 0 Then Dim AbleFlags As Int32 = MF_ENABLED If Not Moveable Then AbleFlags = MF_DISABLED Or MF_GRAYED EnableMenuItem(m.WParam, SC_MOVE, _ MF_BYCOMMAND Or AbleFlags) End If End If If Not Moveable Then If m.Msg = WM_NCLBUTTONDOWN Then ' Khng cho php ko r c a s b ng thanh tiu If m.WParam.ToInt32 = HTCAPTION Then Return End If End If If m.Msg = WM_SYSCOMMAND Then ' V hi u ch c n ng Move trn menu h th ng.

Ch

341 ng 11: i u ki m Windows

If (m.WParam.ToInt32 And &HFFF0) = SC_MOVE Then Return End If End If End If MyBase.WndProc(m) End Sub End Class

s d ng l p trn, b n c n hi u ch nh ph n m do Visual Studio k t sinh cho form c a b n nh sau (ph n in m):


Public Class Form3 Inherits ImmoveableForm Public Sub New() MyBase.New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. ' V hi u kh n ng di chuy n form c a ng Me.Moveable = False End Sub ' (B End Class qua ph n m cn l i.) i dng.

Hnh 17-18 Ch c n ng Move b v hi u

11.17

Lm cho form khng- ng-vi n c th di chuy n c

B n mu n t o m t form khng c ng vi n nh ng v n c th di chuy n c. i u ny c th g p trong tr ng h p b n c n t o m t c a s ty bi n c hnh dng c nh t v nh (ch ng h n, cc ng d ng game hay media player).

342 Ch ng 11: i u ki m Windows

T o m t i u ki m ph n ng v i cc s ki n MouseDown, MouseUp, v MouseMove; v vi t m di chuy n form. Ng i dng th ng s d ng thanh tiu di chuy n form. Tuy nhin, form khngngvi n khng c thanh tiu . B n c th b p thi u h t ny b ng cch thm m t i u ki m vo form ph c v cho m c ch . V d , form trong hnh 11-19 ch a m t Label h tr vi c ko r. Khi ng i dng nh p vo Label ny, m t bi n c m c-form s c thi t l p cho bi t n ang ch ko r v v tr hi n t i c a chu t c ghi l i.
' Bi n c dng theo v t form. N u ang ch ko r, vi c ' di chuy n chu t trn Label s c chuy n thnh vi c di chuy n form. Dim Dragging As Boolean ' L u tr offset (v tr Dim PointClicked As Point c nh p vo trn Label).

Private Sub lblDrag_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles lblDrag.MouseDown If e.Button = MouseButtons.Left Then Dragging = True PointClicked = New Point(e.X, e.Y) Else Dragging = False End If End Sub

Hnh 11-19 Form khng c

ng vi n nh ng v n c th di chuy n

Sau , khi ng i dng di chuy n chu t trn Label, form t (form c g n v i con tr chu t).
Private Sub lblDrag_MouseMove(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) _ Handles lblDrag.MouseMove If Dragging Then Dim PointMoveTo As Point

ng

c di chuy n t

ng ng

' Tm v tr hi n t i c a chu t trong t a mn hnh. PointMoveTo = Me.PointToScreen(New Point(e.X, e.Y)) PointMoveTo.Offset(-PointClicked.X, -PointClicked.Y)

Ch ' Di chuy n form. Me.Location = PointMoveTo End If End Sub

343 ng 11: i u ki m Windows

Cu i cng, khi ng

i dng th chu t, ch

ko r

c chuy n thnh off.

Private Sub lblDrag_MouseUp(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) Handles lblDrag.MouseUp Dragging = False End Sub

B n c th k t h p cch ti p c n ny v i m c 12.19 (trnh by cch t o m t c a s c hnh dng b t th ng).

11.18

L u tr kch th c v v tr c a form
i kch th c

B n mu n l u tr kch th c v v tr c a m t form (c th thay c) nh m ph c h i l i trong l n hi n th form k ti p.

L u tr cc thu c tnh Left, Top, Width, v Height c a form trong Registry. Registry l n i l t ng l u tr thng tin v v tr v kch th c cho form. C th , b n s l u tr thng tin v m i form trong m t kha c l p (c th s d ng tn c a form lm kha). Cc kha ny s c l u tr ngay d i kha ng d ng. B n c n t o m t l p chuyn bi t l u v l y cc thi t l p cho form. L p FormSettingStore c trnh by d i y cung c p hai ph ng th c: SaveSettings nh n vo m t form v ghi thng tin v kch th c v v tr c a n vo Registry; v ApplySettings nh n vo m t form v p d ng cc thi t l p t Registry. ng d n c a kha v tn c a kha c l u tr lm cc bi n thnh vin l p.
Public Class FormSettingStore Private _RegPath As String Private _FormName As String Private Key As RegistryKey Public ReadOnly Property RegistryPath() As String Get Return _RegPath End Get End Property Public ReadOnly Property FormName() As String Get Return _FormName End Get End Property Public Sub New(ByVal registryPath As String, _ ByVal formName As String) Me._RegPath = registryPath Me._FormName = formName

344 Ch ng 11: i u ki m Windows ' T o kha n u n ch a t n t i. Key = Registry.LocalMachine.CreateSubKey( registryPath & Me.FormName) End Sub Public Sub SaveSettings(ByVal form As System.Windows.Forms.Form) Key.SetValue("Height", form.Height) Key.SetValue("Width", form.Width) Key.SetValue("Left", form.Left) Key.SetValue("Top", form.Top) End Sub Public Sub ApplySettings(ByVal form As System.Windows.Forms.Form) ' N u khng c s n cc thi t l p cho form ' th cc thi t l p hi n t i s c s d ng thay. form.Height = CType(Key.GetValue("Height", form.Height), Integer) form.Width = CType(Key.GetValue("Width", form.Width), Integer) form.Left = CType(Key.GetValue("Left", form.Left), Integer) form.Top = CType(Key.GetValue("Top", form.Top), Integer) End Sub End Class

s d ng l p FormSettingStore, b n ch c n thm o n m th l s ki n d i y vo b t k form no. o n m ny s l u cc thu c tnh c a form khi form ng v ph c h i chng khi form c n p.
Private FormSettings As New FormSettingStore("Software\MyApp\", Me.Name) Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load FormSettings.ApplySettings(Me) End Sub Private Sub Form1_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed FormSettings.SaveSettings(Me) End Sub

11.19

ng b cc i u ki m trn form

B n mu n t o m t trnh duy t b n ghi (record browser) sao cho gi tr c a t t c cc i u ki m c c p nh t m t cch t ng i v i b n ghi hi n t i. S d ng m t l p ty bi n ng gi d li u, thm cc th hi n c a n vo m t t p h p ArrayList, v s d ng k thu t data binding. K thu t data binding th ng c s d ng trong cc ng d ng ADO.NET (khi c n hi n th c s d ng trong cc m t ho c nhi u b n ghi trong m t DataTable). Tuy nhin, n c th ki u ng d ng khc b ng cch thay DataTable hay DataSet b ng m t t p h p cc i t ng ty bi n. V d , b n mu n s d ng nhi u i u ki m hi n th cc m u thng tin khc nhau v m t ng i. Thng tin v m i ng i c ng gi bn trong l p Person d i y:
Public Class Person Public _Name As String

Ch Public _Address As String Public _BirthDate As Date Public Property Name() As String Get Return _Name End Get Set(ByVal Value As String) _Name = Value End Set End Property Public Property Address() As String Get Return _Address End Get Set(ByVal Value As String) _Address = Value End Set End Property Public Property BirthDate() As Date Get Return _BirthDate End Get Set(ByVal Value As Date) _BirthDate = Value End Set End Property

345 ng 11: i u ki m Windows

Public Sub New(ByVal name As String, ByVal address As String, _ ByVal birthdate As Date) Me.Name = name Me.Address = address Me.BirthDate = birthdate End Sub End Class

l u tr nhi u

it

ng Person, b n c th s d ng m t ArrayList:

Dim Persons As New ArrayList() Dim NewPerson As New Person("Nguy n Ng c Bnh Ph New DateTime(1981, 2, 17)) Persons.Add(NewPerson) NewPerson = New Person("L Tr n Nh t Qu nh", "Lm New DateTime(1982, 11, 26)) Persons.Add(NewPerson) ng", "Ti n Giang", _

ng", _

NewPerson = New Person("Thi Thanh Phong", "Tr Vinh", _ New DateTime(1979, 12, 10)) Persons.Add(NewPerson) NewPerson = New Person("Thi Kim Ph ng", "TP.HCM", _ New DateTime(1983, 4, 3)) Persons.Add(NewPerson)

Cu i cng, b n c th k t n i nhi u i u ki m vo ArrayList ny. k t n i m t ListBox, b n ch c n thi t l p thu c tnh DataSource c a n l tham chi u ArrayList. B n c ng c n

346 Ch ng 11: i u ki m Windows

thi t l p thu c tnh DisplayMember l tn m t thu c tnh trong i t ng Person (thay v s c m t d ng DisplayMember, b n c th chp ph ng th c Person.ToString nh trong m c 11.5).
lstPersons.DataSource = Persons lstPersons.DisplayMember = "Name"

Nhi u i u ki m khc (nh Button, TextBox, v Label) khng cung c p b t k tnh n ng data binding chuyn bi t no. Thay vo , chng h tr data binding thng qua t p h p DataBindings ( c th a k t l p Control). T p h p DataBindings cho php b n lin k t b t k thu c tnh no c a i u ki m v i m t thu c tnh trong l p ty bi n. V d , b n c th lin i t ng k t thu c tnh Text c a m t TextBox v i thu c tnh Person.Name. Cc gi tr t Person s t ng c chn vo TextBox, v cc thay i trn TextBox s t ng c p d ng vo i t ng Person. o n m d i y s th c hi n vi c lin k t cho hai TextBox v m t DateTimePicker:
txtName.DataBindings.Add("Text", Persons, "Name") txtAddress.DataBindings.Add("Text", Persons, "Address") dtBirth.DataBindings.Add("Value", Persons, "Birthdate")

Hnh 11-20 trnh by form k t qu . r ng b n c th thay i cc gi tr c a Person b ng TextBox v DateTimePicker. Tuy nhin, n u b n thay i h tn, thng tin trong ListBox s khng c lm t i m t cch t ng. V l do , b n nn s d ng m t m u thng tin ch lm t i thng tin c lm DisplayMember; n u khng, b n s c n nh n bi t cc thay i trong ListBox.

Hnh 11-20 Cc i u ki m

ng b

11.20

T o ng d ng khay h th ng

B n mu n t o m t ng d ng hi n th m t icon trong khay h th ng v ch y pha n n. Kh i ch y ng d ng c a b n v i m t l p thnh ph n c ch a i u ki m NotifyIcon. Hi n th cc form khc (n u c n) khi ng i dng nh p vo i u ki m NotifyIcon ho c ch n m t item trong menu ng c nh.

Ch

347 ng 11: i u ki m Windows

Cc ng d ng khay h th ng (system tray applications) th ng l cc ng d ng ch y yn l ng pha n n, c l th c hi n m t tc v nh k no ho c i m t s ki n (nh s t o thnh m t file ho c m t thng bo t h i u hnh). Cc ng d ng khay h th ng c th cung c p m t giao di n ng i dng, nh ng khng c a ra lc kh i ng. Thay vo , chng t o m t icon trong khay h th ng r i i s tc ng c a ng i dng. t o m t ng d ng khay h th ng, b n c n kh i ch y ng d ng v i th t c Main, khng ph i form. B n nn vi t th t c Main trong m t l p thnh ph n, khng ph i trong m t module thng th ng. l v cc l p thnh ph n h tr thi t k , ngh a l b n c th c u hnh icon khay h th ng v thm menu ng c nh trong Visual Studio .NET lc thi t k thay v ph i vi t m l nh di dng. thm m t l p thnh ph n, b n hy nh p ph i vo d n trong Solution Explorer v ch n Add | Add Component. K ti p, thm i u ki m NotifyIcon vo form, v c u hnh i u ki m ny. m c t i thi u, b n ph i cung c p m t icon cho thu c tnh Icon. Ngoi ra, b n c th thm m t menu ng c nh v lin k t n vo NotifyIcon b ng thu c tnh ContextMenu. Khng ng hi n th menu ng c nh c a n khi c gi ng v i cc i u ki m khc, NotifyIcon s t nh p ph i.

Hnh 11-21 B m t thi t k cho m t ng d ng khay h th ng

B n khng th hi u ch nh m t menu ng c nh lc thi t k trn m t b m t thnh ph n. Thay vo , b n hy thm menu ng c nh vo form, c u hnh n b ng trnh thi t k , v r i chp n vo b m t thi t k c a l p thnh ph n. K ti p, vi t ph ng th c startup trong l p thnh ph n t o m t i t ng thnh ph n v kh i ch y m t vng l p thng i p (message loop). B n c ng c th kh i ch y m t ti u trnh ho c b nh th i th c hi n m t tc v nh k , ho c g n thm cc hm th l s ki n. th l cc s ki n c a menu, b n ch c n g n cc hm th l s ki n Click cho m i item trong menu. Ph n m cho m t khung ng d ng khay h th ng c b n c trnh by d cho d ng ng d ng b ng cch nh p vo Exit trong menu ng c nh.
Public Class App Inherits System.ComponentModel.Component ' (B qua ph n m thi t k thnh ph n.)

i y. B n c th

Public Shared Sub Main() ' T o thnh ph n. ' T lc ny, icon s Dim App As New App()

xu t hi n trong khay h

th ng.

348 Ch ng 11: i u ki m Windows ' Gi cho ng d ng v n ch y ngay c khi th t c ny k t thc. ' S d ng Application.Exit() k t thc ng d ng. Application.Run() End Sub Private Sub mnuExit_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles mnuExit.Click Application.Exit() End Sub End Class

Hnh 11-22 M t ng d ng khay h th ng (bi u t

ng m t c

i)

11.21

p d ng phong cch Windows XP


i c a Windows XP trn h

B n mu n cc i u ki m c a b n mang dng d p hi n th ng Windows XP.

Thi t l p thu c tnh FlatStyle l FlatStyle.System cho t t c cc i u ki m c h tr thu c tnh ny. Trong .NET Framework 1.0, b n ph i t o m t file manifest. Trong .NET Framework 1.1, b n ch c n g i ph ng th c Application.EnableVisualStyles. Phong cch Windows XP t ng c p d ng cho vng non-client c a form (nh ng vi n, cc nt minimize v maximize). Tuy nhin, chng s khng c p d ng cho cc i u ki m nh Button v GroupBox tr khi b n th c hi n thm m t vi b c n a. Tr c h t, b n ph i c u hnh t t c cc i u ki m d ng nt trn form (nh Button, CheckBox, v RadioButton). Cc i u ki m ny cung c p thu c tnh FlatStyle, m thu c tnh ny ph i c thi t l p l System. B c k ti p ty thu c vo phin b n .NET m b n ang s d ng. N u ang s d ng .NET Framework 1.1, b n ch c n g i ph ng th c Application.EnableVisualStyles tr c khi cho hi n th form. V d , b n c th kh i ch y ng d ng c a mnh v i th t c startup nh sau:
Public Module Startup Public Sub Main() ' Kch ho t Visual Styles. Application.EnableVisualStyles() ' Hi n th form chnh. Application.Run(New StartForm) End Sub End Module

Ch

349 ng 11: i u ki m Windows

d ng .NET Framework 1.0, b n khng c s tr gip c a ph ng th c Application.EnableVisualStyles. Tuy nhin, b n v n c th p d ng phong cch Windows XP b ng cch t o m t file manifest cho ng d ng c a mnh. File manifest ny (ch l m t file v n b n thng th ng v i n i dung XML) s bo v i Windows XP r ng ng d ng c a b n yu c u phin b n m i c a file comctl32.dll (file ny c trn t t c cc my tnh Windows XP). Windows XP s c v p d ng cc thi t l p t file manifest m t cch t ng, n u file manifest c t trong th m c ng d ng v c tn trng v i tn file th c thi ng d ng cng c file manifest l ph n m r ng l .manifest (v d , TheApp.exe s TheApp.exe.manifest m c d n trng gi ng c hai ph n m r ng). N u ang s D i y l m t file manifest v d . B n c th s d ng file ny cho cc ng d ng c a b n ch c n i tn file cho ph h p. B n c ng c n thay i gi tr name (ph n in m) thnh tn ng d ng, m c d i u ny khng th t s c n thi t.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="TheApp" type="win32" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>

Hnh 11-23 Phong cch Windows XP v phong cch kinh i n

Phong cch Windows XP s khng xu t hi n trong mi tr ng thi t k c a Visual Studio .NET. Do , th nghi m k thu t ny, b n c n ph i ch y ng d ng. Tuy nhin, b n v n c

350 Ch ng 11: i u ki m Windows

th lm cho mi tr ng thi t k c a Visual Studio .NET hi n th theo phong cch Windows XP b ng cch thm file devenv.exe.manifest vo th m c \Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE. Hnh 11-23 cho th y s khc nhau gi a phong cch Windows XP v phong cch kinh i n. N u b n s d ng file manifest cho m t ng d ng ang ch y trn m t phin b n Windows tr c Windows XP, n s b b qua, v phong cch kinh i n s c p d ng. V l do ny, b n c th c n th nghi m ng d ng c a mnh c khi c v khng c file manifest.

11.22
B n mu n thay i c c a form

Thay

c c a form

n trong su t h n khi xu t hi n

Thi t l p thu c tnh Opacity c a form v i m t gi tr n m gi a 0% v 100%. Thu c tnh Opacity c a m t form ki m sot m c c hay trong c a m t c a s . m c 100%, form xu t hi n v i tr ng thi m c nh, ngh a l khng c cc vng trong su t trn form. m c 0%, form hon ton trong su t, c ng c ngh a b n khng th t ng tc v i form c n a. Khi thay v 1.0: i c c a m t form b ng m l nh, b n ph i s d ng m t s th c n m gi a 0.0

Private Sub Form1_MouseEnter(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.MouseEnter Me.Opacity = 1.0 End Sub Private Sub Form1_MouseLeave(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.MouseLeave Me.Opacity = 0.8 End Sub

Hnh 11-24 M t form v i c 80% v m t Panel c mu n n gi ng v i thu c tnh TransparencyKey c a form

Ch

351 ng 11: i u ki m Windows

N u ch mu n trong su t nh ng vng no trn form, b n hy s d ng thu c tnh TransparencyKey. B n nh ngh a thu c tnh ny l m t mu no . N u b t k ph n no c a form trng v i mu , n s tr nn trong su t. Hnh 11-24 trnh by m t form v i c 80%. Chng ta t m t i u ki m Panel ln form v thi t l p mu n n c a Panel l mu m ta nh ngh a trong thu c tnh TransparencyKey c a form. Nh th , form s trong su t trn vng thu c Panel. B n c th b t g p m t s ng d ng dng hnh bitmap lm giao di n ng i dng, nh t l cc ki u media player. B n c th t o ki u giao di n th ny b ng cch t o m t hnh bitmap v i nh ng vng no c mu l mu m b n mu n trong su t. K ti p, thi t l p thu c tnh BackgroundImage c a form l file bitmap m b n t o. Cu i cng, thi t l p thu c tnh TransparencyKey c a form l mu m b n mu n trong su t trong hnh bitmap.
Dim Img As Bitmap = CType(Bitmap.FromFile("C:\\Example.bmp"),Bitmap) ' Mu t i Pixel(10,10) c s d ng lm mu trong su t. Img.MakeTransparent(Img.GetPixel(10, 10)) Me.BackgroundImage = Img Me.TransparencyKey = Img.GetPixel(10, 10)

B n c ng c th g b thanh tiu c a form b ng cch thi t l p FormBorderStyle l None (xem m c 11.16). form c th di chuy n c trong tr ng h p ny, b n hy p d ng m c 11.17. Trn y l m t cch t o form c hnh dng b t th ng, m t cch khc s c trnh by trong m c 12.19.

You might also like