• Thứ Tư, 18/10/2006 09:23 (GMT+7)

    Hàm API thay đổi độ phân giải màn hình

    Câu hỏi :
    Xin hỏi trong VB.Net hay C# dùng hàm Windows API nào để thay đổi độ phân giải của màn hình.
     

    Trả lời :

    Để xem và thay đổi độ phân giải của card màn hình một cách động trong ứng dụng, Windows cung cấp 2 hàm API sau đây:

     - Hàm EnumDisplaySettings() cho phép duyệt xem từng chế độ phân giải mà card màn hình hỗ trợ.
     - Hàm ChangeDisplaySettings() cho phép thiết lập độ phân giải mà card màn hình hỗ trợ.

    Lưu ý rằng 2 hàm API trên là do Windows cung cấp nên bạn có thể gọi chúng ở bất kỳ ngôn ngữ lập trình nào. Tuy nhiên nếu đang lập trình bằng các ngôn ngữ .Net như VB .Net, VC#, VJ#, bạn cũng có thể dùng các class .Net để giải quyết cùng vấn đề nhưng dễ dàng, ngắn gọn và an toàn hơn.

    Sau đây là 1 ứng dụng nhỏ viết bằng VB .Net dùng 2 hàm API trên để chuyển card màn hình về chế độ 1024*768*16 bit màu. Qui trình thực hiện ứng dụng cụ thể như sau: chạy Visual Studio .Net, tạo 1 Project VB .Net mới (loại Windows Application). Sau khi 1 Form trống được tạo ra, bạn hãy vào menu View.Code để xem source code của class Form1 rồi viết thêm đoạn code sau vào class Form1:

     'khai báo các hằng cần dùng
     Private Const CCDEVICENAME As Short = 32
     Private Const CCFORMNAME As Short = 32
     'khai báo kiểu miêu tả thông tin về 1 chế độ phân giải
     Private Structure typDevMODE
     <VBFixedString(CCDEVICENAME), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> Public dmDeviceName As String
     Dim dmSpecVersion As Short
     Dim dmDriverVersion As Short
     Dim dmSize As Short
     Dim dmDriverExtra As Short
     Dim dmFields As Integer
     Dim dmOrientation As Short
     Dim dmPaperSize As Short
     Dim dmPaperLength As Short
     Dim dmPaperWidth As Short
     Dim dmScale As Short
     Dim dmCopies As Short
     Dim dmDefaultSource As Short
     Dim dmPrintQuality As Short
     Dim dmColor As Short
     Dim dmDuplex As Short
     Dim dmYResolution As Short
     Dim dmTTOption As Short
     Dim dmCollate As Short
     <VBFixedString(CCFORMNAME), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> Public dmFormName As String
     Dim dmUnusedPadding As Short
     Dim dmBitsPerPel As Short
     Dim dmPelsWidth As Integer
     Dim dmPelsHeight As Integer
     Dim dmDisplayFlags As Integer
     Dim dmDisplayFrequency As Integer
     End Structure
     'khai báo các hàm API cần dùng
     Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lptypDevMode As typDevMODE) As Boolean
     Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef lptypDevMode As typDevMODE, ByVal dwFlags As Integer) As Integer
     
     'hiện thực hàm Form1_Activated
     'hàm này sẽ chạy khi Form ứng dụng được tạo ra
     Private Sub Form1_Activated(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Activated
     Dim i As Object
     Dim typDevM As typDevMODE
     Dim lngResult As Integer
     Dim intAns As Short
     Dim imode As Short
     'duyệt tìm chế độ màn hình cần chuyển tới
     imode = 0
     Do
     lngResult = EnumDisplaySettings(0, imode, typDevM)
     If lngResult <> 0 And typDevM.dmPelsWidth = 1024 And typDevM.dmPelsHeight = 768 And typDevM.dmBitsPerPel = 16 Then
     'nếu tìm được thì chuyển sang chế độ này
     lngResult = ChangeDisplaySettings(typDevM, 0)
     ' rồi dừng vòng duyệt tìm
     Exit Do
     End If
     imode = imode + 1
     Loop While lngResult <> 0
     End Sub
     

    Chuyên mục: Lập trình