• Thứ Năm, 18/12/2008 10:28 (GMT+7)

    Lập trình VC++, tiếng Việt trong menu và dialog tự tạo

    Câu hỏi :
    Trong Visual C++ 6.0 làm thế nào hiển thị được tiếng Việt trong các menu và dialog tự tạo?


    Trả lời :
     Có 2 trường hợp sử dụng mã tiếng Việt khác nhau:
     1. Nếu bạn dùng mã tiếng Việt nào đó chứ không phải mã Unicode (Vni, BK, ABC, Vietware...) thì việc hiển thị chuỗi tiếng Việt trong các phần tử giao diện như hộp thoại, menu... gồm các bước thao tác điển hình như sau:

     - Cài các font chữ hỗ trợ bảng mã tiếng Việt mà bạn dự định dùng vào Windows, chạy tiện ích Control Panel.Display, chọn tab Appearance, chọn button Advanced, thiết lập font chữ cho các đối tượng giao diện về font chữ hỗ trợ bảng mã của bạn. Lưu ý bạn có thể tự động hóa việc thiết lập sơ đồ font chữ cho các đối tượng giao diện bằng đoạn code trong ứng dụng của bạn. Chúng tôi đã giới thiệu đoạn code này nhiều lần trong các số báo trước.

     - Cài đặt và chạy tiện ích gõ phím tiếng Việt hỗ trợ nhập chuỗi tiếng Việt theo bảng mã mà bạn dự định dùng.

     - Mở lại/tạo mới Project VC++ chứa ứng dụng của bạn (thường thuộc loại "MFC AppWizard (exe)"), thiết kế từng đối tượng giao diện cần dùng cho ứng dụng (menu, toolbar, dialog...). Khi tạo mới đối tượng giao diện nào có thuộc tính font chữ thì hãy thiết lập lại thuộc tính này về font chữ hỗ trợ bảng mã tiếng Việt của bạn. Bạn sẽ thấy trực quan các chuỗi tiếng Việt khi chúng mới được nhập vào tại thời điểm thiết kế trực quan. Khi ứng dụng chạy, chúng cũng sẽ được hiển thị đúng y như lúc thiết kế.

     2. Nếu bạn dùng mã tiếng Việt Unicode (mỗi ký tự chiếm 2 byte ô nhớ) thì việc hiển thị chuỗi tiếng Việt trong các phần tử giao diện như hộp thoại, menu... sẽ khó khăn hơn. Lý do là môi trường thiết kế trực quan VC++ 6.0 chưa hỗ trợ việc nhập/hiển thị chuỗi văn bản tiếng Việt Unicode (mặc dù ngôn ngữ VC++ thì hỗ trợ). Qui trình xây dựng giao diện hiển thị đúng chuỗi tiếng Việt Unicode gồm các bước thao tác điển hình như sau:

     - Cài các font chữ hỗ trợ bảng mã tiếng Việt Unicode vào Windows. Lưu ý rằng Windows đã có sẵn một ít font chữ hỗ trợ được bảng mã tiếng Việt Unicode như Arial, Times New Roman, Tahoma... Ở chế độ mặc định, bản thân Windows XP đã dùng các font chữ hỗ trợ tốt mã Unicode tiếng Việt, tuy nhiên nếu muốn thiết lập lại các font chữ của bạn, hãy chạy tiện ích Control Panel.Display, chọn tab Appearance, chọn button Advanced, thiết lập font chữ cho các đối tượng giao diện về font chữ hỗ trợ mã Unicode vừa cài đặt. Lưu ý bạn có thể tự động hóa việc thiết lập sơ đồ font chữ cho các đối tượng giao diện bằng đoạn code trong ứng dụng của bạn. Chúng tôi đã giới thiệu đoạn code này nhiều lần trong các số báo trước.

     - Cài đặt và chạy tiện ích gõ phím tiếng Việt hỗ trợ nhập chuỗi tiếng Việt Unicode, nhất là bảng mã utf-8.
     - Mở lại/tạo mới Project VC++ chứa ứng dụng của bạn (thường thuộc loại "MFC AppWizard (exe)"), thiết kế từng đối tượng giao diện cần dùng cho ứng dụng (menu, toolbar, dialog...). Khi tạo mới đối tượng giao diện nào có thuộc tính font chữ thì hãy thiết lập lại thuộc tính này về font chữ hỗ trợ mã tiếng Việt Unicode. Bạn sẽ không thể nhập/hiển thị trực quan các chuỗi tiếng Việt trong lúc thiết kế trực quan hay trong khi viết code mã nguồn trong môi trường VC++ 6.0, do đó bạn hãy nhập các chuỗi không dấu.

     - Khai báo trong chương trình nguồn (ở vị trí thích hợp) các biến array chứa các chuỗi utf-8 được dùng trong các đối tượng giao diện. Hãy chuyển trình gõ phím về chế độ tạo mã utf-8 và nhập tuần tự các chuỗi cần dùng. Thí dụ, thanh menubar của ứng dụng và nội dung chi tiết của menu pop-up "File" được thiết kế như sau:

     Nhưng khi chương trình chạy, bạn muốn nó được Việt hóa như sau:
     thì bạn hãy viết đoạn code hiệu chỉnh động các chuỗi caption cho thanh menubar và cho menu pop-up "File" như sau (đoạn code dưới đây được đặt trong hàm CMainFrame::OnCreate() là tốt nhất):
     int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
     //đoạn code được sinh tự động bởi VC++
     ...
     //đoạn code viết thêm bởi bạn
     //khai báo các biến cần dùng
     wchar_t buf[256];
     int i;
     //khai báo các chuỗi utf-8 cho thanh menubar
     char *strMenuBar[] = {
     "Tệp",
     "Soạn thảo",
     "Xem",
     "Trợ giúp"
     };
     //xác định handle của thanh menubar
     HMENU hMainMenu=::GetMenu(m_hWnd);
     //Việt hóa thanh menubar
     for (i = 0; i < 4; i++) {
     //dịch chuỗi utf-8 thành UCS-2
     ::MultiByteToWideChar(CP_UTF8,0,strMenuBar[i],-1,buf,256);
     //cập nhật lại menu thứ i trong menubar
     ::ModifyMenu(hMainMenu,i, MF_BYPOSITION | MF_STRING, i, buf);
     }
     //khai báo các chuỗi utf-8 cho menu "File"
     char *strFileMenu[] = {
     "Tạo mới",
     "Mở tệp...",
     "Lưu",
     "Lưu như...",
     "-",
     " Đóng"
     };
     //xác định handle của menu "File"
     HMENU hFileMenu = ::GetSubMenu(hMainMenu,0);
     //Việt hóa menu "File"
     for (i = 0; i < 6; i++) {
     if (strcmp (strFileMenu[i],"-")) {
     //dịch chuỗi utf-8 thành UCS-2
     ::MultiByteToWideChar(CP_UTF8,0,strFileMenu[i],-1,buf,256);
     //cập nhật lại option thứ i trong menu
     ::ModifyMenu(hFileMenu,i, MF_BYPOSITION | MF_STRING, i, buf);
     }
     }
     //Việt hóa các menu & các đối tượng khác nếu cần
     ...
     return 0;
     }
     - Chọn menu Project.Settings để mở cửa sổ "Project Settings", chọn tab "C/C++", nhập thêm chuỗi ",_UNICODE" sau nội dung có sẵn trong textbox "Preprocessor definitions" để dịch chương trình chạy ở chế độ Unicode. Chọn tab Link, chọn Output trong mục Category, nhập chuỗi "wWinMainCRTStartup" vào textbox "Entry-point symbol:".

     - Dịch ứng dụng và chạy thử ứng dụng. Khi ứng dụng chạy, các chuỗi tiếng Việt Unicode trong menubar và trong menu "File" sẽ được hiển thị đúng y như mong muốn.
     
    Chuyên mục: Lập trình