 |
|
KINH NGHIỆM LẬP
TRÌNH |
|
Dùng tiếng Việt
trong ứng dụng Visual Foxpro 6.0
CHƯƠNG CAN CHÍP |
|
Thấy nhiều bà con thắc mắc về chuyện dùng tiếng Việt
khi “mần” ứng dụng Visual Foxpro (VFP), tui thử la
cà mấy cái quán in-tẹc-nét để “trinh sát” và rồi
ngẫm thấy rằng: cái dzụ này... hay à nghen! Một
ngày, hai ngày, rồi... en-nờ ngày qua mau, “chơn
kinh” được tui đúc kết với bao vất vả không thua chi
Đường Tăng trên đường Tây Du. Chỉ khác ở chỗ tên tui
là... Thường Chăng! |
|
Hồi 1: Thường Chăng lọt ổ phông chữ Việt
Để tương thích “tùm lum tà la”, người ta vẫn duy trì
2 loại phông chữ: 1-byte (tương thích ứng dụng trên
DOS) và 2-byte. Ví dụ, phông chữ VNI 1-byte có tên
rất Việt Nam như: HaLong, ThanhHoa, CuuLong...
(tương ứng với tên phông chữ tiếng ăng-lê là
Helvetica, Times, Courier...). Còn phông chữ VNI
2-byte có tên bắt đầu bằng VNI (như: VNI-Times,
VNI-Aptima...), trong đó các ký tự tiếng Việt có dấu
(như ấ, ắ, ư, ê...) thường dài 2 byte.
Do phông chữ 2-byte chỉ dùng 2-byte đối với một số
ký tự tiếng Việt có dấu, khó lòng xác định chính xác
kích thước dành cho các field có kiểu Character,
mình nên chọn phông chữ 1-byte cho việc hiển thị dữ
kiện của các table (các tập tin .DBF).
Túm lại, khi mần ứng dụng VFP, bà con phải chọn
trước phông chữ để hiển thị dữ kiện được đưa vào các
table và dùng phông chữ này để thiết kế các thành
phần giao diện người dùng. Ví dụ, nếu tui chọn bộ gõ
VietKey để nhập dữ kiện, phông chữ VNI 1-byte để
hiển thị, thì tui xác định kiểu gõ là VNI, bộ mã là
VNI-DOS (có thể dùng các phông chữ HaLong,
ThanhHoa... cho giao diện).
Chưa hết, phông chữ trên Windows có 2 kiểu: phông
chữ màn hình và phông chữ máy in. Tập tin phông chữ
màn hình có đuôi là .FON, tập tin phông chữ máy in
có đuôi là .TTF. Nếu bà con lẫn lộn chuyện này, chữ
sẽ xấu như... Thị Nở! Phông chữ màn hình của VNI-DOS
có tên là Vietnam, còn HaLong, ThanhHoa... lại là
các phông chữ máy in.
Nếu có thể, dùng phông chữ Unicode là hay nhất. Nghe
đồn hình như phiên bản VFP 8.0 đã hỗ trợ Unicode, bà
con thử kiểm chứng xem sao? |
Hồi 2: Thường Chăng đại náo phông chữ Việt
Trừ khi bà con xài Unicode hoặc xài phiên bản
Windows tiếng Việt, ứng dụng của ta phải thực hiện
việc cài đặt các phông chữ Việt cần thiết và sửa đổi
thuộc tính phông chữ của các thành phần giao diện.
Giả sử bà con đã chép các phông chữ Việt vào thư mục
D:\FONTVN. Đoạn mã 1 trình bày việc cài đặt phông
chữ HaLong.TTF và Vietnam.FON. |
Đoạn mã 1
lThanhCong = CaiDatPhongChu("D:\FONTVN\HaLong.TTF")
lThanhCong = CaiDatPhongChu("D:\FONTVN\Vietnam.FON")
PROCEDURE CaiDatPhongChu()
LPARAMETERS lcTapTinPhongChu
LOCAL lnSoCuaPhongChuDuocThem
** Khai báo hàm API:
DECLARE INTEGER AddFontResource IN GDI32.DLL ;
STRING @ lpszFileName
DECLARE INTEGER SendMessage IN USER32.DLL ;
INTEGER hWnd, ;
INTEGER Msg, ;
INTEGER wParameter, ;
INTEGER lParameter
** Khai báo hằng API để xài trong hàm API:
#DEFINE HWND_BROADCAST 0xFFFF
#DEFINE WM_FONTCHANGE 0x001D
** Gọi hàm API để thêm phông chữ:
lnSoCuaPhongChuDuocThem =
AddFontResource(lcTapTinPhongChu)
IF lnSoCuaPhongChuDuocThem > 0 && Phông chữ được
thêm thành công
* Thông báo cho Windows để các ứng dụng biết có
phông chữ mới thêm vào
=SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
RETURN .T.
ELSE && Không thể thêm được phông chữ.
RETURN .F.
ENDIF
* Xóa khỏi ký ức các hàm API
CLEAR DLLS "AddFontResource", “SendMessage”
ENDPROC |
|
Sau khi cài đặt xong phông chữ, chỉ có giao diện
trên các biểu mẫu và các báo biểu có xài phông chữ
này mới chịu ép-phê, còn các thành phần khác như
trình đơn, tiêu đề cửa sổ, thông báo, chú thích...
thì “đầu lâu xương sọ”! Đơn giản vì các thành phần
này do Windows quản lý. Ta cũng phải xài các hàm API
để thay đổi thuộc tính phông chữ của chúng. Tuy
nhiên, máy của người ta không chỉ xài một ứng dụng
VFP của mình, bà con nhớ trả lại “hiện trường” trước
khi kết thúc ứng dụng (đoạn mã 2). |
Đoạn mã 2
DO SetFontSystem WITH "ON", "Vietnam" && Dùng phông
chữ Vietnam
* Chỗ này là các công việc của ứng dụng phải mần
* ...
DO SetFontSystem WITH "OFF", "Vietnam" && Hoàn
nguyên thuộc tính cũ
PROCEDURE SetFontSystem
LPARAMETERS pOnOff, pFontName
* Mặc định là phông chữ Vietnam nếu tham số thứ hai
để trống
pFontName = IIF(EMPTY(pFontName), "Vietnam",
pFontName)
PRIVATE ALL
IF pOnOff = "ON"
IF LEN(pFontName) > 31 && Tên phông chữ không hợp lệ
RETURN
ENDIF
ENDIF
SPI_GETNONCLIENTMETRICS = 41
SPI_SETNONCLIENTMETRICS = 42
lcBuffSize = 1
lcCaption = 25 + 28
lcSMCaption = 93 + 28
lcMenu = 161 + 28
lcStatus = 221 + 28
lcMessage = 281 + 28
lcBuff =
CHR(340%256)+CHR(INT(340/256))+CHR(0)+CHR(0)+REPLICATE(CHR(0),340-4)
DECLARE integer SystemParametersInfo IN USER32 AS
SYSINFO;
integer uiAction, ;
integer BuffSize, ;
string @Buff, ;
integer fWinIni
* Lấy thông tin về thuộc tính phông chữ hệ thống
SYSINFO(SPI_GETNONCLIENTMETRICS, LEN(lcBuff),
@lcBuff, 0)
IF pOnOff = "ON" && Nếu là đặt để thuộc tính mới
pubOldFontName = SUBS(lcBuff, lcMenu, 31) && Lấy tên
phông chữ hiện thời
IF FILE("SysFont.MEM")
ERASE SysFont.MEM
ENDIF
SAVE TO SysFont ALL LIKE pubOldFontName && Lưu lại
để hoàn nguyên
ELSE && Nếu là hoàn nguyên
RESTORE FROM SysFont ADDITIVE && Lấy tên phông chữ
đã lưu
pFontName = pubOldFontName
RELEASE pubOldFontName
ENDIF
* Gán trị mới sẽ thay đổi thuộc tính phông chữ hệ
thống
lcBuff = STUFF(lcBuff, lcCaption, LEN(pFontName)+1,
pFontName + CHR(0))
lcBuff = STUFF(lcBuff, lcSMCaption,
LEN(pFontName)+1, pFontName + CHR(0))
lcBuff = STUFF(lcBuff, lcMenu,
LEN(pFontName)+1,pFontName+CHR(0))
lcBuff = STUFF(lcBuff, lcStatus,
LEN(pFontName)+1,pFontName+CHR(0))
lcBuff = STUFF(lcBuff, lcMessage,
LEN(pFontName)+1,pFontName+CHR(0))
* Thực hiện thay đổi thuộc tính phông chữ hệ thống
SYSINFO(SPI_SETNONCLIENTMETRICS, LEN(lcBuff),
@lcBuff, 0)
* Xóa khỏi ký ức các hàm API
CLEAR DLLS "SystemParametersInfo"
RETURN |
|
(còn tiếp) |
|
|
|
 |
|
 |