Source code:
CustomizeMessageBox.rar
Image:

IDE: Visual C++ 2005

0. Mở đầu
Những bài học chập chững printf(“Hello World”) thửa đầu với màn hình console, hay ứng dụng cơ bản MessageBox(NULL, “Hello World”, “Caption”, 0) khi làm quen với lập trình WinAPI. Tất cả những thứ đó đã đưa chúng ta đi những bước đi đầu tiên đến với vùng đất it này.
Hôm nay, một ngày không đẹp trời lắm, chúng ta hãy cùng quay trở về nơi những bước đi chập chững thửa đầu đó để ôn lại những kỷ niệm và thử xem chúng ta có thể làm gì “nếu thời gian có quay trở lại”?
Như chúng ta đã biết, hàm MessageBox có 4 tham số với ý nghĩa như sau:
1. HWND: handle cửa sổ cha của hộp thoại
2. LPCTSTR: chuỗi ký tự chứa nội dung cần thông báo
3. LPCTSTR: chuỗi ký tự chứa nội dung của thanh tiêu đề
4. UINT: style của hộp thoại, có một số kiểu style có sẵn để chúng ta chọn lựa (số nút bấm, kiểu thộp thoại, kiểu hiển thị text trái – phải…)

Windows cung cấp cho chúng ta khá nhiều style (tham số 4) để thực hiện việc tùy chỉnh hộp thoại MessageBox cho phù hợp với từng mục đích sử dụng. Nhưng không có một style nào giành cho việc thay đổi text, kích thước của các nút bấm, hay màu của các đoạn text trong hộp thoại MessageBox. Vậy làm như nào để chúng ta có thể thay đổi đoạn text trong các nút bấm của hộp thoại MessageBox, hay một số tùy chỉnh khác?

Bài học đầu tiên trong ký ức xưa chợt ùa về, với những điều mới mẻ được mở ra…
I. Thay đổi nút bấm của hộp thoại MessageBox
I.a Giới thiệu

Trước tiên, chúng ta cần biết hàm MessageBox làm những gì “trong đó”?
Sử dụng một vài công cụ debug, chúng ta có thể dễ dàng nhận ra những việc hàm MessageBox làm như sau:
MessageBox -> MessageBoxTimeout -> SoftModalMessageBox
Như vậy hàm xử lý chính để tạo ra hộp thoại MessageBox nằm ở hàm SoftModalMessageBox
Muốn customize các nút bấm, chúng ta cần phải “xử lý” hàm SoftModalMessageBox.
Một số đặc điểm của hàm SoftModalMessageBox như sau:
  • Được export bởi thư viện user32.dllMicrosoft không cung cấp tài liệu về hàm này

Tham số đầu vào hàm SoftModalMessageBox là 1 pointer trỏ tới cấu trúc như sau:
  • MSGBOXPARAMS: cái này có giới thiệu ở msdnDWORD: unknowDWORD: unknowDWORD: unknow (từ win 8 trở đi, microsoft thêm tham số này vô, mình cũng không biết để làm gì @@)DWORD*: mảng chứa id các nút bấmWCHAR**: mảng chứa các đoạn text của các nút bấmDWORD: số lượng buttonDWORD: id nút bấm mặc địnhDWORD: id nút bấn CancelDWORD: timeout của hộp thoại

Nhìn vào đây chắc các bạn cũng đã hiểu cũng ta phải làm gì tiếp theo rồi phải không?

<font size="3">I.b Việt hóa đoạn text trong các nút bấm trong hộp thoại MessageBox

  • Khai báo cấu trúc của tham số đầu vào hàm SoftModalMessageBox. Do từ win8, cấu trúc này được bổ sung thêm 1 tham số nên ta sẽ khai báo 2 cấu trúc tương ứng với win 8 và các win trước

    Mã:
  • //Struct for win 7 and xptypedef struct _MSGBOXINFO{ MSGBOXPARAMS params; DWORD dwUnk1; DWORD dwUnk2; DWORD lpdwListButtonId; DWORD lppszListButtonText; DWORD dwButtonsCount; DWORD dwDefaultButtonId; DWORD dwCancelButtonId; DWORD dwTimeout;} MSGBOXINFO; //Struct for win 8 and latertypedef struct _MSGBOXINFO_W8{ MSGBOXPARAMS params; DWORD dwUnk1; DWORD dwUnk2; DWORD dwUnk3; DWORD* lpdwListButtonId; WCHAR** lppszListButtonText; DWORD dwButtonCount; DWORD dwDefButtonId; DWORD dwCancelButtonId; DWORD dwTimeout;} MSGBOXINFO_W8;