• Thứ Năm, 08/01/2004 14:53 (GMT+7)

    Câu hỏi :
    Hỏi: Xin hướng dẫn cách đổi pixel (phụ thuộc thiết bị) thành một đơn vị đo lường không phụ thuộc thiết bị (như millimeter chẳng hạn)?

    Trả lời :

    Đáp: Có nhiều cách đổi giá trị từ đơn vị đo lường này (td. pixel) sang giá trị theo đơn vị đo lường khác (td. millimeter). Nếu bạn đang lập trình bằng môi trường VB thì hàm Pixels2Milimet sau đây sẽ cho phép bạn đổi 1 giá trị độ dài tính theo đơn vị pixel trên màn hình thành giá trị độ dài tính theo millimeter:

    Private Function Pixels2Milimet(val As Long) As Double

    Dim OldMode As Integer

    Dim Wm As Integer

    Dim Wp As Integer

    Dim ppm As Double

       ' Nhớ lại ScaleMode hiện hành của Form1

       ' Form1 là tên của form nào đó của ứng dụng

       OldMode = Form1.ScaleMode

       ' Thiết lập đơn vị tính là Milimeter

       Form1.ScaleMode = vbMillimeters

       ' Lấy độ rộng của Form1 theo đơn vị milimeter

       Wm = Form1.ScaleWidth

       ' Thiết lập đơn vị tính là Pixel

       Form1.ScaleMode = vbPixels

       ' Lấy độ rộng của Form1 theo đơn vị pixel

       Wp = Form1.ScaleWidth

       ' Phục hồi ScaleMode cũ của Form1

       Form1.ScaleMode = OldMode

       ' Tính số pixel trên 1 milimet

       ppm = Wp / Wm

       ' Đổi giá trị val pixels ra dạng millimeter

       Pixels2Milimet = val / ppm

    End Function

    Nếu bạn thay thế đối tượng Form1 trong hàm Pixels2Milimet ở trên bằng đối tượng Printer thì hàm Pixels2Milimet sẽ đổi giá trị độ dài tính bằng pixel của trang máy in ra độ dài tính bằng millimeter. Lưu ý đối với màn hình thì kết quả chỉ đúng khi bạn chỉnh kích thước màn hình đúng chuẩn, còn nếu bạn chỉnh to hay nhỏ màn hình lại thì kết quả sẽ không thể chính xác được.

    Trong trường hợp bạn dùng VC++ thì  hàm Pixels2Milimet() có thể viết như sau:

    double Pixels2Milimet(HDC hDC, long val){

    // hDC là handle của device context cần đổi độ dài

    // lấy độ rộng màn hình (hay trang in) chứa hDC theo milimet

    int Wmm = GetDeviceCaps(hDC,HORZSIZE);

    // lấy độ rộng màn hình (hay trang in) chứa hDC theo pixel

    int Wpx = GetDeviceCaps(hDC,HORZRES);

    // lấy số pixel màn hình (hay trang in) trên 1 inch

    int Wpxl = GetDeviceCaps(hDC,LOGPIXELSX);

    // ==> Wpxl = Wpx*25.4/Wmm

    // đổi đơn vị độ dài từ pixel ra milimet

    return (double)val*Wmm/Wpx;

    }

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