Zoom Userform & Controls

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Theo ý tưởng của minhthien321 tại chủ đề Tặng các bạn thủ tục Form Zoom tôi làm với một phương pháp khác, tạo ra một form cho phép cõ giãn kích cỡ của form, các controls tự động co giãn theo tỷ lệ của form.

Cách làm rất đơn giản. Bạn hãy làm theo hướng dẫn sau:

1. Mở Userform, View Code
2. Dán đoạn code sau vào
Mã:
Option Explicit
[COLOR="#008000"][B]'Khai báo API[/B][/COLOR]
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000
Private Const WS_SIZEBOX = WS_THICKFRAME

[COLOR="#008000"][B]'Khai báo biến cho form[/B][/COLOR]
Dim hWnd&, PrevStyle&
Dim OldWidth As Double, OldHeight As Double
'--------------------------------------------------------------------------------------------
Private Sub UserForm_Initialize()
[COLOR="#008000"]   'Nhận độ rộng và độ cao ban đầu của form[/COLOR]
    OldWidth = Width
    OldHeight = Height
[COLOR="#008000"]   'Nhận handle/hWnd của form[/COLOR]
    If Val(Application.Version) < 9 Then
        hWnd = FindWindow("ThunderXFrame", Caption) [COLOR="#008000"] 'XL97[/COLOR]
    Else
        hWnd = FindWindow("ThunderDFrame", Caption) [COLOR="#008000"] 'XL2000[/COLOR]
    End If
[COLOR="#008000"]   'hWnd được dùng để thiết lập thuộc tính co giãn form, thêm nút Min, Max[/COLOR]
    PrevStyle = GetWindowLong(hWnd, GWL_STYLE)
    SetWindowLong hWnd, GWL_STYLE, PrevStyle _
                                Or WS_SIZEBOX _
                                Or WS_MINIMIZEBOX _
                                Or WS_MAXIMIZEBOX
End Sub
'--------------------------------------------------------------------------------------------
[COLOR="#008000"]   'Khi form co giãn thì tính lại Zoom theo chiều rộng của form[/COLOR]
Private Sub UserForm_Resize()
    Zoom = Round(Width / OldWidth * 100, 0)
End Sub

Sau khi thiết lập đúng như trên, bạn sẽ làm được như hình dưới đây:


zoomform.gif

Code hoàn chỉnh tôi gửi trong file đính kèm.
 

File đính kèm

  • ZoomFormAndControls.xls
    61.5 KB · Đọc: 438
Chỉnh sửa lần cuối bởi điều hành viên:
Hay quá! Đúng là trên cả tuyệt vời! Cám ơn Anh Tuân nhiều!
 
Upvote 0
Theo ý tưởng của minhthien321 tại chủ đề Tặng các bạn thủ tục Form Zoom tôi làm với một phương pháp khác, tạo ra một form cho phép cõ giãn kích cỡ của form, các controls tự động co giãn theo tỷ lệ của form.

Cách làm rất đơn giản. Bạn hãy làm theo hướng dẫn sau:

1. Mở Userform, View Code
2. Dán đoạn code sau vào

Code hoàn chỉnh tôi gửi trong file đính kèm.
Không ngờ code lại đơn giản thế
Tuy nhiên nếu thiết lập trước cho UserForm với Height = 180 và Width =240 thì sẽ có 1 lỗi xuất hiện khi bấm nút MAX

untitled.JPG

Không biết là nguyên nhân gì
Nhưng theo thông báo thì chỉ Set được Zoom từ 10 đến 400. Trong khi nếu tính toán thì sẽ thấy thời điểm này Zoom đang > 400
Nhờ Tuấn chỉnh lại giúp (chắc có liên quan đến kích thước của từng màn hình đây! Tôi dùng Laptop với màn hình rộng)
Có thể sửa thành vầy chăng:
PHP:
Private Sub UserForm_Resize()
  Dim Tmp&
  Tmp = Round(Width / OldWidth * 100, 0)
  If Tmp > 400 Then Tmp = 400
  Zoom = Tmp
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có thêm mấy ý kiến nữa:
1> Thời điểm hiện tại chắc chẳng còn ai xài Office 97, vậy chắc cũng không cần đoạn If Val(Application.Version) < 9 Then làm gì. Viết luôn thành: hWnd = FindWindow("ThunderDFrame", Caption) cho gọn
2> Không biết tại sao phải cần sự kiện này:
PHP:
Private Sub UserForm_Terminate()
  SetWindowLong hWnd, GWL_STYLE, PrevStyle
End Sub
Ý tôi muốn nói nếu không Set Window về vị trí cũ thì có vấn đề gì không? (trước giờ tôi toàn bỏ luôn công đoạn này)
3> Code của Tuân chỉ tính đến chiều ngang (Width). Vậy nếu bắt buộc phải tính cả 2 chiều (Width và Height) thì phải làm sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có thêm mấy ý kiến nữa:
1> Thời điểm hiện tại chắc chẳng còn ai xài Office 97, vậy chắc cũng không cần đoạn If Val(Application.Version) < 9 Then làm gì. Viết luôn thành: hWnd = FindWindow("ThunderDFrame", Caption) cho gọn
2> Không biết tại sao phải cần sự kiện này:
PHP:
Private Sub UserForm_Terminate()
  SetWindowLong hWnd, GWL_STYLE, PrevStyle
End Sub
Ý tôi muốn nói nếu không Set Window về vị trí cũ thì có vấn đề gì không? (trước giờ tôi toàn bỏ luôn công đoạn này)
3> Code của Tuân chỉ tính đến chiều ngang (Width). Vậy nếu bắt buộc phải tính cả 2 chiều (Width và Height) thì phải làm sao?

Vấn đề 1. Đúng là còn ít người dùng Excel 97 rồi, em cố tình để nó có tính tổng quát cho mọi phiên bản Excel. Biết đâu ông Tây nào chưa có tiền mua Excel mới vẫn dùng 97 thì sao nhỉ :d

Vấn đề 2. Trong hoàn cảnh này đúng ra là không nhất thiết phải hoàn trả thiết lập cho form. Vì muốn nhắc nhở các bạn học lập trình là thay đổi cái gì, khi không dùng thì phải hoàn trả về cái ban đầu của nó. Đây là thói quen tốt! Âu cũng là quan điểm của em :).

Vấn đề 3. Vì khung hình của các controls ảnh hưởng của chiều rộng form nên lấy chiều rộng làm chuẩn, còn độ cao thì ít ảnh hưởng. Phiên bản tới đây em sẽ thiết lập cả chiều rộng và chiều cao theo tỷ lệ ban đầu của form khi Zoom nằm ngoài khoảng 10, 400

Tôi định làm khi kéo chiều rộng form thì chiều cao cũng thay đổi hoặc kéo chiều cao thì chiều rộng cũng thay đổi, không biết có cần thiết không? Các bạn chi ý kiến, nếu thấy cần làm vậy tôi sẽ làm.
 
Upvote 0
Đúng rồi đó anh Tuân, nếu thay đổi bất kỳ chiều nào, thì cả hai chiều giản ra tương ứng thì sẽ hay hơn.

@Thầy Ndu: Nếu bẫy 400 thì cũng nên bẫy 10 vậy.

PHP:
Private Sub UserForm_Resize()
  Dim Tmp&
  Tmp = Round(Width / OldWidth * 100, 0)
  If Tmp > 400 Then Tmp = 400
  If Tmp < 10 Then Tmp = 10
  Zoom = Tmp
End Sub
 
Upvote 0
Vấn đề 3. Vì khung hình của các controls ảnh hưởng của chiều rộng form nên lấy chiều rộng làm chuẩn, còn độ cao thì ít ảnh hưởng. Phiên bản tới đây em sẽ thiết lập cả chiều rộng và chiều cao theo tỷ lệ ban đầu của form khi Zoom nằm ngoài khoảng 10, 400

Tôi định làm khi kéo chiều rộng form thì chiều cao cũng thay đổi hoặc kéo chiều cao thì chiều rộng cũng thay đổi, không biết có cần thiết không? Các bạn chi ý kiến, nếu thấy cần làm vậy tôi sẽ làm.
Thật ra hỏi là để học thêm về các giải pháp thôi chứ với cái Form ấy, code ấy, tôi đánh giá là quá hoàn hảo rồi. Ăn tiền ở chổ chỉ cần chỉnh Zoom là mọi thứ sẽ zoom theo
 
Upvote 0
Nâng cấp phiên bản Zoom Userform & Controls

Xin gửi các thành viên phiên bản sửa lỗi của Zoom Userform & Controls

Cần thêm đoạn khai báo hằng số và khai báo biến
Mã:
Private Const ZoomMin = 10[COLOR="#008000"] 'VBA cho phép mức thấp nhất là 10[/COLOR]
Private Const ZoomMax = 400[COLOR="#008000"] 'VBA cho phép mức cao nhất là 400. [/COLOR]
Dim AllowResize As Boolean

Bạn có thể tự thay đổi giá trị của ZoomMin và ZoomMax trong pham vi 10-400. ví dụ bạn muốn form của bạn chỉ cho phép zoom thấp nhất là 50 và cao nhất là 200 thì thay
Mã:
Private Const ZoomMin = 50
Private Const ZoomMax = 200

Biến AllowResize để ngăn cản việc chạy lại sự kiện Resize khi thay đổi Width, Height của form trong code. AllowResize = True khi khởi tạo form.

Sựu kiện UserForm_Resize được thay đổi như sau

Mã:
Private Sub UserForm_Resize()
    Dim tmpZoom As Long
    If Not AllowResize Then Exit Sub
    tmpZoom = Round(Width / OldWidth * 100, 0)
    If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
    If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
    If tmpZoom = ZoomMin Or tmpZoom = ZoomMax Then [COLOR="#008000"]'Điều chỉnh lại form khi kích cỡ ngoài khoảng ZoomMin, ZoomMax[/COLOR]
        [COLOR="#008000"]'Nếu không phải là phóng to form toàn màn hình thì điều chỉnh kích cõ form đúng tỷ lệ ban đầu[/COLOR]
        If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
            AllowResize = False [COLOR="#008000"]'Ngăn không chạy UserForm_Resize khi đang thay đổi size[/COLOR]
            Width = tmpZoom * OldWidth / 100
            Height = Width * OldHeight / OldWidth
            AllowResize = True [COLOR="#008000"]'Cho phép resize[/COLOR]
        End If
    End If
    Zoom = tmpZoom [COLOR="#008000"]'Luôn phải đảm bảo  10<=Zoom<=400[/COLOR]
End Sub

Code hoàn chỉnh nằm trong file ở trang đầu.
 
Upvote 0
Nếu Dim tmpZoom As Long thì đâu cần phải Round(Width / OldWidth * 100, 0) phải không anh Tuân? Chỉ cần vầy là được Width / OldWidth * 100

Cho hỏi thêm, làm sao để Resize chiều rộng thì có thể tự chỉnh chiều cao tương ứng được ạ? Cảm ơn rất nhiều vì đã chia sẽ thuật toán trên diễn đàn ạ!

Mình được voi đòi tiên chứ cái Form này mình mơ cũng chưa nghĩ ra được! Kiểu viết code của anh Tuân thật độc đáo, những số liệu đều được thay thế bằng chữ, tuy thấy dài dòng văn tự nhưng thật ra rất dễ biết những thông số là cái gì, chừng vài tháng sau nhìn lại code cũng còn hiểu và nhớ mình làm gì! Em sẽ học theo cách trình bày code này! Cám ơn Anh.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu Dim tmpZoom As Long thì đâu cần phải Round(Width / OldWidth * 100, 0) phải không anh Tuân? Chỉ cần vầy là được Width / OldWidth * 100

Cho hỏi thêm, làm sao để Resize chiều rộng thì có thể tự chỉnh chiều cao tương ứng được ạ? Cảm ơn rất nhiều vì đã chia sẽ thuật toán trên diễn đàn ạ!

Mình được voi đòi tiên chứ cái Form này mình mơ cũng chưa nghĩ ra được! Kiểu viết code của anh Tuân thật độc đáo, những số liệu đếu được thay thế bằng chữ, tuy thấy dài dòng văn tự nhưng thật ra rất dễ biết những thông số là cái gì, chừng vài tháng sau nhìn lại code cũng còn hiểu và nhớ mình làm gì! Em sẽ học theo cách trình bày code này! Cám ơn Anh.

Muốn lấy chiều cao tỷ lệ với chiều rộng ta viết code
Height = Width * OldHeight / OldWidth

Còn biến Long và Round thì đây lại là thói quen của mình :).
 
Upvote 0
Muốn lấy chiều cao tỷ lệ với chiều rộng ta viết code
Height = Width * OldHeight / OldWidth

Còn biến Long và Round thì đây lại là thói quen của mình :).


Em thấy có đoạn code đó trong form:

Mã:
        If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
            AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
            Width = tmpZoom * OldWidth / 100
            Height = Width * OldHeight / OldWidth
            AllowResize = True 'Cho phep resize
        End If

Thế nhưng hình như nó không chạy hay sao đó anh. Còn nếu Height = Width * OldHeight / OldWidth mà để ra ngoài thì lỗi liền khi Max/Min vì nó không cho thay đổi kích cỡ khi đang Max/Min.
 
Upvote 0
Em thấy rằng khi Form đang Min, thì Height của nó bằng 19.5 thôi vì thế em nghĩ nên làm như vầy (kiểu nông dân làm máy bay ấy mà):

PHP:
Private Sub UserForm_Resize()
    Dim tmpZoom As Long, MinHeight As Long
    MinHeight = 20
    If Not AllowResize Then Exit Sub
    tmpZoom = Width / OldWidth * 100
    If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
    If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
    If Height <= MinHeight Then Exit Sub
    If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
        AllowResize = False ''Ngan khong chay UserForm_Resize khi dang thay doi size
        Width = tmpZoom * OldWidth / 100
        Height = Width * OldHeight / OldWidth
        AllowResize = True 'Cho phep resize
    End If
    Zoom = tmpZoom
End Sub

Như vậy thì mình kéo ra, vào đều chạy ổn định.
 
Lần chỉnh sửa cuối:
Upvote 0
Em thấy có đoạn code đó trong form:

Mã:
        If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
            AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
            Width = tmpZoom * OldWidth / 100
            Height = Width * OldHeight / OldWidth
            AllowResize = True 'Cho phep resize
        End If

Thế nhưng hình như nó không chạy hay sao đó anh. Còn nếu Height = Width * OldHeight / OldWidth mà để ra ngoài thì lỗi liền khi Max/Min vì nó không cho thay đổi kích cỡ khi đang Max/Min.

Chạy đấy. Nó là kiểm tra form có phải trạng thái Max không thì mới cho phép chạy lệnh bên trong. Mình kiểm tra kỹ rồi.

Còn muốn nó thay đổi khi resize thì gán ở đoạn khác.

Mã:
Private Sub UserForm_Resize()
    Dim tmpZoom As Long
    If Not AllowResize Then Exit Sub
    tmpZoom = Round(Width / OldWidth * 100, 0)
    If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
    If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
    If tmpZoom = ZoomMin Or tmpZoom = ZoomMax Then
        'Neu khong phai la phong to man hinh thi co lai kich co
        If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
            AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
            Width = tmpZoom * OldWidth / 100
            Height = Width * OldHeight / OldWidth
            AllowResize = True 'Cho phep resize
        Else
            
        End If
    End If
[COLOR="#0000FF"]    If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
        Height = Width * OldHeight / OldWidth
    End If[/COLOR]
    Zoom = tmpZoom
End Sub

Theo mình thì không nên tự lấy Height vì đôi khi người dùng tự thay đổi chiều cao của form cho phù hợp với danh sách mã hàng bên dưới chẳng hạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Chạy đấy. Nó là kiểm tra form có phải trạng thái Max không thì mới cho phép chạy lệnh bên trong. Mình kiểm tra kỹ rồi.

Còn muốn nó thay đổi khi resize thì gán ở đoạn khác.

Em lại kiểm tra thêm rằng, nếu tmpZoom As Long được thay bằng tmpZoom As Double và đừng dùng hàm Round thì Form nó Zoom mượt mà hơn vì hình như phần thập phân nó cũng được tính.
 
Upvote 0
Em lại kiểm tra thêm rằng, nếu tmpZoom As Long được thay bằng tmpZoom As Double và đừng dùng hàm Round thì Form nó Zoom mượt mà hơn vì hình như phần thập phân nó cũng được tính.

Không phải thế đâu, có thể cảm giác của bạn thôi. Zoom chỉ nhận giá trị nguyên. Mình vẫn dùng hàm Round vì nó đúng với mọi ngôn ngữ khác. Những người lập trình VB ban đầu thường không để ý kỹ kiểu dữ liệu (phó mặc cho VB tự nhận và chạy), sau này gặp nhiều rắc rối.
 
Upvote 0
Chạy đấy. Nó là kiểm tra form có phải trạng thái Max không thì mới cho phép chạy lệnh bên trong. Mình kiểm tra kỹ rồi.

Còn muốn nó thay đổi khi resize thì gán ở đoạn khác.

Mã:
Private Sub UserForm_Resize()
    Dim tmpZoom As Long
    If Not AllowResize Then Exit Sub
    tmpZoom = Round(Width / OldWidth * 100, 0)
    If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
    If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
    If tmpZoom = ZoomMin Or tmpZoom = ZoomMax Then
        'Neu khong phai la phong to man hinh thi co lai kich co
        If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
            AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
            Width = tmpZoom * OldWidth / 100
            Height = Width * OldHeight / OldWidth
            AllowResize = True 'Cho phep resize
        Else
            
        End If
    End If
[COLOR=#0000FF]    If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
        Height = Width * OldHeight / OldWidth
    End If[/COLOR]
    Zoom = tmpZoom
End Sub

Theo mình thì không nên tự lấy Height vì đôi khi người dùng tự thay đổi chiều cao của form cho phù hợp với danh sách mã hàng bên dưới chẳng hạn.

Anh ơi, gán đoạn đó vô sẽ bị lỗi khi Min đấy ạ!

cứ như kiểu củ chuối của em thì lại hiệu quả!

Mã:
Private Sub UserForm_Resize()
    Dim tmpZoom As Double, MinHeight As Double
   [COLOR=#0000cd] MinHeight = 20[/COLOR]
    If Not AllowResize Then Exit Sub
    tmpZoom = Width / OldWidth * 100
    If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
    If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
    [COLOR=#0000cd]If Height <= MinHeight Then Exit Sub[/COLOR]
    If Not (GetWindowLong(hWnd, GWL_STYLE) And WS_MAXIMIZE) = WS_MAXIMIZE Then
        AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
        Width = tmpZoom * OldWidth / 100
        Height = Width * OldHeight / OldWidth
        AllowResize = True 'Cho phep resize
    End If
    Zoom = tmpZoom
End Sub
 
Upvote 0
Không phải thế đâu, có thể cảm giác của bạn thôi. Zoom chỉ nhận giá trị nguyên. Mình vẫn dùng hàm Round vì nó đúng với mọi ngôn ngữ khác. Những người lập trình VB ban đầu thường không để ý kỹ kiểu dữ liệu (phó mặc cho VB tự nhận và chạy), sau này gặp nhiều rắc rối.

Về chuyên môn thì em không dám bàn với anh, nhưng em đã thử 2 cái và nhận thấy nếu dùng Long kết hợp với Round trong trường hợp này thì form khi kéo giản nó giựt giựt và giống như Repaint màn hình vậy, còn để lại những vệt rất nhanh, không chụp hình lại được chứ không em gửi cho anh xem. Còn không dùng thì không hề có chuyện này!

Có lẽ do máy anh mạnh nên không thấy sự khác biệt, còn máy yếu sẽ thấy điều đó. Song, em nghĩ nên thiết kế mà chạy được trên máy yếu thì máy mạnh là vô tư rồi đúng không anh. Hihihi

CÁM ƠN ANH RẤT NHIỀU!!!
 
Lần chỉnh sửa cuối:
Upvote 0
Về chuyên môn thì em không dám bàn với anh, nhưng em đã thử 2 cái và nhận thấy nếu dùng Long kết hợp với Round trong trường hợp này thì form khi kéo giản nó giựt giựt và giống như Repaint màn hình vậy, còn để lại những vệt rất nhanh, không chụp hình lại được chứ không em gửi cho anh xem. Còn không dùng thì không hề có chuyện này!

Có lẽ do máy anh mạnh nên không thấy sự khác biệt, còn máy yếu sẽ thấy điều đó. Song, em nghĩ nên thiết kế mà chạy được trên máy yếu thì máy mạnh là vô tư rồi đúng không anh. Hihihi

CÁM ƠN ANH RẤT NHIỀU!!!

Sau khi minhthien321 góp ý về việc không dùng hàm ROUND thì màn hình mịn, mặc dù thấy vô lý nhưng mình cũng đã kiểm tra lại việc không dùng hàm ROUND, thì lúc chạy cũng không khác một chút nào với trước, màn hình vẫn không đạt mịn.

Còn viết code để Height tự thay đổi theo Width thì code như dưới đây.

Mã:
Private Sub UserForm_Resize()
    Dim tmpZoom As Long, CurStyle&
    If Not AllowResize Then Exit Sub
    CurStyle = GetWindowLong(hWnd, GWL_STYLE)
    tmpZoom = Round(Width / OldWidth * 100, 0)
    If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
    If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
    If tmpZoom = ZoomMin Or tmpZoom = ZoomMax Then
        'Neu khong phai la phong to man hinh thi co lai kich co
        If Not (CurStyle And WS_MAXIMIZE) = WS_MAXIMIZE Then
            AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
            Width = tmpZoom * OldWidth / 100
            Height = Width * OldHeight / OldWidth
            AllowResize = True 'Cho phep resize
        Else
            
        End If
    End If
[COLOR="#0000FF"]    If Not ((CurStyle And WS_MAXIMIZE) = WS_MAXIMIZE Or _
            (CurStyle And WS_MINIMIZE) = WS_MINIMIZE) Then
        Height = Width * OldHeight / OldWidth
    End If[/COLOR]
    Zoom = tmpZoom
End Sub
 
Upvote 0
Sau khi minhthien321 góp ý về việc không dùng hàm ROUND thì màn hình mịn, mặc dù thấy vô lý nhưng mình cũng đã kiểm tra lại việc không dùng hàm ROUND, thì lúc chạy cũng không khác một chút nào với trước, màn hình vẫn không đạt mịn.
Chắc là vậy rồi, vì tôi đã thử và không thấy có sự khác biệt khi biến là Double và không dùng ROUND so với khi biến là Long
Trong Help của Excel rõ ràng viết rằng:
Chắc Nghĩa.. cảm giác thôi!
 
Upvote 0
Chắc là vậy rồi, vì tôi đã thử và không thấy có sự khác biệt khi biến là Double và không dùng ROUND so với khi biến là Long
Trong Help của Excel rõ ràng viết rằng:

Chắc Nghĩa.. cảm giác thôi!

Bằng mắt thường cũng cảm nhận được mà Anh Tuân:

Code chạy ban đầu là double, nhìn có vẽ mịn màng hơn, không có vệt hoặc rất ít, còn code sau chạy Long, thấy rất là rõ những vệt trắng, xanh khi resize.

[video=youtube;s-9_oUFazdI]http://www.youtube.com/watch?v=s-9_oUFazdI[/video]
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom