Khái niệm
Resource: tài nguyên được đưa từ bên ngoài vào chương trình, có thể là file ảnh, file âm thanh...
Resource Editor: công cụ của Microsoft, hỗ trợ đắc lực cho phép thêm các resource bên ngoài vào để quản lý, chỉnh sửa, xem trước, … và dịch toàn bộ quá trình thực hiện ra 1 file .rc viết dưới ngôn ngữ resource script, công cụ được tích hợp sẵn trên các bản Visual Studio trừ bản Express.
Bài viết hướng dẫn cách sử dụng Resource Editor chèn các resource vào phần mềm.
Hướng dẫn
Tạo 1 project tương tự như project ở bài viết tạo cửa số căn bản.
Bước 1: tạo file resource
Chọn Solution Explorer
(hoặc View -> Solution Explorer
) -> Chuột phải
vào mục Resource Files -> Add -> New Item -> Resource -> Resource Files
. Sau đó đặt tên file tùy ý, thông thường là resource.rc.

Sau khi tạo xong, Visual Studio tự động chuyển sang cửa sổ Resource View, tạo chuyển lại cửa sổ Solution Explorer. Hệ thống tự tạo cho 1 file là resource.h
.
Bước 2: chèn icon
Icon là một hình ảnh có kích cỡ nhỏ, đại diện cho chương trình.
Double click vào file resource.rc
sẽ được chuyển đến cửa sổ Resource Editor. Nhấp huột phải vào resource.rc
chọn Add Resource và xuất hiện bảng sau.

Chọn nút Import

Chọn đường dẫn đến thư mục chứa icon.

Icon được tải lên sẽ lên sẽ có tên là IDI_ICON1
đây là tên hệ thống đặt.
Nếu cần đổi tên, bên dưới phần Properties (hoặc chuột phải -> Properties)
sửa tên tại phần ID.
Thao tác trên file WinMain.cpp
để tải được icon lên:
Thêm file header mà hệ thống tự tạo lúc tạo resource:
#include "resource.h"
Ở đoạn khởi tạo window class, các biến wc.hIcon
và wc.hIconSm
sửa lại như sau:
wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)); wc.hIconSm = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
Giải thích:
GetModuleHandle(NULL)
: hàm này trả về con trỏ trỏ tới hInstance tức là tiến trình của phần mềm.MAKEINTRESOURCE(IDI_ICON1)
: hàm này truy xuất vào resource mà đã tạo ra để lấyIDI_ICON1
mà đã thao tác ở trên.
Chạy thử chương trình

Bước 3: tạo menu
Menu là một liệt kê các thao tác mà lập trình viên đưa ra cho người dùng sử dụng.
Tạo 2 lệnh cơ bản nhất là thoát chương trình và một lệnh sẽ đưa ra thông tin phần mềm đang tương tác.

Trong cửa sổ Resource View, double click vào Menu / IDR_MENU1.

Tạo menu như sau: File / Exit và Help / About

Thêm lệnh cho File / Exit. Chuột phải vào ô Exit -> Properties -> ID
của Exit là ID_FILE_EXIT
.
Trở lại với file WinMain.cpp
ở đoạn code window class, sửa biến wc.lpszMenuName
như sau:
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
WndProc
, thêm trường hợp:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILE_EXIT: PostQuitMessage(0); break; case ID_HELP_ABOUT: break; } // ... } return 0; }
Giải thích:
WM_COMMAND
: Hiểu đơn giản ở đây, là message tương ứng với việc tương tác trên thanh menu, các nút button (tìm hiểu sau). Trong đó với các lệnh nhưWM_COMMAND
có các biến hỗ trợ làwParam
vàlParam
.LOWORD(wParam)
: Thể hiện cho con số mà các trường hợp ví dụ cụ thể làID_FILE_EXIT
được định nghĩa ởresource.h
, khi chọn File / Exit thìWM_COMMAND
sẽ được gửi kèm vớiwParam
vàlParam
để phần mềm hiểu đang chọn lệnh nào.
Chạy thử chương trình và có thể thoát chương trình thông qua File / Exit.
Bước 4: tạo Dialog Box
Dialog Box là công cụ mà lập trình viên dùng để tương tác với người dùng của mình.
Tạo Dialog Box bằng các thao tác ở phần 2, 3 mà tạo Dialog Box.

Double click vào Dialog:

Các bạn chọn View -> Tool Box
, các bạn sẽ có được Dialog Editor như sau:

Với các công cụ trên, tạo 1 Dialog như sau:

Gợi ý: Kéo thả các button OK, Cancel, sử dụng Static Text để thêm đoạn text trên. Chọn Static Text, vào Properties -> Caption
để chỉnh sửa văn bản, Properties -> Align Text -> Center
để căn giữa.
Sau khi tạo được một Dialog như trên, đưa Dialog này vào chương trình.
Dialog Box
là 1 cửa sổ, có các button là OK và Cancel vì vậy nó cũng cần một thủ tục riêng để vận hành, tương tự như WndProc
.
BOOL CALLBACK AboutBox(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwnd, IDOK); break; case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; } break; default: return 0; } return 1; }
Ý nghĩa của hàm trên tương tự với hàm WndProc
và hàm WM_COMMAND
.
Thêm trường hợp sau Help / About lên WndProc
.
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { // .. case ID_HELP_ABOUT: DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hwnd, AboutBox); break; } // .. } return 0; }
Giải thích:
DialogBox()
: là hàm đưa Dialog đã định nghĩa trên resource ra màn hình.EndDialog()
: hàm này sẽ kết thúc Dialog Box và trả về hàmDialogBox
giá trị ở vế 2.