Những Chiêu Thức Lập Trình
Tác giả : Lê Nguyên DũngLớp 11C1 trường THPT Đăk Nông (Thị xã Gia Nghĩa - Đ ăk Nông)Email của mình : le.nguyendung@gmail.comNick : nguyen_dung_vbĐịa chỉ nhà : Thôn 1, thị trấn Đăk Mâm Huyện Krông Nô Tỉnh Đắk NôngTự hào ghê cái Logo của cuốn sách mình thiết kế bằng . Word và Paint đấy. Nhìn vô cũng chuyên nghiệp đấy chứ Lời nói đầuSau khi “Xuất bản” cuốn “Chiêu thức lập trình” mình quả thật rất buồn vì chẳng có lấy một lời động viên từ bất kỳ ai (Ở Đăk Nông này mình có biết ai mà khoe) còn anh em ở việt nam nét thì chẳng đoái hoài gì cả vì vậy mình đã thật sự nản, để cuối cùng sau một sự cố nghề nghiệp phiên bản Chiêu thức lập trình phiên bản 2 mình viết gần hoàn thành bỗng tan vào sương khói mình đã tuyệt vọng. Nhưng mới hồi sáng khi mình “Viếng” www.caulacbovb.com một diễn đàn mình tham gia từ khá lâu nhưng không mấy quan tâm mình đã thấy cuốn sách này được chia sẽ trên đó, cùng với đó là lời khen của một nhân vật mình không nhớ tên đã làm mình rất vui, vì mình đã nhận ra mình cũng được công nhận dù chỉ một chút. Cuốn Chiêu thức lập trình lần này sẽ được nâng cấp lên với nhiều chiêu thức và hình vẽ minh hoạ để giúp các bạn nâng cao kiến thức.Lời cầu cứu : Do từ năm lớp 9 đến nay mình chỉ tập trung vào học lập trình (Mà lại toàn tự học) nên hiện nay đệ đã học sút rất nhiều nguy cơ rớt đại học ngày một đến gần mà ước mơ lớn nhất của đời đệ là đậu vào khoa Công Nghệ Thông Tin Đại học Bách Khoa Hồ Chí Minh đệ mong rằng có huynh nào đã từng phải nếm trải cảnh thi đại học thì chia sẻ kinh nghiệm học, học sách gì . Còn nếu có sách vở (Cũ cũng được) không cần dùng tới nhưng tốt để ôn thi đại học thì chia sẽ cho đệ. Nếu có huynh nào có lòng “Hảo tâm” hãy gửi đến địa chỉ : (Đây là địa chỉ cô giáo dạy Tin của trường đệ vào hết năm học này có thể thay đổi)Phạm Thị Loan giáo viên trường Trung Học Phổ Thông Đăk Nông, xin ghi rõ là nhở gửi cho em Lê Nguyên Dũng lớp 11C1 Cuốn sách này là cuốn sách hoàn toàn miễn phí để chia sẽ trong cộng đồng lập trình nên nếu có ai múôn sử dụng để in sách thì cũng nên ghi rõ xuất sứ.Trong sách tôi xin chỉ rõ xuất xứ, mong rằng các ban cũng sẽ tôn trong tác giả không chỉnh sửa tác giả hay các xuất xứCuốn sách này đi theo định hướng là sử dụng các hàm API hoặc các lệnh đơn giản để tạo thành những thủ thuật và hạn chế tối đa phải sử dụng các công cụ hỗ trợ. Mục lụcĐôc chiêu 1 : “Thả một câu từ trên cao xuống” (Có thể nói nh ư vậy) Đôc chiêu 2 : Hiện một câu bằng cách lần lượt hiện từng chữĐôc chiêu 3 : Hiện con trỏ động tại một đối t ượng nào đó Đôc chiêu 4 : Form có hình dạng theo một hình ảnh bất k ỳĐôc chiêu 5 : “Chụp ảnh màn hình vào một Picture”Đôc chiêu 6 : “Vô hiệu hoá button close và menu của form (cả Alt-F4 luôn)”Đôc chiêu 7 : “Kéo form di chuyển từ một điểm bất kỳ”Đôc chiêu 8 : “Ghi lại tất cả những phím gõ tên bàn phím”Đôc chiêu 9 : Đóng một ứng dụng bất kỳĐôc chiêu 10 : Tạo phím nóng cho chương trình Đôc chiêu 11 : Thay đổi hình nền cho DesktopĐôc chiêu 12 : Đóng mở khay CD-ROMĐôc chiêu 13 : Tạo một SystemTray cho ứng dụng của bạnĐôc chiêu 14 : Thay đổi Font tiếng việt cho Menu của WindowĐôc chiêu 15 : So sánh hai ảnhĐôc chiêu 16 : Liệt kê danh sách các thành phần phần cứng trong máyĐôc chiêu 17 : Chương trình khởi động cùng với WindownsĐôc chiêu 18 : Play một file nhạc MidiĐôc chiêu 19 : Khoá một file ảnh định dạng .bmpĐôc chiêu 20 : Để form của bạn ở chế độ “Luôn nổi”Đôc chiêu 21 : TextBox chỉ “Chịu” nhận sốĐôc chiêu 22 : Để form trở nên trong suốtĐôc chiêu 23 : Lấy tên người sử dung của WindownsĐôc chiêu 24 : Chép cả màn hình làm việc vào một PictureĐôc chiêu 25 : Dấu dữ liệu dạng text vào 1 file bất kỳĐôc chiêu 26 : Mở từng hộp thoại trong Control Panel Đôc chiêu 27 : Mã hoá dữ liệu dạng text Đôc chiêu 1 : “Thả một câu từ trên cao xuống” (Có thể nói như vậy) home Xuất xứ : www.pscode.comBinh khí sử dụng : Một Picture và một CommandButtonĐoạn mã :Option ExplicitPrivate Sub command1_Click() Randomize Timer 'Init Rnd 'Declarations Dim StartTime(100) 'Starttime of a up/down movement Dim DownMovement(100) As Boolean 'are we doing a up or down movement ??? Dim MoveDistance As Double 'distance target has moved since the start of the movement Dim YPos(100) As Double 'Holds the y position of a letter Dim MovementDone(100) As Boolean 'Is set to true when a up / down movement is completed Dim StartHeight(100) As Double 'From which hight will the letter fall down ? Dim UpMovementTime(100) As Double 'How long will it the letter take to move up Dim PowerLoss(100) As Double 'losing xx% of power when touching the ground Dim Message As String 'Message you want to display Dim Looop As Integer 'Loop var Dim TextColor(100) As ColorConstants 'Color of one letter 'Settings picture1.ScaleMode = 4 picture1.FontName = "Courier New" Message = "Ohh my god ! It's raining letters today !!! Contact me: overkillpage@gmx.net" 'Message you want to display For Looop = 1 To Len(Message) PowerLoss(Looop) = 0.2 + ((Rnd * 25) / 100) 'losing xx% of power when touching the ground StartHeight(Looop) = 0 TextColor(Looop) = RGB(80 + Looop * 2, 80 + Looop * 2, 255) Next Looop For Looop = 1 To Len(Message) StartTime(Looop) = Timer 'Setting up startime for a following movement, needed for calculation of position Next Looop Do picture1.Cls 'Clear picturebox 'Looping throung the textmessage For Looop = 1 To Len(Message) If DownMovement(Looop) = True Then MoveDistance = (StartHeight(Looop) + (0.5 * 9.81 * ((Timer - StartTime(Looop)) ^ 2))) 'Calculating falling distance If YPos(Looop) >= picture1.ScaleHeight - 1 Then MovementDone(Looop) = True 'The letter reached the bottom border. The Downmovement is complete Else MoveDistance = (StartHeight(Looop) + (0.5 * 9.81 * (UpMovementTime(Looop) - (Timer - StartTime(Looop))) ^ 2)) 'Calculating falling distance If YPos(Looop) <= StartHeight(Looop) + 0.1 Then MovementDone(Looop) = True 'The letter reached the max. height. The upmovement is complete End If YPos(Looop) = MoveDistance If YPos(Looop) > picture1.ScaleHeight - 1 Then 'If the letter fell picture1 of our picturebox ;) we fix it YPos(Looop) = picture1.ScaleHeight - 1 'At the bottom position End If picture1.CurrentX = picture1.ScaleWidth / 2 - Int((Len(Message) / 2)) + Looop picture1.CurrentY = YPos(Looop) 'Setting the letters y position picture1.ForeColor = TextColor(Looop) 'Setting the letters color picture1.Print Mid(Message, Looop, 1) 'Text picture1put Next Looop DoEvents For Looop = 1 To Len(Message) If MovementDone(Looop) = True Then If DownMovement(Looop) = True Then 'Switch between up/downmovement DownMovement(Looop) = False StartHeight(Looop) = StartHeight(Looop) + ((picture1.ScaleHeight - StartHeight(Looop)) * PowerLoss(Looop)) 'New Startheight, because of speed lost ?!?! UpMovementTime(Looop) = Sqr((picture1.ScaleHeight - StartHeight(Looop)) / (0.5 * 9.81)) 'How long will the NEXT upmovement last ??? Else DownMovement(Looop) = True End If StartTime(Looop) = Timer 'Set the StartTime of a new movement MovementDone(Looop) = False End If Next Looop Loop 'Until StartHeight = picture1.ScaleHeight End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) EndEnd SubĐôc chiêu 2 : Hiện một câu bằng cách lần lượt hiện từng chữ home Xuất xứ : www.pscode.comBinh khí sử dụng : Một Module , ba CommandButton lần lượt có các tên cmdStart, cmdClear, cmdExit, thêm hai cái đồng hồ tên là Timer1 (Interval =50) và Timer2(Interval =5) cuối cùng là một label tên là lblTextĐoạn mã :Module :Public ASCC(5) As StringPublic Letters() As StringPublic TXT As StringPublic CurLetter As IntegerPublic TEXTT As StringPublic r As IntegerForm :Private Sub cmdClear_Click()lblText.Caption = ""End SubPrivate Sub cmdExit_Click()EndEnd SubPrivate Sub cmdStart_Click()TXT = InputBox("Enter Text")ReDim Preserve Letters(0)ReDim Preserve Letters(Len(TXT))lblText = ""CurLetter = 0For l = 1 To Len(TXT) Letters(l) = Mid(TXT, l, 1)NextTimer2.Enabled = True End SubPrivate Sub Form_Load()End SubPrivate Sub Timer1_Timer()r = r + 1lblText.Caption = TEXTTlblText.Caption = lblText.Caption & "_"If r = 6 Thenr = 0 If 65 < Asc(Letters(CurLetter)) < 90 Then lblText.Caption = TEXTT lblText.Caption = lblText.Caption & Letters(CurLetter) TEXTT = lblText Timer2.Enabled = True Timer1.Enabled = False Else lblText.Caption = TEXTT lblText.Caption = lblText.Caption & Chr$(Asc(Letters(CurLetter)) - 32) TEXTT = lblText Timer2.Enabled = True Timer1.Enabled = False End If End If End SubPrivate Sub Timer2_Timer()CurLetter = CurLetter + 1If CurLetter > Len(TXT) Then GoTo HERE:End IfTEXTT = lblTextTimer1.Enabled = TrueTimer2.Enabled = FalseHERE:Timer2.Enabled = FalseEnd Sub// neu co loi thi de 2 timer = False ->> tui ko phai tac giaĐôc chiêu 3 : Hiện con trỏ động tại một đối tượng nào đó home Xuất xứ : www.ttvnol.comBinh khí sử dụng : Chỉ cần một cái FormĐoạn mã :'Hằng được sử dụng private Const ConTro=(-12) 'Các hàm API được sử dụngPrivate Declare Function SetClasslong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal wNewWord As Long) As Long Private Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long Dim NewCur as longDim OldCur as long Private Sub Form_Load'Giả sử rằng bạn đã có sẵn file Clock.ani ở ổ C:\NewCur=LoadCursorFromFile("C:\Clock.ani")OldCur=SetClassLong(Me.hwnd, ConTro,NewCur)End sub Private Sub Form_UnLoad(Cancel as Integer)SetClassLong me.hwnd, Contro,OldCurEnd Sub - Ta rút ra được một “Công thức” : Thay vì đặt con trỏ động trong Form ta có thể thay Me.hwnd trong dòng lệnh : OldCur=SetClassLong(Me.hwnd, ConTro,NewCur) bằng đối tựợng.hwnd (Nếu đối tượng đó hổ trợ )Đôc chiêu 4 : Form có hình dạng theo một hình ảnh bất kỳ (Tất nhiên có màu tượng trưng cho form trong suốt) home Xuất xứ : www.pscode.comBinh khí sử dụng : Chỉ cần một cái Form, trong form c ó s ẵn h ình n ền (Màu đen sẽ là màu chỉ định trong suốt)Đoạn mã : Bản thân đoạn mã này cũng có thêm một vài chức năng ngoài nhưng đều rất thích hợp cho 1 ứng dụngOption ExplicitPrivate Declare Function ReleaseCapture Lib "user32" () As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPrivate Const HWND_TOPMOST = -1Private Const SWP_NOMOVE = &H2Private Const SWP_NOSIZE = &H1Private Const Flags = SWP_NOMOVE Or SWP_NOSIZE'Transparency Declarations and Constants'I copied these from Robert Gainor's ExamplePrivate Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As LongPrivate Declare Function OffsetRgn Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As LongPrivate Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As LongPrivate Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As LongPrivate Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As LongPrivate Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As LongPrivate Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As LongPrivate Const RGN_AND = 1Private Const RGN_OR = 2Private Const RGN_XOR = 3Private Const RGN_DIFF = 4Private Const RGN_COPY = 5'FormMove and FormOnTop SubsPrivate Sub FormOnTop(Frm As Form)Call SetWindowPos(Frm.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, Flags)End SubPrivate Sub FormMoveXP(Frm As Form)Call ReleaseCaptureCall SendMessage(Frm.hwnd, &HA1, 2, 0&)End SubPrivate Sub CenterForm(Frm As Form)Frm.Left = Screen.Width / 2 - Frm.Width / 2Frm.Top = Screen.Height / 2 - Frm.Height / 2End Sub'Transparency Function'I copied this from Robert Gainor's ExamplePrivate Function MakeTransparent(ByRef Frm As Form, ByVal TransparentColor As Long) As LongDim rgnMain As Long, rgnPixel As Long, bmpMain As Long, dcMain As LongDim Width As Long, Height As Long, X As Long, Y As LongDim ScaleSize As Long, RGBColor As LongScaleSize& = Frm.ScaleModeFrm.ScaleMode = 3Frm.BorderStyle = 0Width& = Frm.ScaleX(Frm.Picture.Width, vbHimetric, vbPixels)Height& = Frm.ScaleY(Frm.Picture.Height, vbHimetric, vbPixels)Frm.Width = Width& * Screen.TwipsPerPixelXFrm.Height = Height& * Screen.TwipsPerPixelYrgnMain& = CreateRectRgn(0&, 0&, Width&, Height&)dcMain& = CreateCompatibleDC(Frm.hDC)bmpMain& = SelectObject(dcMain&, Frm.Picture.Handle)For Y& = 0& To Height& For X& = 0& To Width& RGBColor& = GetPixel(dcMain&, X&, Y&) If RGBColor& = TransparentColor& Then rgnPixel& = CreateRectRgn(X&, Y&, X& + 1&, Y& + 1&) CombineRgn rgnMain&, rgnMain&, rgnPixel&, RGN_XOR DeleteObject rgnPixel& End If Next X&Next Y&SelectObject dcMain&, bmpMain&DeleteDC dcMain&DeleteObject bmpMain&If rgnMain& <> 0& Then SetWindowRgn Frm.hwnd, rgnMain&, True MakeTransparent = rgnMain&End IfFrm.ScaleMode = ScaleSize&End Function'Form CodePrivate Sub Form_Load()Call FormOnTop(Me)Call CenterForm(Me)Call MakeTransparent(Me, CLng(0))End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Call FormMoveXP(Me)End SubPrivate Sub Form_Unload(Cancel As Integer)EndEnd SubĐôc chiêu 5 : “Chụp ảnh màn hình vào một Picture” home Xuất xứ : www.ttvnol.comBinh khí sử dụng : Một Picture và một CommandButtonĐoạn mã :Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long Private Sub Command1_Click()Dim wScreen As LongDim hScreen As LongDim w As LongDim h As LongPicture1.Cls wScreen = Screen.Width \ Screen.TwipsPerPixelXhScreen = Screen.Height \ Screen.TwipsPerPixelY Picture1.ScaleMode = vbPixelsw = Picture1.ScaleWidthh = Picture1.ScaleHeight . “Kéo form di chuyển từ một điểm bất kỳ” home Xuất xứ : www.allapi.netBinh khí sử dụng : Lại cũng tay không tập bắt hổĐoạn mã :Private Declare. “Ghi lại tất cả những phím gõ tên bàn phím” home Xuất xứ : www.allapi.netBinh khí sử dụng : Cần một cái ModuleĐoạn mã :Trong Module :Public Const