MFC - Nguyên tắc cơ bản về Windows

Trong chương này, chúng tôi sẽ trình bày các nguyên tắc cơ bản của Windows. Để tạo một chương trình, còn được gọi là ứng dụng, bạn lấy một lớp từ CWinApp của MFC.CWinApp viết tắt của Class for a Windows Application.

Chúng ta hãy xem xét một ví dụ đơn giản bằng cách tạo một dự án Win32 mới.

Step 1 - Mở Visual studio và nhấp vào tùy chọn menu File → New → Project.

Step 2 - Bây giờ bạn có thể thấy hộp thoại Dự án mới.

Step 3 - Từ khung bên trái, chọn Mẫu → Visual C ++ → Win32.

Step 4 - Trong khung giữa, chọn Win32 Project.

Step 5- Nhập tên dự án 'MFCWindowDemo' vào trường Tên và nhấn OK để tiếp tục. Bạn sẽ thấy hộp thoại sau.

Step 6 - Nhấp vào Tiếp theo.

Step 7 - Chọn các tùy chọn như trong hộp thoại đưa ra ở trên và nhấp vào Hoàn tất.

Step 8 - Một dự án trống được tạo.

Step 9 - Để biến nó thành một dự án MFC, nhấp chuột phải vào dự án và chọn Thuộc tính.

Step 10 - Ở phần bên trái, nhấp vào Thuộc tính cấu hình → Chung.

Step 11 - Chọn tùy chọn Use MFC in Shared DLL trong phần Project Defaults và nhấn OK.

Step 12 - Thêm một tệp nguồn mới.

Step 13 - Nhấp chuột phải vào Dự án của bạn và chọn Thêm → Mục mới ...

Step 14 - Trong phần Mẫu, nhấp vào Tệp C ++ (.cpp).

Step 15 - Đặt Tên làm Ví dụ và nhấp vào Thêm.

Tạo cửa sổ

Bất kỳ ứng dụng nào cũng có hai phần chính -

  • Class
  • Khung hoặc Cửa sổ

Hãy để chúng tôi tạo một cửa sổ bằng các bước sau:

Step 1 - Để tạo một ứng dụng, chúng ta cần lấy một lớp từ CWinApp của MFC.

#include
class CExample : public CWinApp {
   BOOL InitInstance() {
      return TRUE;
   }
};

Step 2 - Chúng tôi cũng cần một khung / cửa sổ để hiển thị nội dung ứng dụng của chúng tôi.

Step 3 - Đối với điều này, chúng ta cần thêm một lớp khác và lấy nó từ MFC's CFrameWnd lớp và triển khai phương thức khởi tạo của nó và gọi phương thức Create (), phương thức này sẽ tạo một khung / cửa sổ như được hiển thị trong đoạn mã sau.

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"));
      }
};

Step 4 - Như bạn có thể thấy rằng phương thức Create () cần hai tham số, tên của lớp, sẽ được truyền là NULL và tên của cửa sổ, là chuỗi sẽ được hiển thị trên thanh tiêu đề.

Cửa sổ chính

Sau khi tạo một cửa sổ, để ứng dụng sử dụng, bạn có thể sử dụng con trỏ để hiển thị lớp được sử dụng để tạo cửa sổ. Trong trường hợp này, con trỏ sẽ là CFrameWnd. Để sử dụng cửa sổ khung, hãy gán con trỏ của nó cho biến thành viên CWinThread :: m_pMainWnd. Điều này được thực hiện trong triển khai InitInstance () của ứng dụng của bạn.

Step 1 - Đây là phần thực thi InitInstance () trong lớp CExample.

class CExample : public CWinApp {
   BOOL InitInstance() {
      CMyFrame *Frame = new CMyFrame();  m_pMainWnd = Frame;
      
      Frame->ShowWindow(SW_NORMAL);
      Frame->UpdateWindow();
      
      return TRUE;
   }
};

Step 2 - Sau đây là phần triển khai hoàn chỉnh của tệp tin example.cpp.

#include <afxwin.h>

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"));
      }
};

class CExample : public CWinApp {
   BOOL InitInstance() {
      CMyFrame *Frame = new CMyFrame();
      m_pMainWnd = Frame;
      
      Frame->ShowWindow(SW_NORMAL);
      Frame->UpdateWindow();
      
      return TRUE;
   }
};

CExample theApp;

Step 3 - Khi chúng ta chạy ứng dụng trên, cửa sổ sau được tạo.

Kiểu Windows

Kiểu Windows là các đặc điểm kiểm soát các tính năng như giao diện cửa sổ, đường viền, trạng thái thu nhỏ hoặc tối đa hoặc các trạng thái thay đổi kích thước khác, v.v.

Sr.No. Phong cách & Mô tả
1

WS_BORDER

Tạo một cửa sổ có đường viền.

2

WS_CAPTION

Tạo cửa sổ có thanh tiêu đề (ngụ ý kiểu WS_BORDER). Không thể sử dụng với kiểu WS_DLGFRAME.

3

WS_CHILD

Tạo một cửa sổ con. Không thể sử dụng với kiểu WS_POPUP.

4

WS_CHILDWINDOW

Giống như kiểu WS_CHILD.

5

WS_CLIPCHILDREN

Loại trừ khu vực bị chiếm bởi các cửa sổ con khi bạn vẽ trong cửa sổ mẹ. Được sử dụng khi bạn tạo cửa sổ mẹ.

6

WS_CLIPSIBLINGS

Cắt các cửa sổ con tương đối với nhau; nghĩa là, khi một cửa sổ con cụ thể nhận được thông báo sơn, kiểu WS_CLIPSIBLINGS sẽ cắt tất cả các cửa sổ con chồng chéo khác ra khỏi vùng của cửa sổ con sẽ được cập nhật. (Nếu WS_CLIPSIBLINGS không được cung cấp và các cửa sổ con chồng lên nhau, khi bạn vẽ trong vùng máy khách của cửa sổ con, bạn có thể vẽ trong vùng máy khách của cửa sổ con lân cận.) Chỉ để sử dụng với kiểu WS_CHILD.

7

WS_DISABLED

Tạo một cửa sổ ban đầu bị tắt.

số 8

WS_DLGFRAME

Tạo một cửa sổ có đường viền kép nhưng không có tiêu đề.

9

WS_GROUP

Chỉ định điều khiển đầu tiên của một nhóm điều khiển trong đó người dùng có thể di chuyển từ điều khiển này sang điều khiển tiếp theo bằng các phím mũi tên. Tất cả các điều khiển được xác định với kiểu WS_GROUP FALSE sau điều khiển đầu tiên thuộc cùng một nhóm. Điều khiển tiếp theo với kiểu WS_GROUP bắt đầu nhóm tiếp theo (nghĩa là một nhóm kết thúc khi nhóm tiếp theo bắt đầu).

10

WS_HSCROLL

Tạo cửa sổ có thanh cuộn ngang.

11

WS_ICONIC

Tạo một cửa sổ ban đầu được thu nhỏ. Giống như kiểu WS_MINIMIZE.

12

WS_MAXIMIZE

Tạo một cửa sổ có kích thước tối đa.

13

WS_MAXIMIZEBOX

Tạo cửa sổ có nút Phóng to.

14

WS_MINIMIZE

Tạo một cửa sổ ban đầu được thu nhỏ. Chỉ để sử dụng với kiểu WS_OVERLAPPED.

15

WS_MINIMIZEBOX

Tạo một cửa sổ có nút Thu nhỏ.

16

WS_OVERLAPPED

Tạo một cửa sổ chồng chéo. Một cửa sổ chồng chéo thường có chú thích và đường viền.

17

WS_OVERLAPPED WINDOW

Tạo một cửa sổ chồng chéo với các kiểu WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX và WS_MAXIMIZEBOX.

18

WS_POPUP

Tạo một cửa sổ bật lên. Không thể sử dụng với kiểu WS_CHILD.

19

WS_POPUPWINDOW

Tạo cửa sổ bật lên với các kiểu WS_BORDER, WS_POPUP và WS_SYSMENU. Kiểu WS_CAPTION phải được kết hợp với kiểu WS_POPUPWINDOW để hiển thị menu Điều khiển.

20

WS_SIZEBOX

Tạo một cửa sổ có đường viền định cỡ. Giống như kiểu WS_THICKFRAME.

21

WS_SYSMENU

Tạo một cửa sổ có hộp menu Điều khiển trên thanh tiêu đề. Chỉ được sử dụng cho các cửa sổ có thanh tiêu đề.

22

WS_TABSTOP

Chỉ định một trong bất kỳ số lượng điều khiển nào mà người dùng có thể di chuyển bằng cách sử dụng phím TAB. Phím TAB chuyển người dùng sang điều khiển tiếp theo được chỉ định bởi kiểu WS_TABSTOP.

23

WS_THICKFRAME

Tạo một cửa sổ với một khung dày có thể được sử dụng để kích thước cửa sổ.

24

WS_TILED

Tạo một cửa sổ chồng chéo. Một cửa sổ chồng chéo có một thanh tiêu đề và một đường viền. Giống như kiểu WS_OVERLAPPED.

25

WS_TILEDWINDOW

Tạo một cửa sổ chồng chéo với các kiểu WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX và WS_MAXIMIZEBOX. Giống như kiểu WS_OVERLAPPEDWINDOW.

26

WS_VISIBLE

Tạo một cửa sổ hiển thị ban đầu.

27

WS_VSCROLL

Tạo cửa sổ có thanh cuộn dọc.

Step 1- Chúng ta hãy xem xét một ví dụ đơn giản, trong đó chúng ta sẽ thêm một số kiểu dáng. Sau khi tạo một cửa sổ, để hiển thị nó cho người dùng, chúng ta có thể áp dụng kiểu WS_VISIBLE cho nó và thêm vào đó, chúng ta cũng sẽ thêm kiểu WS_OVERLAPPED. Đây là một triển khai -

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_VISIBLE | WS_OVERLAPPED);
      }
};

Step 2 - Khi bạn chạy ứng dụng này, cửa sổ sau sẽ được tạo.

Bây giờ bạn có thể thấy rằng các tùy chọn thu nhỏ, tối đa hóa và đóng không xuất hiện nữa.

Vị trí Windows

Để xác định vị trí những thứ hiển thị trên màn hình, máy tính sử dụng một hệ tọa độ tương tự như hệ Descartes, nhưng điểm gốc nằm ở góc trên cùng bên trái của màn hình. Sử dụng hệ tọa độ này, bất kỳ điểm nào cũng có thể được định vị theo khoảng cách từ góc trên cùng bên trái của màn hình theo trục ngang và trục dọc.

Các Win32 library cung cấp một cấu trúc được gọi là POINT được định nghĩa như sau:

typedef struct tagPOINT {
   LONG x;
   LONG y;
} POINT;
  • Biến thành viên 'x' là khoảng cách từ đường viền bên trái của màn hình đến điểm.

  • Biến 'y' đại diện cho khoảng cách từ đường viền trên cùng của màn hình đến điểm.

  • Bên cạnh cấu trúc POINT của Win32, thư viện Microsoft Foundation Class (MFC) cung cấp lớp CPoint.

  • Điều này cung cấp chức năng tương tự như cấu trúc POINT. Là một lớp C ++, nó bổ sung thêm nhiều chức năng cần thiết để định vị một điểm. Nó cung cấp hai hàm tạo.

CPoint();
CPoint(int X, int Y);

Kích thước Windows

Trong khi một điểm được sử dụng để định vị một đối tượng trên màn hình, mỗi cửa sổ có một kích thước. Kích thước cung cấp hai thước đo liên quan đến một đối tượng.

  • Chiều rộng của một đối tượng.
  • Chiều cao của một đối tượng.

Thư viện Win32 sử dụng cấu trúc SIZE được định nghĩa như sau:

typedef struct tagSIZE {
   int cx;
   int cy;
} SIZE;

Bên cạnh cấu trúc SIZE của Win32, MFC cung cấp lớp CSize. Lớp này có chức năng tương tự như SIZE nhưng thêm các tính năng của một lớp C ++. Nó cung cấp năm hàm tạo cho phép bạn tạo biến kích thước theo bất kỳ cách nào bạn chọn.

CSize();
CSize(int initCX, int initCY);
CSize(SIZE initSize);
CSize(POINT initPt);
CSize(DWORD dwSize);

Kích thước Windows

Khi một Cửa sổ hiển thị, nó có thể được xác định trên màn hình theo vị trí của nó liên quan đến các đường viền của màn hình. Một Cửa sổ cũng có thể được xác định bằng chiều rộng và chiều cao của nó. Những đặc điểm này được quy định hoặc điều khiển bởi rect lập luận củaCreate()phương pháp. Đối số này là một hình chữ nhật có thể được tạo thông qua cấu trúc Win32 RECT.

typedef struct _RECT {
   LONG left;
   LONG top;
   LONG right;
   LONG bottom;
} RECT, *PRECT;

Bên cạnh Win32's RECT cấu trúc, MFC cung cấp lớp CRect có các hàm tạo sau:

CRect();
CRect(int l, int t, int r, int b);
CRect(const RECT& srcRect);
CRect(LPCRECT lpSrcRect);
CRect(POINT point, SIZE size);
CRect(POINT topLeft, POINT bottomRight);

Chúng ta hãy xem xét một ví dụ đơn giản, trong đó chúng ta sẽ chỉ định vị trí và kích thước của cửa sổ

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, CRect(90, 120, 
            550, 480));
      }
};

Khi bạn chạy ứng dụng này, cửa sổ sau được tạo ở góc trên cùng bên trái màn hình của bạn như được chỉ định trong hàm tạo CRect trong hai tham số đầu tiên. Hai tham số cuối cùng là kích thước của Cửa sổ.

Cha mẹ Windows

Trong thế giới thực, nhiều ứng dụng được tạo từ các Windows khác nhau. Khi một ứng dụng sử dụng Windows khác nhau, hầu hết các đối tượng phụ thuộc vào một đối tượng cụ thể. Nó có thể là Cửa sổ đầu tiên đã được tạo hoặc một cửa sổ khác mà bạn đã chỉ định. Cửa sổ như vậy được gọi làParent Window. Tất cả các cửa sổ khác phụ thuộc vào nó trực tiếp hoặc gián tiếp.

  • Nếu Cửa sổ bạn đang tạo phụ thuộc vào một cửa sổ khác, bạn có thể chỉ định rằng nó có cửa sổ cha.

  • Điều này được thực hiện với đối số pParentWnd của phương thức CFrameWnd :: Create ().

  • Nếu Cửa sổ không có cha, hãy truyền đối số có giá trị NULL.

Chúng ta hãy xem xét một ví dụ chỉ có một Cửa sổ và không có Cửa sổ mẹ nào có sẵn, vì vậy chúng ta sẽ chuyển đối số với giá trị NULL như được hiển thị trong đoạn mã sau:

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, 
            CRect(90, 120, 550, 480), NULL);
      }
};

Khi bạn chạy ứng dụng trên, bạn sẽ thấy kết quả tương tự.