Tiếng Việt với "Lập trình C trên Windows"

Published by admin on

Hiển thị tiếng Việt bằng cách dùng MFC, sau đây là một số bước thực hiện:

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, các bạn cần đổ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 bạn 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à sử dụng hàm MessageBoxW

2. Với menu:

Các bạn 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 bạn 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 bạn đã hiển thị được tiếng Việt rồi , không khó chút nào phải không các bạn . Chúc các bạn thành công.

Các bạn 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