Tặng các bạn thủ tục Form Zoom

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Buồn buồn ngày cuối tuần mà phải trực công ty, tôi làm cái thủ tục Zoom Form này để tặng các bạn và tôi nghĩ nó sẽ giúp ích cho các bạn nếu các bạn thường xuyên sử dụng Userform khi nhập liệu, thiết kế giao diện form.

Trước khi sử dụng chúng phải có hàm API mới thực hiện được:

PHP:
Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

Hàm kiểm tra chiều rộng độ phân giải màn hình:

PHP:
Function ScrW()
  ScrW = GetSystemMetrics32(0)
End Function

Hàm kiểm tra chiều cao độ phân giải màn hình:

PHP:
Function ScrH()
  ScrH = GetSystemMetrics32(1)
End Function


Và thủ tục dưới đây được đặt trong Form khi thiết kế:

PHP:
Private Sub ZoomForm()
  Dim ZoomW As Double, ZoomH As Double
  Dim MyControl As Control
  '(800 x 600  là do phân giai màn hình khi thiet ke Form)
  ZoomW = ScrW / 800: ZoomH = ScrH / 600
  For Each MyControl In Me.Controls
    With MyControl
      .Top = .Top * ZoomH
      .Height = .Height * ZoomH
      .Left = .Left * ZoomW
      .Width = .Width * ZoomW
      .Font.Size = .Font.Size * ZoomW
    End With
  Next
  With Me
    .Width = .Width * ZoomW
    .Height = .Height * ZoomH
  End With
End Sub

PHP:
Private Sub UserForm_Initialize()
  Call ZoomForm
End Sub

Các bạn lưu ý, ở đây có 2 thông số: 800 và 600. Đây là độ phân giải màn hình khi các bạn thiết kế Form, muốn biết chính xác độ phân giải màn hình của mình, thì các bạn sử dụng thủ tục sau:

PHP:
Sub DoPhanGiai()
  MsgBox "Chieu rong (W): " & ScrW & Chr(10) & Chr(10) & "Chieu cao (H): " & ScrH, , "DO PHAN GIAI MAN HINH"
End Sub
 

File đính kèm

Khi thiết kế, tôi muốn tổng quát một chút với toàn bộ các Userform khi Form show, nhưng lại gặp trở ngại, không biết tại sao:

PHP:
Sub MyFormZoom(ByVal MyForm As UserForm)
  Dim ZoomW As Double, ZoomH As Double
  Dim MyControl As Control
  ''(800 x 600  là do phân giai màn hình khi thiet ke)
  ZoomW = ScrW / 800: ZoomH = ScrH / 600
  For Each MyControl In MyForm.Controls
    With MyControl
      .Top = .Top * ZoomH
      .Height = .Height * ZoomH
      .Left = .Left * ZoomW
      .Width = .Width * ZoomW
      .Font.Size = .Font.Size * ZoomW
    End With
  Next
'===========================================
'Bi loi tai doan code nay:
''===========================================
  With MyForm
    .Width = .Width * ZoomW
    .Height = .Height * ZoomH
  End With
'===========================================
'Chang biet ly do tai sao? Cach khac phuc???
'===========================================
End Sub
 
Upvote 0
MinhThien có sử dụng Class không? Hình như Biến MyForm phải nằm trong 1 Class mới được.
 
Upvote 0
Class là 1 vấn đề: Để hiểu thì khá chua cay, nhưng khi làm được rồi thì thích mê tơi.

Bản thân tôi cũng học lại từ GPE mà thôi. Ứng dụng duy nhất tôi đã làm được nằm ở đây: http://www.giaiphapexcel.com/forum/...i-xoá-hàng-loạt-control-trên-form-bằng-code.&

Đó mới là class cho object là button trên form. Còn Class là object khác thì không biết làm. Lẽ ra, nếu được học hành bài bản đàng hoàng thì làm được 1 cái, sẽ làm được bất kỳ cái gì. Nhưng học kiểu amateur như tôi thì bó tay.

Bậc thầy về Class trên GPE là Nguyễn Duy Tuân với topic: http://www.giaiphapexcel.com/forum/showthread.php?3868-Class-module-Kỹ-thuật-Tạo-và-Wrap-đối-lượng

Còn đây là ứng dụngcủa anhtuan1066: http://www.giaiphapexcel.com/forum/showthread.php?37075-Dùng-Class-Module-để-tạo-sự-kiện-người-dùng
 
Upvote 0
Gửi tặng các bạn FormZoom có MIN, MAX, NORMAL

Form này có chức năng MIN, MAX, NORMAL khi click vào, tỷ lệ sẽ Zoom tương ứng.

Thuật toán cũng đơn giản như sau:

Các hàm API để tạo các nút lệnh Zoom (nguồn code trên diễn đàn GPE):

PHP:
Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SetWindowPos Lib "user32.dll" (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 Long

Tổng quát việc Zoom Form bằng 2 thủ tục:

Thủ tục ZoomIn:

PHP:
Sub FormZoomIn(ByVal MyForm As UserForm)
  ZoomW = ScrW / 800: ZoomH = ScrH / 600
  For Each MyControl In MyForm.Controls
    With MyControl
      .Top = .Top * ZoomH
      .Height = .Height * ZoomH
      .Left = .Left * ZoomW
      .Width = .Width * ZoomW
      .Font.Size = .Font.Size * ZoomW
    End With
  Next
End Sub

Thủ tục ZoomOut:

PHP:
Sub FormZoomOut(ByVal MyForm As UserForm)
  ZoomW = ScrW / 800: ZoomH = ScrH / 600
  For Each MyControl In MyForm.Controls
    With MyControl
      .Top = .Top / ZoomH
      .Height = .Height / ZoomH
      .Left = .Left / ZoomW
      .Width = .Width / ZoomW
      .Font.Size = .Font.Size / ZoomW
    End With
  Next
End Sub

Cũng như bài trước, nhưng Form Zoom độc đáo hơn nhờ thủ tục trong form:

PHP:
Private Sub UserForm_Initialize()
  Dim hwnd As Long, HT As Double
  HT = Height - InsideHeight
  hwnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowPos hwnd, 0, 0, 0, 800, 620, 32
  SetWindowLong hwnd, -16, &H84CF0080
  Height = Height - HT
  Zm1 = False: Zm2 = True
End Sub

Và khi được kích hoạt Resize sẽ qua thủ tục dưới đây:

PHP:
Private Sub UserForm_Resize()
  If Zm2 = True Then
    If Me.Height > 450 Then
      If Zm1 = False Then
        FormZoomIn Me
        Zm1 = True
      End If
    Else
      If Zm1 = True Then
        FormZoomOut Me
        ListBox1.Height = 72
        Zm1 = False
      End If
    End If
  End If
End Sub

Các LƯU Ý:

1) Đối với Form có sử dụng ListBox thì khi thu nhỏ, phải định lại chiều cao thiết kế cho nó, control này rất khó nhai (như Thầy PTM đã từng nói) dù tính toán cỡ nào nó cũng tự thu nhỏ chiều cao.

2) Khi thiết kế Form, nên chọn chiều cao là 450 và chiều rộng là 600. Đây là kích cỡ của 1 form chuẩn đối với độ phân giải màn hình 800x600. Khi đã chọn cỡ như vậy, các bạn chỉ việc trình bày các controls bên trong sao cho đẹp mắt, cân đối, thì dù các bạn làm sao đi nữa nó cũng Zoom tốt đối với mọi độ phân giải của màn hình.


Chúc các bạn thành công!
 

File đính kèm

Upvote 0
Cái Form này lúc Resize nó chẳng có tác dụng gì cả ---> Các control vẫn... y nguyên
 
Upvote 0
Dạ thưa Thầy, em chưa biết sử dụng Class Module như thế nào hết! Thầy giúp em vấn đề này với.

Hàm là những đoạn chương trình dùng để thực hiện một công việc gì đó hiểu nôn na hàm là thành phần xử lý
Nhưng khi sử dụng các hàm đó thì cần có các biến, các biến đó hiểu nôn na là thành phần dữ liệu
Class được hiểu một cách đơn giản nhất là sự tích hợp của hai thành phần:
Thành phần dữ liệu Thành phần xử lý.
 
Upvote 0
Cái Form này lúc Resize nó chẳng có tác dụng gì cả ---> Các control vẫn... y nguyên

Có thể là do cái này đây If Me.Height > 450 Then. Thật ra em vẫn lấn cấn sự kiện bấm vào nút phóng to, thu nhỏ. Nếu em biết được sự kiện thì em sẽ làm tốt hơn. Tuy nhiên, em đã thử cái này trên nhiều máy và thử nhiều độ phân giải (nhưng lại chưa thử trên laptop vì nó rộng hơn nên chiều cao hẹp lại chăng), có thể cần phải thêm cái Me.Width vô nữa mới hoàn toàn yên tâm:

PHP:
Private Sub UserForm_Resize()
  If Zm2 = True Then
    If Me.Height > 450 Or Me.Width > 600 Then
      If Zm1 = False Then
        FormZoomIn Me
        Zm1 = True
      End If
    Else
      If Zm1 = True Then
        FormZoomOut Me
        Zm1 = False
      End If
    End If
  End If
End Sub
 

File đính kèm

Upvote 0
Hàm là những đoạn chương trình dùng để thực hiện một công việc gì đó hiểu nôn na hàm là thành phần xử lý
Nhưng khi sử dụng các hàm đó thì cần có các biến, các biến đó hiểu nôn na là thành phần dữ liệu
Class được hiểu một cách đơn giản nhất là sự tích hợp của hai thành phần:
Thành phần dữ liệu Thành phần xử lý.

Ui chà, bạn nói thật hay đó nha, bạn thử giới thiệu cho mình một File ứng dụng nào đó do bạn thiết kế có sử dụng Class Module thử xem sao, chứ nói suông cũng chưa có tác dụng. Cái vụ Class này tôi chưa nghiên cứu, nhưng rồi cũng phải mò đến nó.
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể là do cái này đây If Me.Height > 450 Then. Thật ra em vẫn lấn cấn sự kiện bấm vào nút phóng to, thu nhỏ. Nếu em biết được sự kiện thì em sẽ làm tốt hơn. Tuy nhiên, em đã thử cái này trên nhiều máy và thử nhiều độ phân giải (nhưng lại chưa thử trên laptop vì nó rộng hơn nên chiều cao hẹp lại chăng), có thể cần phải thêm cái Me.Width vô nữa mới hoàn toàn yên tâm:
Vừa thí nghiệm xong! Vẫn không có tác dụng gì khi Resize cả
 
Upvote 0
Ủa, gì kỳ vậy ta? Để em làm trên laptop thử xem, tại máy cơ quan nên chưa thử. Nhưng độ phân giải của máy Thầy là bao nhiêu vậy ạ?
Máy tôi là 1280 x 800
Ẹc... Ẹc... Lý ra phải tính toán sao cho tổng quát chứ! Tức độ phân giải nào cũng xài được

[video=youtube;FNeN25u7TfI]http://www.youtube.com/watch?v=FNeN25u7TfI[/video]
 
Upvote 0
Máy tôi là 1280 x 800
Ẹc... Ẹc... Lý ra phải tính toán sao cho tổng quát chứ! Tức độ phân giải nào cũng xài được

Ẹc ẹc, hiểu rồi, cái này Thầy bắt khó đây hihihi, em nói zoom theo nút Max, Min, Normal chứ có nói Resized trên Form bằng cách kéo giản đâu Thầy ơi. Làm được vậy là tốt lém rùi, hồi trước có hỏi về Min, Max này mà chưa có câu trả lời xác đáng, giờ tự mày mò mà làm được là tiến bộ hơn trước rồi đó Thầy!

Bài hỏi tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?34757-Vấn-đề-Zoom-control-khi-Maximized-Minimized-Normal-trong-form&p=230849#post230849
 
Lần chỉnh sửa cuối:
Upvote 0
Mà phải công nhận, cái thủ tục chứa các nút Resize của Thầy em khoái quá, giờ vẫn còn sử dụng đấy chứ! Cám ơn Thầy nhé!

PHP:
Private Sub UserForm_Initialize()
  Dim hwnd As Long, HT As Double
  HT = Height - InsideHeight
  hwnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowPos hwnd, 0, 0, 0, 800, 620, 32
  SetWindowLong hwnd, -16, &H84CF0080
  Height = Height - HT
End Sub
 
Upvote 0
Ẹc ẹc, hiểu rồi, cái này Thầy bắt khó đây hihihi, em nói zoom theo nút Max, Min, Normal chứ có nói Resized trên Form bằng cách kéo giản đâu Thầy ơi. Làm được vậy là tốt lém rùi, hồi trước có hỏi về Min, Max này mà chưa có câu trả lời xác đáng, giờ tự mày mò mà làm được là tiến bộ hơn trước rồi đó Thầy!

Bài hỏi tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?34757-Vấn-đề-Zoom-control-khi-Maximized-Minimized-Normal-trong-form&p=230849#post230849
Bạn tham khảo cái này xem:
http://www.andypope.info/vba/Anchor.htm
Tôi thấy nó resize rất tốt mà giải thuật cũng không mấy phức tạp
 
Upvote 0
Bạn tham khảo cái này xem:
http://www.andypope.info/vba/Anchor.htm
Tôi thấy nó resize rất tốt mà giải thuật cũng không mấy phức tạp



Muốn Resize được như vậy, Thầy xem File tại bài này:
http://www.giaiphapexcel.com/forum/showthread.php?34757-Vấn-đề-Zoom-control-khi-Maximized-Minimized-Normal-trong-form&p=230863#post230863

Thấy nó dùng Class hay quá, mà em thì bí rị về nó nên đâu dám áp dụng vào đâu Thầy ơi!
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn Resize được như vậy, Thầy xem File tại bài này:
http://www.giaiphapexcel.com/forum/showthread.php?34757-Vấn-đề-Zoom-control-khi-Maximized-Minimized-Normal-trong-form&p=230863#post230863

Thấy nó dùng Class hay quá, mà em thì bí rị về nó nên đâu dám áp dụng vào đâu Thầy ơi!
Thì bài ấy cũng lấy từ link của tôi đưa ở trên thôi
Ẹc... Ẹc...
Ngoài ra, bạn có nói rằng:
Mà phải công nhận, cái thủ tục chứa các nút Resize của Thầy em khoái quá, giờ vẫn còn sử dụng đấy chứ! Cám ơn Thầy nhé!

PHP:
Private Sub UserForm_Initialize()
  Dim hwnd As Long, HT As Double
  HT = Height - InsideHeight
  hwnd = FindWindow("ThunderDFrame", Me.Caption)
  SetWindowPos hwnd, 0, 0, 0, 800, 620, 32
  SetWindowLong hwnd, -16, &H84CF0080
  Height = Height - HT
End Sub
Thật ra đó chỉ là món "mì ăn liền" (khi mình chưa biết nấu). Muốn "nấu nướng" đàng hoàng thì phải là cái này:
http://www.giaiphapexcel.com/forum/showthread.php?36636-Tổng-quan-về-UserForm-Windows-Styles
----------------------------------
Tóm lại: Bài toán Zoom form và các Controls e rằng còn phải nghiên cứu thêm rất nhiều
 
Upvote 0
Ui chà, bạn nói thật hay đó nha, bạn thử giới thiệu cho mình một File ứng dụng nào đó do bạn thiết kế có sử dụng Class Module thử xem sao, chứ nói suông cũng chưa có tác dụng. Cái vụ Class này tôi chưa nghiên cứu, nhưng rồi cũng phải mò đến nó.
Trước kia tôi có làm đề tài quản lý học sinh viết bằng VBNET, viết các thủ tục bằng Class nếu anh cần gởi email cho tôi, tôi sẻ gởi lại cho anh
 
Upvote 0
Trước kia tôi có làm đề tài quản lý học sinh viết bằng VBNET, viết các thủ tục bằng Class nếu anh cần gởi email cho tôi, tôi sẻ gởi lại cho anh
Trên GPE này cũng chẳng có mấy người hiểu sâu về Class (kể cả tôi).
Vậy nếu có thể được bạn hãy viết 1 code thật đơn giản có dùng Class trên VBA cho mọi người tham khảo với
Cảm ơn trước!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom