b. Dữ liệu phục vụ mụ tả mụ hỡnh bài toỏn trong Sap2000:
8.3.8. Cỏc kỹ thuật Việt hoỏ giao diện
Để người dựng thuận tiện trong sử dụng thỡ cỏc thanh cụng cụ, tiờu đề của biểu mẫu được Việt hoỏ là vấn đề rất được quan tõm của cỏc nhà lập trỡnh.
Dưới đõy xin trỡnh bày hai kỹ thuật việt hoỏ giao diện, đú là sử dụng phần mềm làm menu cho chương trỡnh để cú thể cú được menu bằng tiếng Việt và dựng hàm API để việt hoỏ thanh tiờu đề cho biểu mẫu trong chương trỡnh mà khụng cần phải đổi phụng chữ của hệ điều hành.
a. Thiết kế menu
Để thiết kế menu bằng bảng mó Unicode và cú thể hiển thị tiếng Việt khi chạy chương trỡnh ta dựng cụng cụ soạn thảo menu, thanh cụng cụ của hóng Sheridan cú tờn là ActiveBar. Phần mềm này hỗ trợ ActiveX cho chương trỡnh và giỳp tạo menu một cỏch dễ dàng, cú thể thờm vào bờn cạnh menu là hỡnh ảnh minh hoạ. Đặc biệt là nú hỗ trợ tiếng Việt Unicode với thuộc tớnh dựng phụng chữ của điều khiển, khụng dựng phụng chữ của hệ thống. Do vậy mà chương trỡnh cú thể hiển thị được tiếng Việt trờn thanh menu.
Với cụng cụ này, menu xõy dựng đến đõu sẽ được hiển thị tới đú, người dựng cú thể biết trước được menu của mỡnh xõy dựng sẽ ra sao. Và cú thể sửa đổi nếu muốn.
b. Việt hoỏ thanh tiờu đề của biểu mẫu
Phụng chữ hiển thị trờn thanh tiờu đề của biểu mẫu là phụng chữ của hệ thống. Do vậy, nếu dựng bất kỳ một cụng cụ soạn thảo nào đều khụng thể hiển thị tiếng Việt trờn thanh tiờu đề này. Ta phải dựng hàm API can thiệp vào hệ thống để cú thể hiển thị tiếng Việt trờn thanh tiờu đề.
Khi nào biểu mẫu được hiển thị trờn màn hỡnh thỡ hệ thống sẽ nhận được thụng điệp từ chương trỡnh thụng qua cỏc hàm API “bỏo” rằng phải hiển thị thanh tiờu đề ấy với phụng chữ hiển thị mà chương trỡnh chỉ ra.
Public oldWndProc As Long
Public Const FONT_FACE = "ABC-VBClubFont" Public Const GWL_WNDPROC = (-4&)
Public Const WM_NCPAINT = &H85 Public Const WM_NCACTIVATE = &H86 Public Const SM_CYCAPTION = 4& Public Const SM_CXSMICON = 49 Public Const SM_CXFRAME = 32 Public Const SM_CYFRAME = 33 Public Const NEWTRANSPARENT = 3 Public Const DT_SINGLELINE = &H20 Public Const DT_VCENTER = &H4 Public Const DT_EXPANDTABS = &H40 Public Const COLOR_CAPTIONTEXT = 9
Public Const COLOR_INACTIVECAPTIONTEXT = 19 Public Type RECT
Left As Long Top As Long
Thanh tiờu đề
Right As Long Bottom As Long End Type
Public Type MEASUREITEMSTRUCT CtlType As Long CtlID As Long itemID As Long itemWidth As Long itemHeight As Long ItemData As Long End Type
Public Type DRAWITEMSTRUCT CtlType As Long CtlID As Long itemID As Long itemAction As Long itemState As Long hwndItem As Long hdc As Long rcItem As RECT ItemData As Long End Type
Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal H As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, ByVal W As Long, ByVal i As Long, ByVal U As Long, ByVal S As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hdc As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, lpDrawTextParams As Any) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd&, ByVal nIndex&, ByVal dwNewLong&) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Function NewWndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hdc As Long, uRCT As RECT
Dim uDIS As DRAWITEMSTRUCT, uMIS As MEASUREITEMSTRUCT Dim hBrush As Long, hPen As Long
Dim hOldBrush As Long, hOldPen As Long Dim iTextColor As Long, iMenuColor As Long Dim bSelected As Boolean
NewWndProc = CallWindowProc(oldWndProc, hwnd, uMsg, wParam, lParam) Select Case uMsg
Case WM_NCACTIVATE, WM_NCPAINT hdc = GetWindowDC(hwnd)
uRCT.Left = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXSMICON) + 4
uRCT.Top = GetSystemMetrics(SM_CYFRAME) uRCT.Right = uRCT.Left + 200
uRCT.Bottom = uRCT.Top + GetSystemMetrics(SM_CYCAPTION) - 1 113
If uMsg = WM_NCACTIVATE Then
If wParam Then iTextColor = COLOR_CAPTIONTEXT Else iTextColor = COLOR_INACTIVECAPTIONTEXT
Else
If hwnd = GetActiveWindow() Then iTextColor =
COLOR_CAPTIONTEXT Else iTextColor =
COLOR_INACTIVECAPTIONTEXT End If
DrawString hdc, uRCT, FORM_CAPTION, True, iTextColor ReleaseDC hwnd, hdc
End Select End Function
Private Sub DrawString(hdc As Long, uRCT As RECT, sText As String, bBold As Boolean, iColor As Long)
Dim hFont As Long, hOldFont As Long, hOldColor As Long SetBkMode hdc, NEWTRANSPARENT
hOldColor = SetTextColor(hdc, GetSysColor(iColor))
hFont = CreateFont(16, 0, 0, 0, 500 + Abs(bBold) * 200, 0, 0, 0, 0, 0, 0, 0, 0, FONT_FACE)
hOldFont = SelectObject(hdc, hFont)
DrawTextEx hdc, sText, Len(sText), uRCT, DT_SINGLELINE Or DT_VCENTER Or DT_EXPANDTABS, ByVal 0&
SetTextColor hdc, hOldColor SelectObject hdc, hOldFont DeleteObject hFont
End Sub
Với hai kỹ thuật Việt hoỏ giao diện này, ta cú thể hiển thị tiếng Việt cho chương trỡnh mà khụng phải đổi phụng chữ của hệ thống.