Lập Trình Win32 API - Phần 1: Tổng Quan


Giới thiệu

[NOTE]: bài viết được sưu tầm từ nguồn https://www.stdio.vn/articles/read/188/lap-trinh-win32-api-phan-1-tong-quan

Có bao giờ bạn từ đặt câu hỏi: các phần mềm được thể hiện ra cửa sổ thế nào nhỉ? Với một phần mềm được viết trên một cửa sổ như thế sẽ giúp ích rất nhiều cho người dung vì người dùng rất dễ thao tác nhưng việc tạo ra nó khá khó với các lập trình viên.
Thuở sơ khai việc tạo ra một cửa sổ khá phức tạp phát triển cho đến nay thì việc tạo một cửa sổ ở C# khá đơn giản. Nhưng trong loạt bài viết này, tác giả xin đề cập đến một thư viện do Microsoft cung cấp để tạo ra các cửa sổ với Win32 API và C/C++.

Tiền đề bài viết

Bài viết ra đời nhằm mục đích học hỏi thêm kinh nghiệm và chia sẻ kiến thức. Ý tưởng viết xuất phát từ đề xuất của tác giả La Kiến Vinh :: www.stdio.vn/users/index/1/la-kien-vinh, và một phần lấy cảm hứng từ bài viết về đồ họa máy tính của Amy Lê :: www.stdio.vn/users/index/70/amy-le
Đối tượng hướng đến
Bài viết hướng đến những bạn có quan tâm đến Win32 API, những bạn mong muốn "làm được điều gì đó" với C++ cụ thể ở đây là một phần mềm nhỏ. Đích đến của loạt bài viết sau là một phần mềm nhỏ chạy được. Ví dụ như vẽ parabol, máy tính bỏ túi, biểu diễn các thuật toán sắp xếp, mini game, …

Win32 API là gì?

Trước tiên ta làm quen với khái niệm API, API viết tắt cho Application Programming Interface có nghĩa là “Giao diện lập trình ứng dụng”, nó cung cấp một một số hàm đã được dựng sẵn để phục vụ mục đích của người lập trình viên.
Win32 là viết tắt cho cụm từ Windows 32-bit, tức ở đây, Win32 API cung cấp cho ta một số lượng hàm, thủ tục nhất định để ta dễ dàng tạo ra một chương trình theo ý muốn. Việc làm quen với Win32 API sẽ mất khá nhiều thời gian nhưng khi thuần thục, nó sẽ trở nên rất hữu dụng, cụ thể là ta sẽ không cần biểu diễn code của mình ra màn hình console nữa hoặc bạn có thể dùng để demo đơn giản phần mêm của mình trên lớp.
Với Win64 cũng sẽ có những điều tương tự, trong giới hạn bài viết này, tôi sẽ không đề cập Win64. Tôi sẽ dành nó cho các bài viết sau.

Các thuật ngữ hay sử dụng

Loạt bài viết sau sẽ sử dụng các từ viết tắt hoặc một số từ thông dụng khó dịch sang tiếng Việt sau đây, bạn nên tham khảo các bài viết trước, khi thấy một số từ không hiểu hẵn quay lại tìm nhé:
  • Handle – Thể hiện đây là “tay vịn”, giống như một bàn tay, nó quản lý một thứ gì đó cụ thể, bạn thao tác với nó đồng nghĩa bạn thao tác với các thứ mà nó quản lý
  • Window – cửa sổ, là giao diện cửa sổ của một "control", trong các ứng dụng khác bạn sẽ nghe khái niệm control (button, label, ...), với Win32 Window chính là tên gọi chung
  • Message – thông điệp, là thông điệp mà ta gửi đến máy tính qua các thao tác trên máy như click chuột, nhấn bàn phím, …
  • Menu – danh bạ, thể hiện một danh sách đối tượng
  • Quene – Hàng đợi, được sắp xếp và lấy ra theo nguyên tắc vào trước ra trước

Hướng dẫn

Bài viết sau sẽ hướng dẫn bạn tạo một cửa sổ như bên dưới đây:
ss_1

Tạo project

Ta sẽ bắt đầu bằng việc tạo một Empty Project, các hình ảnh sau tôi dùng Visual Studio 2008 để hướng dẫn, điều này các bạn có thể làm tương tự với Visual Studio 2013 hoặc các phiên bản khác.
Các bạn vào File -> New -> Project hoặc dùng tổ hơp phím Ctrl + Shift + N như hình
ss_2
Kế tiếp, các bọn vào mục General, chọn Empty project (với VS2013 các bạn chọn Visual C++ -> General -> Empty project). Sau khi chọn xong, các bạn đặt tên cho project của mình, cụ thể ở đây, tác giả đặt tên là win32_01_VS2008.
ss_3
Trên thanh Solution Explorer nằm bên tay trái (hoặc chọn View -> Solution Explorer). Ở trong đây, các bạn chuột phải vào Source Files -> Add -> New Item
ss_4
Ở Categories các bạn chọn Visual C++ -> Code -> C++ file (.cpp) và đặt tên cho nó. Ở đây tác giả đặt tên là WinMain, nhằm phân biệt với main.cpp mà trước đây khi ta còn thao tác trên Console.
ss_5

Thao tác trên WinMain

Giai đoạn đầu, ta sẽ làm quen với đoạn code nhỏ, các bạn viết đoạn code sau đây lên WinMain.cpp nhé.
(Lưu ý, các bạn nên tự gõ vào để làm quen thay vì copy & paste)
  1. #include <windows.h>
  2.  
  3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  4. LPSTR lpCmdLine, int nCmdShow)
  5. {
  6. MessageBox(NULL, "Text of stdio.vn", "Caption of STDIO.VN", MB_OK);
  7. return 0;
  8. }
Trong đoạn code trên, ta có:
  • windows.h – Thư viện Win32 API mà windows cung cấp, thư viện này ta luôn dùng cho loạt bài sau
  • int WinMain() – Tương tự như hàm main() trước đây nhưng đây là bạn đang thể hiện ra window
Phân tích các thành phần trong WinMain:
  1. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  2. LPSTR lpCmdLine, int nCmdShow);
  • HINSTANCE hInstance: Quản lý việc thực thi của chương trình, nó quản lý tài nguyên của chương trình đang cài đặt, cụ thể là file .exe trong hệ thống (tìm hiểu sau)
  • HINSTANCE hPrevInstance: con trỏ trỏ đến việc thực thi trước đó (tìm hiểu sau).
  • LPSTR lpCmdLine: Là một command line arguments là một chuỗi ký tự bình thường, không được chứ tên chương trình
  • int nCmdShow: Là một số nguyên để cung cấp cho hàm ShowWindow() (tìm hiểu sau)
  • Hàm MessageBox(HWND hwnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType): Là hộp tin nhắn từ hệ thống, nó là thống tin mà hệ thống gửi đén người dùng, khi các bạn debug sẽ hiểu:
    • hwnd: là con trỏ, trỏ vào một window nào đó (tìm hiểu sau)
    • lpText: Đoạn văn bản thể hiện ở thân MessageBox
    • lpCaption: Tương tự lpText nhưng là văn bản nằm ở trên thanh trên cùng
    • uType: Thể hiện kiểu của MessageBox, ví dụ như ở đây là MB_OK. Trỏ vào MB_OK bạn sẽ thấy rõ đây là một con số (cụ thể là 0x00000000L). Trong thư viện windows, thư viện định nghĩa MB_OK là để giúp dễ nhớ hơn, sau này ta sẽ thao tác với các kiểu khác nữa.
ss_6

Kết quả

Build và chạy thử chương trình, winform đầu tiên của chúng ta ở Win32 API.
ss_7

Lời kết

Khi theo dõi loạt bài viết sau đây, bạn sẽ bắt gặp vài loại biến khác lạ như UINT viết tắt cho unsign int – số nguyên không dấu hay LPSTR cho chuỗi char*, … Nếu không quen, bạn có thể sử dụng char* thay cho LPSTR, sẽ không xảy ra vấn đề gì cả. Ví dụ cụ thể ở đây, ở hàm WinMain() bạn hãy thử thay LPSTR bằng char* và build thử.

Comments

Popular posts from this blog

Duyệt cây nhị phân theo chiều rộng _Lập trình C++

Duyệt cây không dùng đệ quy và stack _Lập trình C++ căn bản

Bài toán Upper Bound và Lower Bound trên cây nhị phân tìm kiếm