STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

    Lập Trình Win32 API - Phần 3: Tạo Và Sử Dụng Resource

    Resource - tài nguyên là một sức mạnh lớn trong việc lập trình bao gồm ứng dụng. Bài viết sau hướng dẫn phương pháp tạo và sử dụng resource - icon, menu, dialog với Win32 API.
    12/09/2015 18/09/2020 5 phút đọc
    Lập Trình Win32 API - Phần 3: Tạo Và Sử Dụng Resource

    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.

    Thêm resource file vào project Visual Studio

    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.

    Giao diện resource editor của Winform

    Chọn nút Import

    Thêm resource ảnh icon cho ứng dụng winform bằng Win32API

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

    Hiển thị resource ảnh icon trong winform với Win32API

    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.hIconwc.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ấy IDI_ICON1 mà đã thao tác ở trên.

    Chạy thử chương trình

    Giao diện Winform đã được cài đặt icon

    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.

    Thêm resource menu cho Winform bằng Win32API

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

    Giao diện Resource View của Menu trong Winform

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

    Thêm file và edit cho menu trong Winform bằng Win32API

    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à wParamlParam
    • 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ới wParamlParam để 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.

    Tạo DialogBoX trong Winform bằng Win32API

    Double click vào Dialog:

    Giao diện dialog được dựng bằng Win32API

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

    Giao diện Dialog Editor Win32API

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

    Giao diện Dialog Winform sử dụng resources với Win32API

    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àm DialogBox giá trị ở vế 2.

    Download project demo Win32 hoàn chỉnh

    Bài chung series

    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021