Thứ Tư, 26 tháng 5, 2010

Làm sao lập trình TIẾNG VIỆT vỚI “LẬP TRÌNH C TRÊN WINDOWS”

Chào các anh chị và các bạn , khi xây dựng các ứng dụng trên Windows . Một vấn đề chúng ta quan tâm , đó là làm sao hiển thị được tiếng Việt trong các ứng dụng của mình. Trong bài chia sẻ kinh nghiệm này , Tôi sẽ trình bày các cách hiển thị tiếng Việt dưới góc độ lập trình API.


Còn với lập trình MFC thì vấn đề dễ dàng hơn nhiều (Do chúng ta có thể sử dụng các Component UNICODE). Nếu các anh chị quan tâm đến việc hiển thị tiếng Việt bằng cách dùng MFC thì Tôi sẽ có bài viết sau. Tôi sẽ hướng dẫn các anh chị và các bạn thao tác từng bước.

Trước hết, font của menu, của MesageBox là font hệ thống của Windows. Các ứng dụng chaỵ trên đó phải tuân theo qui định trên. Do đó sẽ không có font hệ thống của riêng ứng dụng. Do vậy, Anh Chị phải đổi font hệ thống khi muốn xuất hiện menu tiếng Việt.

Tuy nhiên chúng ta vẫn có thể thay đổi font của menu hay các thành phần khác mà không cần can thiệp vào font hệ thống bằng cách sau:

1. Với Message Box

Với Message Box thì các anh chị có thể sử dụng Dialog thay thế. Muốn thay đổi font của nguyên Dialog Box bạn thực hiện như sau:

1. Click phải vào Dialog và chọn Properties

2. Nhấn nút font

Chọn font thích hợp.

Tuy nhiên bạn chỉ đổi được font của các text box… chứ phần Caption thì nó đổi không được.

Bạn có thể lách chỗ này bằng cách vẽ một dòng chữ đè lên vùng đó. Chú ý, bạn phải vẽ trong WM_NCPAINT.

Tuy nhiên, Tôi nghĩ hiện nay bạn nên dùng font VK Sans Serif. Đây là font của VietKey nên chắc máy nào cũng có cả. Và nó là một dạng font TCVN3 nên rất dễ làm việc.

Còn một cách nữa là Anh Chị sử dụng hàm MessageBoxW

2. Với menu:

Tôi nghĩ Anh Chị nên thực hiện “chiêu” sau:

Mở file *.rc (Nếu project của bạn là ABC thì file đó là ABC.rc). Biên soạn lại menu thành tiếng Việt UNICODE bằng NotePad, rồi lưu lại file đó với thuộc tính UNIODE

Khi đó bạn sẽ bị cảnh báo lỗi khi vào VC++ nhưng không sao. Khi bạn chạy thì menu sẽ xuất hiện Tiếng Việt

3. Với caption:

Đây là phần khó nhất của việc hiển thị tiếng Việt trên giao diện chương trình. Phương án của Tôi đưa ra ở đây là các bạn nên xử lý trong sự kiện WM_NCPAINT

4. Phụ lục:

Cách tạo một project có menu và caption bằng tiếng Việt

1. Sử dụng Wizard để tạo một chương trình có tên TestViet dạng Win32 Application.

2. Tìm tập tin TestViet.rc và mở tập tin này bằng Notepad hay chương trình soạn thảo file text nào đó cũng được

3. Sửa phần menu trong tập tin TestViet.rc lại lại như hình sau

4. Sau đó chọn Save As với Encoding là Unicode

5. Chạy thử chương trình. Bạn thấy menu có tiếng Việt 100%

6. Bây giờ, chúng ta sẽ hiển thị tiếng Việt trên thanh Caption. Đầu tiên chúng ta sẽ tạo một chuỗi UNICODE trong resource.

Mở file TestViet.rc và chèn vào dòng IDS_STRING1 "Chương trình tiếng Việt" như hình dưới

IDS_STRING1 được định nghĩa trong file resource.h như sau

7. Sau đó, các anh chị phải viết thêm vào chương trình một hàm[1]

void DrwCaption(HWND hWnd, bool fActive)

{

HDC dc; // Ma khung ve

COLORREF rgbText; // Mau chu

COLORREF rgbBkGrnd; // Mau nen

LOGFONT lf; // Thong tin ve font chu

HFONT font; // Ma Font

WCHAR wCaption[MAX_LOADSTRING]; // Tieu de thanh caption

dc = GetWindowDC(hWnd); // Lay ma khung ve cua cua so

// Kiem tra trang thai cua so de chon mau thich hop

if (fActive)

{ rgbText = GetSysColor(COLOR_CAPTIONTEXT);
rgbBkGrnd = GetSysColor(COLOR_ACTIVECAPTION);

}

else

{ rgbText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);

rgbBkGrnd = GetSysColor(COLOR_INACTIVECAPTION);

}

// Dat mau nen va mau chu cho cua so

SetTextColor(dc, rgbText);

SetBkColor(dc, rgbBkGrnd);

// Ve chu o che do trong suot (khong can den mau nen)

SetBkMode(dc, OPAQUE); //TRANSPARENT

// Chuan bi thong tin ve Font chu

FillMemory(&lf, sizeof(lf), 0);

lf.lfHeight = 15; // Kich thuoc Font

lf.lfCharSet = ANSI_CHARSET;

lf.lfQuality = DEFAULT_QUALITY;

lf.lfClipPrecision = CLIP_LH_ANGLES | CLIP_STROKE_PRECIS;

lf.lfPitchAndFamily = FF_SWISS;

strcpy(lf.lfFaceName, "Arial"); // Ten Font

// Tao Font chu de ve dua tren cac thong tin da thiet lap

font = CreateFontIndirect(&lf);

// Chon font chu Arial vao khung ve va luu lai font chu cu

font = (HFONT)SelectObject(dc, font);

// Dat tieu de va ve chuoi tren thanh caption

LoadStringW(hInst,IDS_STRING1,wCaption,MAX_LOADSTRING);

TextOutW(dc, 20, 5, wCaption, 23);

// Dat Font chu cu tra lai cho khung ve

font = (HFONT)SelectObject(dc, font);

// Xoa doi tuong Font chu, giai phong tai nguyen cho he thong

DeleteObject(font);

// Tra lai bo dieu khien khung ve cho Windows

ReleaseDC(hWnd, dc);

}

8. Tiếp theo, bạn viết lệnh cho 2 thông điệp WM_NCPAINT

case WM_NCPAINT[2]:

DefWindowProc(hWnd, message, wParam, lParam);

fActive = (hWnd == GetActiveWindow());

DrwCaption(hWnd, fActive);

break;

case WM_NCACTIVATE:

DefWindowProc(hWnd, message, wParam, lParam);

fActive = (wParam != 0);

DrwCaption(hWnd, fActive);

break;

9. Cuối cùng, bạn chạy thử chương trình

Đến đây thì chương trình của các anh chị đã hiển thị được tiếng Việt rồi , không khó chút nào phải không các anh chị và các bạn . Chúc các anh chị và các bạn thành công.

Các anh chị có thể download chương trình tiếng Việt mẫu ở đây : TViet.Zip

1] Hàm này tác giả có tham khảo và bổ sung hàm của SV 100B1210

[2] Đoạn lệnh này tác giả có tham khảo của SV 100B1210

0 nhận xét:

Đăng nhận xét