Giải pháp toàn diện sử dụng tiếng Việt Unicode với Visual CC++

Vấn đềlập trình tiếng Việt Unicode với Visual C/C++

đã được đềcập nhiều trên các sốbáo trước đây. Gần

đây có một phương pháp sửdụng hằng xâu utf-8. Tuy

nhiên, cách làm này có nhược điểm là không tách rời

được mã chương trình với thiết kếgiao diện (do các

hằng xâu tiếng Việt được đặt trong mã chương trình),

dẫn đến khó khăn khi phát triển và bảo trì ứng dụng

vừa hoặc lớn

pdf8 trang | Chuyên mục: Visual C++ | Chia sẻ: dkS00TYs | Lượt xem: 1673 | Lượt tải: 1download
Tóm tắt nội dung Giải pháp toàn diện sử dụng tiếng Việt Unicode với Visual CC++, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
tài nguyên (trong thư mục Resource Files), chẳng hạn “resource.rc”, chọn “Open With”, chọn 
“Source Code (Text) Editor With Encoding”, chọn “Unicode (UTF-8 without signature) – 
Codepage 65001” (bây giờ lại là “without”, vì ta chưa hề ghi signature vào tập). Với Visual C++ 
6.0, bạn có thể dùng Notepad của Windows2000/XP để mở với Encoding là Utf-8. Nhớ chọn lại 
font để tiếng Việt Unicode hiển thị được (Format/ Font trong Notepad). Bây giờ xem lại nội 
dung của tập tin, bạn sẽ thấy các dòng văn bản mà bạn gõ bằng Utf-8 trước đó đã được chuyển 
thành tiếng Việt. 
Ghi tập tài nguyên lại với một tên khác (Save As), chẳng hạn “ResourceVn.rc” bằng Encoding 
“Unicode – Codepage 1200” (Unicode trong Notepad). 
Bây giờ, bạn đã có hai phiên bản tài nguyên: một phiên bản soạn thảo được bằng Resource 
Editor, một phiên bản soạn thảo bằng tay sử dụng Unicode. 
Với phiên bản mới, vì Codepage đã bị đổi, nên bạn phải huỷ thông tin Codepage cũ (bằng dấu 
chú thích//) ở dòng: 
#pragma code_page(1252) 
thành 
//#pragma code_page(1252) 
Vì ngôn ngữ bây giờ không phải là tiếng Anh nữa, nên tốt nhất là bạn huỷ cả dòng 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 
Và thay bằng dòng 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
Và ghi lại. 
Bây giờ ta đã có một phiên bản Unicode hoàn chỉnh. Ta sẽ thay thế phiên bản cũ bằng phiên bản 
mới này. Tuy nhiên, ta sẽ tìm cách để vẫn giữ lại phiên bản cũ trong project, nhờ đó có thể tận 
dụng thao tác trực quan của Visual Studio và bộ sinh mã tự động. Chẳng hạn, khi ta muốn gắn 
kết sự kiện với hàm, gắn điều khiển với biến, tìm ID của điều khiển... ta sẽ dùng phiên bản 
nguyên thuỷ. Nhưng khi biên dịch, ta dùng phiên bản Unicode. 
Để làm điều đó, ta phải ngăn Visual Studio biên dịch tập “resource.rc”: 
– Với Visual Studio 7.1: Bạn mở Solution Explorer (Ctrl-Alt-L), mở folder Resource Files, nhấn 
phải chuột vào resource.rc, chọn Properties (hoặc chọn tập tin và nhấn Alt-Enter). Trong mục 
Configuration Properties/ General, đặt Excluded From Build thành Yes. 
– Với Visual Studio 6.0: Bạn mở File View (Alt-0, nhấn Ctrl-PageDown đến tab File View), mở 
folder “Source Files”, chọn Resource.rc. Mở Project Settings (Alt-F7). Trong tab General, chọn 
Exclude file from build. 
Nhớ là bạn phải làm việc này cho tất cả các chế độ dịch cần thiết. Bây giờ, ta chỉ việc thêm tập 
“ResourceVn.rc” vào project là xong. 
– Với Visual Studio 7.1: Sử dụng chức năng File/ Add Existing Item. 
– Với Visual Studio 6.0: Project/ Add To Project/ Files. 
Chú ý: nếu bạn viết chương trình với hai ngôn ngữ (tiếng Việt và tiếng Anh), bạn phải tạo ra các 
chế độ dịch tương ứng. Với các chế độ dịch cho tiếng Anh, bạn phải ngăn việc dịch 
ResourceVn.rc và yêu cầu dịch Resource.rc. 
Cuối cùng là dịch và chạy thử chương trình. Để đảm bảo quá trình dịch và liên kết không nhầm 
lẫn, bạn nên chọn chức năng Build/ Rebuild Solution (Rebuild All). Chú ý rằng với Visual 
C/C++ 6.0, sẽ có một chuỗi báo lỗi “Could not find the file” khá dài, nhưng quá trình dịch và 
liên kết vẫn cho kết quả tốt. 
Để bảo trì, cập nhật lại tập tài nguyên, ta sử dụng một trong hai cách: 
– Phục hồi lại tập “ResourceVn.rc” về dạng mà Visual Studio đọc được bằng cách làm ngược lại 
quá trình trên (xoá dòng LANGUAGE mới, bỏ chú thích ở hai dòng cũ, ghi lại dưới encoding 
“Unicode Utf-8 without signature”. Nếu dùng Notepad, việc save ngược phải thực hiện theo 2 
bước: đầu tiên là save dưới encoding “Utf-8”, sau đó là mở ra dưới dạng ANSI và xoá 3 kí tự 
signature ở đầu tập). Sau đó tiến hành thay đổi trên tập này. Chú ý là ta có thể kéo thả hoặc copy 
– paste các phần tử từ tập “Resource.rc” vào tập “ResourceVn.rc”. 
– Copy (bằng trình soạn thảo văn bản) những thay đổi từ tập “Resource.rc” vào tập 
“ResourceVn.rc”. 
Việc sử dụng cách nào tốt hơn là tùy tình huống cụ thể. Tuy nhiên, cách thứ hai thường hiệu quả 
hơn. 
Nhược điểm của phương pháp này là nếu bạn sử dụng MFC, Việt hóa không có tác dụng đối với 
data của ComboBox. Vì data này bị chuyển thành dữ liệu nhị phân (ghi dưới dạng các chuỗi hex) 
trong tập tài nguyên. Do đó, bạn buộc phải dùng cách bổ sung thủ công nội dung của chúng bằng 
mã chương trình. 
Hộp thoại thông dụng (COMMON DIALOG) 
Ứng dụng trên Windows thường sử dụng các hộp thoại đã được xây dựng sẵn của Windows 
trong các công việc như chọn font, chọn màu... Để Việt hóa những hộp thoại này, ta sẽ thiết kế 
lại với các caption của điều khiển phù hợp. Giải pháp này không chỉ áp dụng cho trường hợp 
Việt hóa bằng Unicode, nó cũng có tác dụng nếu bạn sử dụng các bảng mã khác. Trước tiên, ta 
cần tìm thiết kế gốc của hộp thoại cần chuyển. Thiết kế này thường bao gồm một tập đuôi dlg 
(chẳng hạn color.dlg) và một (hoặc nhiều) tập header đi kèm. Để biết tên tập .dlg, bạn mở 
MSDN Library, tìm mục “Common Dialog Box Library” (theo index), sau đó chọn loại hộp 
thoại bạn cần (ví dụ: Color Dialog Box) và tìm (Ctrl-F) “.dlg”. Sau đó tìm tập này trong thư mục 
cài đặt Visual Studio, mở tập này (bằng một trình soạn thảo văn bản) để tìm những tập .h cần 
thiết. Copy toàn bộ các macro (#define) của các tập header vào tập resource.h, ghi lại. Bây giờ, 
bạn tạo một dialog mới trong trình soạn thảo tài nguyên. Sau đó, copy nội dung phần định nghĩa 
dialog trong tập .dlg vào thay thế phần định nghĩa do bạn tạo (lưu ý thay tên tài nguyên gốc bằng 
tên tài nguyên bạn đã tạo) trong tập rc. Ví dụ, với hộp thoại màu, bạn copy từ phần ChooseColor 
đến hết, sau đó thay ChooseColor bằng tên tài nguyên của bạn (chẳng hạn 
IDD_CHOOSECOLOR), xoá phần định nghĩa cũ. Và bạn đã có thiết kế gốc của hộp thoại với 
tên tài nguyên mới. Bạn có thể thay đổi nó, đặc biệt, sửa caption của nó và đổi font phù hợp. 
Đối với MFC, việc dùng các hộp thoại thông dụng thường thông qua các lớp dẫn xuất từ 
CCommonDialog. Nên để áp dụng mẫu hộp thoại này, ta phải đặt mẫu cho cấu trúc thành viên 
của thể hiện hộp thoại (đối với hộp chọn màu là biến m_cc có kiểu CHOOSECOLOR) trước khi 
gọi DoModal() của nó. Để đơn giản hoá quá trình, ta tạo một lớp dẫn xuất từ lớp hộp thoại 
nguyên thuỷ (trong ví dụ này là lớp CSpecColorDialog dẫn xuất từ lớp CColorDialog). Sau đó, 
trong cấu tử, ta thực hiện các chuẩn bị cần thiết. Nhờ đó, CSpecColorDialog ứng xử như 
CColorDialog. 
CSpecColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd *pParentWnd=0) 
:CColorDialog(clrInit,dwFlags,pParentWnd) 
{ 
m_cc.Flags|=CC_ENABLETEMPLATE; 
m_cc.lpTemplateName=MAKEINTRESOURCE(IDD_CHOOSECOLOR); 
m_cc.hInstance=0; 
} 
Phép toán hoặc bit (|) tránh làm mất những cờ mà người dùng đã đặt. Mẫu hộp thoại 
IDD_CHOOSECOLOR được chỉ ra trong lpTemplateName. Vì mẫu này nằm trong cùng một thể 
hiện ứng dụng với nơi gọi hộp thoại nên hInstance có thể đặt bằng 0. Cách làm đối với các 
Common Dialog khác không có gì khác biệt. 
Do việc thay thế mẫu hộp thoại được Win32 Platform SDK hỗ trợ nên nếu bạn không sử dụng 
MFC, cách Việt hóa cũng tương tự. Bạn có thể viết một hàm VietChooseColor thay thế hàm 
ChooseColor. Trong đó, trước khi gọi hàm ChooseColor, bạn thực hiện việc đặt mẫu như trong 
cấu tử của CSpecColorDialog. 
BOOL VietChooseColor(LPCHOOSECOLOR lpcc) 
{ 
lpcc->Flags|=CC_ENABLETEMPLATE; 
lpcc->lpTemplateName=MAKEINTRESOURCE(IDD_CHOOSECOLOR); 
lpcc->hInstance=0; 
return ChooseColor(lpcc); 
} 
Bây giờ, VietChooseColor ứng xử hoàn toàn như ChooseColor, ngoại trừ nó có giao diện tiếng 
Việt. 
Message Box 
Việc hiển thị thông báo tiếng Việt rất đơn giản. Chỉ cần truyền vào các xâu Unicode tiếng Việt 
như là tham số cho hàm MessageBox(W). Nhưng để ứng dụng được Việt hóa hoàn thiện thì các 
nút bấm (Button) cũng phải dùng tiếng Việt. Để làm được điều này, ta buộc phải viết lại hàm 
MessageBox cho riêng mình, một cách thức cổ điển mà hầu như ứng dụng tiếng Việt nào cũng 
sử dụng. Tuy nhiên, ở đây tác giả cố gắng tạo một MessageBox linh động hơn: có thể tạo ra số 
nút bấm tuỳ ý. Nhờ vậy, ta có thể giả lập tất cả các loại MessageBox của Windows. 
Đầu tiên, tạo một mẫu hộp thoại chỉ gồm một điều khiển là Static Text, đặt tên tài nguyên cho nó 
để ta có thể tìm và xử lí. Sau đó, tạo một lớp gắn với mẫu (giả sử là CVMsgDlg). Toàn bộ quá 
trình tạo dialog thực sự chủ yếu nằm trong OnInitDialog. Ở đây, ta tạo icon, các nút bấm, đặt vị 
trí và kích thước phù hợp cho chúng. Quá trình này khá tốn công sức vì mang nhiều tính thủ 
công, có lẽ không cần thiết phải trình bày chi tiết ở đây. Điểm mấu chốt là tạo một mảng kích 
thước động các nút bấm CButton*buttons. Các nút được tạo động bằng phương thức 
CButton::Create. Ta có thể xử lí thông điệp WM_COMMAND mà các nút bấm gửi cho dialog 
thông qua hàm ảo CWnd::OnCommand. Ta cũng cần phải thay đổi cư xử của khung ứng dụng 
khi nút OK và Cancel được nhấn. Chỉ cần định nghĩa chồng hàm OnOk và OnCancel bằng 
những hàm rỗng. Cũng không thể quên việc huỷ bỏ các thành phần khi dialog kết thúc trong 
thông điệp 
WM_DESTROY. 
Cuối cùng là viết hàm 
VietMessageBox dùng lớp 
này. Hàm này chỉ đơn giản 
là tách thông tin truyền vào 
và truyền hợp lí cho cấu tử 
của lớp. Sau đó, hàm trả về 
giá trị của 
dialog.DoModal(), là ID 
của nút được nhấn. 
Nếu không sử dụng MFC, 
vấn đề cơ bản là thay đổi 
trong lớp CVMsgDlg. 
Thay vì dùng các phương thức của các lớp, bạn phải dùng các hàm SDK; chẳng hạn thay 
CButton::Create bằng CreateWindow với lớp “BUTTON”. Tuy nhiên, sử dụng thư viện lớp thì 
đơn giản hơn. 
Trên đây, tôi đã chia sẻ với các bạn một cách Việt hóa Unicode cho chương trình VC++, chạy 
trong WindowsNT/2000/XP. Hi vọng có thể giúp các bạn phát triển những ứng dụng thuần Việt 
tốt và nhanh. 
Tác giả gửi kèm chương trình “EasyPress” (tải về ở website TGVT), xem như một ứng dụng 
thực tế áp dụng phương pháp đã trình bày. Đây là chương trình tùy biến bàn phím, khá hữu dụng, 
nhất là đối với bàn phím đa phương tiện. Chương trình về cơ bản đã được Việt hóa, dù chưa 
hoàn toàn (Common Dialog, Message Box). 
 Hộp thoại được Việt hoá và hộp thoại khi thiết kế

File đính kèm:

  • pdfGiải pháp toàn diện sử dụng tiếng Việt Unicode với Visual CC++.pdf
Tài liệu liên quan