Hiển thị form chạy giữa màn hình (Center form)

Liên hệ QC

thanhnhanubnd

Thành viên hoạt động
Tham gia
12/9/08
Bài viết
180
Được thích
29
Nghề nghiệp
Xay dung
Mình đã làm được. Mình xin hỏi, để form mặc định center thì chỉnh trong properties là ok.Nhưng viết code để : form đang ở chế độ top,left về center thì phải làm sao?
 
Mã:
Public Sub CenterForm(f As Form, Optional f2 As Variant)
'********************************************************
' Centers a form relative to the screen or
' another form
'********************************************************
   If IsMissing(f2) Then
      f.Move (Screen.Width - f.Width) / 2, _
             (Screen.Height - f.Height) / 2
   Else
      ' If f is an MDI child in a MDI parent then
      ' center f within the parent.
      If f.MDIChild And Not f2.MDIChild Then
            f.Move ((f2.Width - f.Width) / 2), _
            ((f2.Height - f.Height) / 2)
      Else
         f.Move ((f2.Width - f.Width) / 2) + f2.Left, _
                ((f2.Height - f.Height) / 2) + f2.Top
      End If
   End If
End Sub

Chú ý: Lần sau bạn đừng tiện tay hỏi vào 1 topic có nội dung khác của bạn như thế nữa nhé. Mỗi topic chỉ bàn về 1 chủ đề mà thôi. Muốn hỏi vấn đề khác thì mở 1 topic khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có thể hướng dẫn chi tiết hơn không, ví dụ như sau :
Mình có 1 form mặc định center, sau khi mình resize : ( Me.Width = 700--> Me.Width = 500) thì không còn center nữa, Mình muốn sau khi thay đổi size thì form lại center.
 
Upvote 0
Trời!

Call CenterForm(frmMain) '// --> gọi từ Form_Load() hoặc từ Sub Main() trong Main.bat

Resize xong thì quan tâm tới center form làm gì nữa (Chưa thấy ai có nhu cầu này bao giờ), không nhẽ đặt nhích chuột 1 cái lại Center Form. Nếu ko thì đặt trong sự kiện Form_MouseUp ấy.

Mình chỉ hướng dẫn đến đó thôi, nhờ các VBAer trên GPE giúp bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình gửi lên dien đàn, file yêu cầu cụ thể, nhờ xem giúp.
 

File đính kèm

Upvote 0
Hai2Hai đưa đoạn mã đó là trong VB đòi hỏi phải có MDI form.
Thôi thì mình xác định theo như các bạn gọi là "củ chuối" như sau thôi:
Mã:
Private Sub UserForm_Resize()
Dim mtop As Double
Dim mleft As Double
mtop = 600
mleft = 950
Me.Top = mtop / 2 - Me.Height / 2
Me.Left = mleft / 2 - Me.Width / 2
End Sub
Nhưng mà cũng tạm nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hai2Hai đưa đoạn mã đó là trong VB đòi hỏi phải có MDI form.
Mọi người phải tự customized đi chứ -0-/.
Code mình đưa là full features in VB6 (Đó là code chuẩn mà hầu như tất cả các dân làm VB đều dùng), tuy nhiên mọi người phải sáng tạo khi áp dụng cho VBA chứ nhỉ. CenterForm là 1 loại code basic có rất nhiều ở các trang sourcecode mà.

Mã:
Public Sub CenterForm(f As Form, Optional f2 As Variant)
'********************************************************
' Centers a form relative to the screen or
' another form
'********************************************************
   If IsMissing(f2) Then '// Center Screen
      f.Move (Screen.Width - f.Width) / 2, _
             (Screen.Height - f.Height) / 2
   Else '// Center on another form
      f.Move ((f2.Width - f.Width) / 2) + f2.Left, _
             ((f2.Height - f.Height) / 2) + f2.Top
   End If
End Sub


Nếu mà đặt ở Private Sub UserForm_Resize()
Mã:
Me.Top = mtop / 2 - Me.Height / 2
thì khi Minimized mà viết thế sẽ bị Runtime Error (vì khi minimized mà Me.Top = ## là toi rồi).

Với lại, chưa có ai đặt CenterForm ở Form_Resize (Nhớ là cứ rê chuột 1 cái là nó chạy mọi thứ được viết trong Form_Resize --> Giật màn hình). Hãy đặt ở Form_Load (nếu ko có thì để ở Init hoặc _Active)

Và nên viết thành hàm chứ đừng viết luôn code trong từng form (Vì còn dùng cho các form khác mà)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn Sealand làm đối với với ví dụ của mình thì ok. Nhưng minh làm size form khác thì hơi... "trẹo" -\\/.
Bạn hai2hai giúp thì... chắc mình phải học, tìm hiểu thêm thôi ( chỉ học lóm của các bạn, nên cái " vụ" này mình chưa hiểu được -0-/.- nhưng mà mình tự an ủi là cứ từ từ, chắc khoảng chừng 10 năm nữa sẽ hiểu - Nói đùa).

Cám ơn các bạn rất nhiều./-*+/
À quên nữa, Sealand cho mình hỏi sau nick của bạn bây giờ có thêm dấu + vậy ...Sealand-->Sealand+...%#^#$
 
Lần chỉnh sửa cuối:
Upvote 0
Cứ vào thuộc tính của Form là biết, dùng sự kiện Activate là gán thuộc tính đó OK!
 
Upvote 0
Để có thể áp dụng được mình tạm thời làm như vậy, mình đang tìm cách lấy chỉ số top, left của màn hình. Bạn có thấy không: Trong VB thì các MIDI child đều nằm trên MDI parent và tọa độ lấy theo MDI parent, khi thu nhỏ hay ẩn MDI parent thì tất cả form con đều ẩn theo. Nhưng trong VBA lại khác, có thể ẩn Application khi mở form ngay trên desktop. Để thật chuẩn có lẽ phải xác định tọa độ đỉnh trái và độ phân giải màn hình mới căn chuẩn được. Đây là những ý kiến suy luận của mình thôi chứ cũng chưa thấy tài liệu nào nói đến về VBA.

Còn Nick của mình vẫn bình thường đấy chứ, chắc là bạn đùa mình chăng?
 
Upvote 0
Thấy các bạn bàn luận về vấn đề này khá sôi nổi nên tôi cũng xin mạo muội tham gia 1 tẹo.
1. Nên phân biệt các control, event, method, property giữa VB6 và VBA, người đặt câu hỏi cũng không rành mạch, người trả lời cũng không cụ thể -> tranh luận dài dài.
2. Một số biểu thức viết không chịu rút gọn để nảy sinh nhiều phép tính. Ví dụ: mtop / 2 - Me.Height / 2 nên rút gọn lại là (mtop - Me.Height )/ 2

3. Việc căn chỉnh form VBA về center screen cần thực hiện 2 bước:
- Ngay trong quá trình thiết kế (design) cần đặt luôn thuộc tính StartUpPosition của Form = 2(CenterScreen) để đỡ phải thêm code trong sự kiện Form_Activate.
- Căn chỉnh at runtime:
Tạo 1 module rồi nhét cái này vào:
PHP:
'Đành phải dùng API, tôi chưa tìm được cái nào hay hơn.
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Trong sự kiện cần căn chỉnh ta nhét đoạn code sau vào, giả sử là sự kiện UserForm_Resize
PHP:
Private Sub UserForm_Resize()
    Me.Left = (GetSystemMetrics(0) / 1.323 - Me.Width) / 2
    Me.Top = (GetSystemMetrics(1) / 1.323 - Me.Height) / 2
End Sub
Chắc chắn sẽ có bạn hỏi tôi rằng các hệ số trong hàm kia là gì, xin trả lời rằng tôi cũng lọ mọ trên mạng thấy người ta khai báo 2 hằng
Const SM_CXSCREEN As Long = 0
Const SM_CYSCREEN As Long = 1

Nhưng nếu khai báo như thế trong modeule và đưa 2 hằng này vào trong hàm trên thì chỉ đúng với SM_CXSCREEN, còn SM_CYSCREEN thì lại sai bét, chẳng hiểu sao nữa.
Còn hệ số 1.323 là sao: Tôi vừa tính toán ra tỷ lệ này giữa giá trị lấy được của hàm GetSystemMetrics(0) và Me.Width khi cho Me.Width = Chiều rộng màn hình.
Riêng vụ căn chỉnh này các bạn thử test lại xem thế nào, tôi test thấy đúng với màn hình 1024x768. Nếu với màn hình khác ta cũng có thể nội suy ra từ hệ số 1.323
Thử test xem nhé.
 
Upvote 0
Test với file của mình thì đúng rồi. Thank you.
 
Upvote 0
Web KT

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

Back
Top Bottom