Vấn đề Zoom control khi Maximized, Minimized, Normal trong form (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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,722
Giới tính
Nam
Xin vui lòng cho hỏi, khi Max hay Normal cửa sổ của Form, có code nào zoom các control trong form theo tỷ lệ có được không?
Tôi đã tìm mãi trên Google mà chưa thấy.
Xin cám ơn mọi sự hướng dẫn và giúp đỡ.
 
Xin vui lòng cho hỏi, khi Max hay Normal cửa sổ của Form, có code nào zoom các control trong form theo tỷ lệ có được không?
Tôi đã tìm mãi trên Google mà chưa thấy.
Xin cám ơn mọi sự hướng dẫn và giúp đỡ.
Tôi nghĩ thế này:
- Đặt vài biến thể hiện kích thước cũ của form
- Khi thay đổi kích thước form, ta tính xem tỷ lệ thay đổi là bao nhiêu (bằng cách lấy kích thước mới chia kích thước cũ)
- Dùng vòng lập duyệt qua các control (trừ UserForm) rồi nhân kích thước các control theo tỷ lệ vừa tính ở trên
---------------
Nói thì nói vậy nhưng tôi nghĩ cái CommandButton đang được vẽ vừa vặn, giờ tự nhiên to lên gấp 10 lần thì nhìn chả giống cái gì cả
Mà cho hỏi: Tại sao lại có nhu cầu tăng zoom form chi vậy?
 
Upvote 0
Xin vui lòng cho hỏi, khi Max hay Normal cửa sổ của Form, có code nào zoom các control trong form theo tỷ lệ có được không?
Tôi đã tìm mãi trên Google mà chưa thấy.
Xin cám ơn mọi sự hướng dẫn và giúp đỡ.
Điều chỉnh kích cở form bằng tay (Kéo ra rồi kéo vào) tương ứng vị trí và kích cở các control sẽ thay theo đến 1 mức nhất định nào đó được không anh?
Nếu đúng như vậy em sẽ gửi ví dụ cho anh nghiên cứu nhé. Nhưng cái này phải đụng đến class anh à.
 
Upvote 0
Tôi nghĩ thế này:
- Đặt vài biến thể hiện kích thước cũ của form
- Khi thay đổi kích thước form, ta tính xem tỷ lệ thay đổi là bao nhiêu (bằng cách lấy kích thước mới chia kích thước cũ)
- Dùng vòng lập duyệt qua các control (trừ UserForm) rồi nhân kích thước các control theo tỷ lệ vừa tính ở trên
---------------
Nói thì nói vậy nhưng tôi nghĩ cái CommandButton đang được vẽ vừa vặn, giờ tự nhiên to lên gấp 10 lần thì nhìn chả giống cái gì cả
Mà cho hỏi: Tại sao lại có nhu cầu tăng zoom form chi vậy?

Dạ, cám ơn Thầy đã hướng dẫn, tại vì dạo này màn hình máy tính kỳ cục quá, lúc thì rộng lúc thì cao, cái form của em để ở máy tính này thì vừa vặn, khi qua máy mới bây giờ nó nhỏ xíu xiu nên em nghĩ không chỉ cần nút close mà phải thêm nút max, min cho bất cứ máy nào cũng được. Hỏng biết Thầy có vui lòng giúp em không ạ?

Điều chỉnh kích cở form bằng tay (Kéo ra rồi kéo vào) tương ứng vị trí và kích cở các control sẽ thay theo đến 1 mức nhất định nào đó được không anh?
Nếu đúng như vậy em sẽ gửi ví dụ cho anh nghiên cứu nhé. Nhưng cái này phải đụng đến class anh à.

Cám ơn bạn rất nhiều, bạn gửi File lên cho mình tham khảo nhé!
 
Upvote 0
Dạ, cám ơn Thầy đã hướng dẫn, tại vì dạo này màn hình máy tính kỳ cục quá, lúc thì rộng lúc thì cao, cái form của em để ở máy tính này thì vừa vặn, khi qua máy mới bây giờ nó nhỏ xíu xiu nên em nghĩ không chỉ cần nút close mà phải thêm nút max, min cho bất cứ máy nào cũng được. Hỏng biết Thầy có vui lòng giúp em không ạ?



Cám ơn bạn rất nhiều, bạn gửi File lên cho mình tham khảo nhé!

Anh xem ví dụ ở file đính kèm nhé.
 

File đính kèm

Upvote 0
Dạ, cám ơn Thầy đã hướng dẫn, tại vì dạo này màn hình máy tính kỳ cục quá, lúc thì rộng lúc thì cao, cái form của em để ở máy tính này thì vừa vặn, khi qua máy mới bây giờ nó nhỏ xíu xiu nên em nghĩ không chỉ cần nút close mà phải thêm nút max, min cho bất cứ máy nào cũng được. Hỏng biết Thầy có vui lòng giúp em không ạ?
Tôi nghĩ cái này có liên quan đến độ phân giải màn hình
Vậy thay vì thay đổi kích thước form sao bạn không viết 1 code thay đổi độ phân giải màn hình (khi Form load) ---> Tôi cho rằng giải pháp này dể hơn
Code để thay đổi độ phân giải màn hình có đầy trên mạng, chỉ cần nhập từ khóa VBA code to change screen resolution
 
Upvote 0

Có thể dùng 1 kích thước tương đối được. Giả sử Form thiết kế trên giao diện 800 x 600:

Gán 1 biến cho chiều rộng màn hình hiện thời và 1 biến cho tỷ lệ giữa độ rộng đó và độ rộng thiết kế:

MyWidth= Application.Width
MyRate= MyWidth / 800

Sau đó, mỗi control cần thay đổi kích thước và vị trí sẽ tính lại theo tỷ lệ MyRate.

Thí dụ khi thiết kế 1 control có kích thước 25 x 100, vị trí Left là 200, Top là 150. Ghi lại các chỉ số này sau đó tính lại trong sự kiện Form Open:

With Me.Control1
.Height = 25 * MyRate
.Width = 100 * MyRate
.Left = 200 * MyRate
.Top = 150 * MyRate
End With


Kể cả kích thước bản thân cái Form cũng nhân lên tương ứng.

Thưa Thầy, em cũng tìm được code để có các nút Min, Max, Normal trong Form qua diễn đàn, thế nhưng khi Max thì các control không zoom theo tỉ lệ. Thầy giúp em nhé!

Cảm ơn Thầy!
 

File đính kèm

Upvote 0
Max thì nghĩa là
PHP:
With Me
.Width = Application.Width
.Height = Application.Height
End With
Rồi tới các controls như đoạn code trên. Cũng phải tính dựa trên cái tỷ lệ MyRate:

MyRate = Application.Width / 800

Ghi chú: Xem file không làm được đâu. Phải biết form thiết kế trên màn hình bao nhiêu, kích thước từng control trong màn hình đó là bao nhiêu, . . . Rồi khi chuyển sang máy khác, màn hình khác mới thay bằng tỷ lệ. 800 ở trên là con số tạm tính, giả định là đang thiết kế ở màn hình 800 x 600, các control đã có kích thước vừa mắt khi max.

À, thiết kế khi max saocho các controls có kích thước và vị trí cân xứng trong màn hình max.
 
Lần chỉnh sửa cuối:
Upvote 0
Làm tới đâu rồi?

Vì vừa min max vừa đổi độ phân giải, nên lấy thêm 1 tỷ lệ nữa:
PHP:
Mrate1 = Application.Width / 1024
Msize = Me.Width
Mrate2 = Msize / 600

Với 1024 là độ rộng của môi trường thiết kế
600, 450 là độ rộng và chiều cao của Form Normal view trong môi trường thiết kế

vậy khi mở form:
PHP:
Me.Width = 600 * Mrate1
Me.Height = 450 * Mrate1

Khi resize form (min, max), các control sẽ tính lại:
PHP:
With Me.Cmbb1
    .Top = 54 * mrate2
    .Left = 18 * mrate2
    .Height = 18 * mrate2
    .Width = 140 * mrate2
    .Font.Size = 8 * mrate2
End With

Túm lại: Dù max hay Normal, dù 800 x 600 hay 1152 x 864, kể cả wide 1200 x 768, Restore, Max form thì kích thước control sẽ thay đổi tương ứng.

Còn 1 vấn đề là Application.Width không phải là 1024, hàm lấy độ rộng của độ phân giải màn hình là gì quên mất rồi!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Quan điểm của tôi là chọn giải pháp đơn giản hơn để giải quyết vấn đề
Rắc rối mà minhthien gặp phải là khi mở form trên 1 máy tính có độ phân giải khác với độ phân giải trên máy tính thiết kế thì các control trên form có thể bị lệch
Vậy chỉ cần khi load form, kiểm tra xem độ phân giải hiện hành có đúng chuẩn hay không, nếu khác thì chạy code thay đổi độ phân giải ---> Sau khi đóng form (hoặc đóng file) ta trả mọi thứ về như lúc đầu
Code chuyển độ phân giải cũng khá đơn giản
PHP:
Private Declare Function GetDesktopWindow Lib "User32" () As Long
Private Declare Function GetWindowRect Lib "User32" (ByVal hWnd As Long, rectangle As RECT) As Long
Private Declare Function ChangeDisplaySettings Lib "User32" Alias _
  "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function EnumDisplaySettings Lib "User32" Alias _
  "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean

PHP:
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CCFORMNAME = 32
Const CCDEVICENAME = 32

PHP:
Private Type DEVMODE
  dmDeviceName As String * CCDEVICENAME
  dmSpecVersion As Integer
  dmDriverVersion As Integer
  dmSize As Integer
  dmDriverExtra As Integer
  dmFields As Long
  dmOrientation As Integer
  dmPaperSize As Integer
  dmPaperLength As Integer
  dmPaperWidth As Integer
  dmScale As Integer
  dmCopies As Integer
  dmDefaultSource As Integer
  dmPrintQuality As Integer
  dmColor As Integer
  dmDuplex As Integer
  dmYResolution As Integer
  dmTTOption As Integer
  dmCollate As Integer
  dmFormName As String * CCFORMNAME
  dmUnusedPadding As Integer
  dmBitsPerPel As Integer
  dmPelsWidth As Long
  dmPelsHeight As Long
  dmDisplayFlags As Long
  dmDisplayFrequency As Long
End Type
PHP:
Type RECT
  x1 As Long
  y1 As Long
  x2 As Long
  y2 As Long
End Type

PHP:
Function Change_SR(iWidth As Single, iHeight As Single)
  Dim DevM As DEVMODE, EDS As Boolean, i As Long
  Do
    EDS = EnumDisplaySettings(0&, i&, DevM)
    i = i + 1
  Loop Until EDS = False
  DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
  DevM.dmPelsWidth = iWidth
  DevM.dmPelsHeight = iHeight
  ChangeDisplaySettings DevM, 0
End Function

PHP:
Function Get_SR() As String
  Dim R As RECT
  Application.Volatile
  GetWindowRect GetDesktopWindow(), R
  Get_SR = (R.x2 - R.x1) & "x" & (R.y2 - R.y1)
End Function
----------------
Đây là cái "sườn" ---> Để chạy code ta thêm đoạn nữa:
PHP:
Sub ChangeScreenResolution()
  Dim NewSR
  On Error GoTo ExitSub
  NewSR = LCase(Application.InputBox("Go do phan giai vao day" & vbLf & _
          "Vi du: 1025X768", Type:=2))
  Change_SR CLng(Split(NewSR, "x")(0)), CLng(Split(NewSR, "x")(1))
ExitSub:
End Sub
- Chạy code này, sẽ xuất hiện InputBox cho nhập vào độ phân giải, ví du nhập: 1280x800
- Hàm Get_SR dùng để lấy giá trị độ phân giải hiện hành ---> Cái này dùng cho trường hợp ta muốn trả giá trị độ phân giải về nguyên gốc đương nhiên ta phải lưu giữ giá trị ban đầu
-----------------
Theo tôi, giải pháp này khoẻ hơn rất nhiều so với việc đi chỉnh kích thước của từng Control (mà chắc gì đã chính xác và thẩm mỹ)
Mọi thứ đã có sẳn, ráp vào file là chuyện của bạn
 

File đính kèm

Upvote 0
Quan điểm của tôi lại khác. Viết 1 ứng dụng không nên xen vào hoặc thay đổi hệ thống. Dù cho sau đó trả về cài đặt gốc đi nữa.
Lý do là người dùng không phải chỉ chạy 1 ứng dụng của mình! Thí dụ Form của MinhThien thiết kế đòi set về 1024 x 768, nhưng khi chạy đồng thời ứng dụng Corel, người ta muốn 1152 x 864 cơ! Chả lẽ bắt người ta làm đồng thời cái gì đó 1 cách khó chịu?
Hoặc 1 ứng dụng trời ơi khác đòi set về 800 x 600, thương ai bỏ ai đây?

Đã tìm ra Hàm lấy Screen Width của hệ thống. Vui lòng tải lại file dưới đây.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Quan điểm của tôi lại khác. Viết 1 ứng dụng không nên xen vào hoặc thay đổi hệ thống. Dù cho sau đó trả về cài đặt gốc đi nữa.
Lý do là người dùng không phải chỉ chạy 1 ứng dụng của mình! Thí dụ Form của MinhThien thiết kế đòi set về 1024 x 768, nhưng khi chạy đồng thời ứng dụng Corel, người ta muốn 1152 x 864 cơ! Chả lẽ bắt người ta làm cái gì đó đồng thời 1 cách khó chịu?

Đã tìm ra Hàm lấy Screen Width của hệ thống. Vui lòng tải lại file dưới đây.
Như em đã nói, code em đưa ở trên vẫn có khả năng trả mọi thứ về như cũ ---> Vậy thì cho dù sư phụ có chạy đồng thời nhiều ứng dụng, trong đó có 1 vài ứng dụng bắt buộc phải có độ phân giải khác thì... cũng chẳng hề gì (Wb Deactive ta sẽ trả về nguyên gốc)
Chứ còn viết code kiểu thay đổi kích thước các control, em cho là không mấy hiệu quả ---> Chỉ mới có nhiêu đó control mà code của sư phụ đã dài thòng lòng rồi ---> Em đang nghĩ với 1 form có chừng 5 page + vài chục control thì... Ẹc... Ẹc... vã mồ hôi
(Em đang chơi 1 vài Game, chương trình của nó tự thay đổi độ phân giải màn hình, đến khi kết thúc, nó trả về như củ ---> em thấy đâu có ảnh hưởng gì)
 
Upvote 0
Ẹc
Chơi game thì cắm đầu vào chơi, chứ làm việc thì chạy qua chạy lại liên tục. Mỗi lần chạy qua chạy lại nó chớp giựt màn hình 1 phát! Máy yếu yếu thì ngồi chờ ít nhất 1 vài giây. Có những PM trời ơi còn bắt set về 800 x 600 nữa cơ. Mà chẳng chịu trả về mới đau.
Tuy nhiên, ndu nói không phải không có lý. Để khắc phục cái sự tranh luận này, hãy viết bằng VB. VB dùng 1 đơn vị tính là % màn hình hệ thống. Khoẻ re.
 
Upvote 0
Ẹc
Chơi game thì cắm đầu vào chơi, chứ làm việc thì chạy qua chạy lại liên tục. Mỗi lần chạy qua chạy lại nó chớp giựt màn hình 1 phát! Máy yếu yếu thì ngồi chờ ít nhất 1 vài giây. Có những PM trời ơi còn bắt set về 800 x 600 nữa cơ. Mà chẳng chịu trả về mới đau.
Tuy nhiên, ndu nói không phải không có lý. Để khắc phục cái sự tranh luận này, hãy viết bằng VB. VB dùng 1 đơn vị tính là % màn hình hệ thống. Khoẻ re.
Ah... còn 1 rắc rối nữa sư phụ à: Lúc Zoom form có 1 vài control bị che khuất, đúng ra là nó trôi tuốt xuống dưới cùng nên chẳng tải nào dùng được (cụ thể trong file sư phụ là cái CommnadButton)
Em nghĩ liệu có nên tạo cho form 2 cái Scrollbar không nhỉ?
 
Upvote 0
Cái đó anh có thấy. Không phải bị trôi tuột đi đâu, mà là cái Listbox nó phản ứng rất kỳ cục với code trong sự kiện initialize. Những control khác thì không kỳ cục. Nếu pause code vài giây chạy tiếp thì lại được.
Nó không giảm kích thước và che khuất cái button đó. Nhưng với sự kiện Form_Resize thì lại ổn. Chả biết trên máy khác thì thế nào?
 
Upvote 0
Quan điểm của tôi là chọn giải pháp đơn giản hơn để giải quyết vấn đề
Rắc rối mà minhthien gặp phải là khi mở form trên 1 máy tính có độ phân giải khác với độ phân giải trên máy tính thiết kế thì các control trên form có thể bị lệch
Vậy chỉ cần khi load form, kiểm tra xem độ phân giải hiện hành có đúng chuẩn hay không, nếu khác thì chạy code thay đổi độ phân giải ---> Sau khi đóng form (hoặc đóng file) ta trả mọi thứ về như lúc đầu
Code chuyển độ phân giải cũng khá đơn giản

-----------------
Theo tôi, giải pháp này khoẻ hơn rất nhiều so với việc đi chỉnh kích thước của từng Control (mà chắc gì đã chính xác và thẩm mỹ)
Mọi thứ đã có sẳn, ráp vào file là chuyện của bạn
Em cũng dùng code trên để chỉnh độ phân giải màn hình cho ứng dụng của em cả ở VB và Access nhưng vấn đề đang gặp của em mà chưa tìm ra cách đó là trước khi chạy phải kiểm tra độ phân giải màn hình, lưu độ phân giải màn hình đó vào 1 biến, khi thoát khỏi chương trình thì Reset nó lại.... +-+-+-++-+-+-++-+-+-+
 
Upvote 0
Nếu đưa code CtrlResize vào sự kiện form_Activate thì lại ổn. Dường như khi load form nó đã tự chạy UserForm_Resize hay cái gì đó rồi.
PHP:
Private Sub UserForm_Activate()
CtrlResize
End Sub
 
Upvote 0
Em cũng dùng code trên để chỉnh độ phân giải màn hình cho ứng dụng của em cả ở VB và Access nhưng vấn đề đang gặp của em mà chưa tìm ra cách đó là trước khi chạy phải kiểm tra độ phân giải màn hình, lưu độ phân giải màn hình đó vào 1 biến, khi thoát khỏi chương trình thì Reset nó lại.... +-+-+-++-+-+-++-+-+-+
Code tôi đưa ở trên có hàm kiểm tra độ phân giải hiện hành mà bạn (hàm Get_SR)---> Trước khi chạy code, dùng nó mà kiểm tra rồi lưu giá trị vào đâu đó
----------------------
Cái đó anh có thấy. Không phải bị trôi tuột đi đâu, mà là cái Listbox nó phản ứng rất kỳ cục với code trong sự kiện initialize. Những control khác thì không kỳ cục. Nếu pause code vài giây chạy tiếp thì lại được.
Nó không giảm kích thước và che khuất cái button đó. Nhưng với sự kiện Form_Resize thì lại ổn. Chả biết trên máy khác thì thế nào?
Bởi vậy mới nói là nó còn tùy thuộc vào màn hình người dùng đang chạy nữa ---> Màn hình sư phụ không bị nhưng màn hình em đang dùng thì lại có vấn đề (màn hình em đang dùng thuộc dạng màn hình rộng, độ phân giải hiện hành = 1280 x 800)
 
Upvote 0
(màn hình em đang dùng thuộc dạng màn hình rộng, độ phân giải hiện hành = 1280 x 800)

A a a!

nếu màn hình dạng wide thì phải lấy thêm 1 tỷ lệ nữa cho các controls là:
MRate3 = Fm1.Height/450

(450 là chiều cao trong màn hình thiết kế 1024 x 768)
Vậy cái gì liên quan đến bề ngang như Width và Left, thì nhân với MRate2, cái gì liên quan đến bề đứng như Height và Top thì nhân với MRate3.

Và 1 tỷ lệ khác cho kích thước form là

PHP:
ScreenWidth = GetSystemMetrics32(XScreen)
Mrate1 = ScreenWidth / 1024
ScreenHeight = GetSystemMetrics32(YScreen)
Mrate4 = ScreenHeight / 768
Fm1.Width = 600 * Mrate1
Fm1.Height = 450 * Mrate4

Nếu màn hình CRT 4 x 3 thì MRate1 = MRate4, MRate2 = MRate3


(Khổ quá nhỉ!)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom