Bagikan melalui


Menerapkan Jendela dengan CWindowImpl

Untuk menerapkan jendela, dapatkan kelas dari CWindowImpl. Di kelas turunan Anda, deklarasikan peta pesan dan fungsi handler pesan. Anda sekarang dapat menggunakan kelas Anda dengan tiga cara berbeda:

Membuat Jendela Berdasarkan Kelas Windows Baru

CWindowImpl berisi makro DECLARE_WND_CLASS untuk mendeklarasikan informasi kelas Windows. Makro ini mengimplementasikan GetWndClassInfo fungsi , yang menggunakan CWndClassInfo untuk menentukan informasi kelas Windows baru. Ketika CWindowImpl::Create dipanggil, kelas Windows ini terdaftar dan jendela baru dibuat.

Catatan

CWindowImpl meneruskan NULL ke DECLARE_WND_CLASS makro, yang berarti ATL akan menghasilkan nama kelas Windows. Untuk menentukan nama Anda sendiri, teruskan string ke DECLARE_WND_CLASS di kelas -turunan Anda CWindowImpl.

Contoh: Menerapkan jendela

Berikut ini adalah contoh kelas yang mengimplementasikan jendela berdasarkan kelas Windows baru:

class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(_T("MyName")) 
              // If this macro is not specified in your
              // class, ATL will generate a class name

   BEGIN_MSG_MAP(CMyCustomWnd)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some painting code
      return 0;
   }

};

Untuk membuat jendela, buat instans CMyWindow lalu panggil Create metode .

Catatan

Untuk mengambil alih informasi kelas Windows default, terapkan GetWndClassInfo metode di kelas turunan Anda dengan mengatur CWndClassInfo anggota ke nilai yang sesuai.

Superclassing Kelas Windows yang Ada

Makro DECLARE_WND_SUPERCLASS memungkinkan Anda membuat jendela yang mengganti kelas Windows yang ada. Tentukan makro ini di kelas -turunan Anda CWindowImpl. Seperti jendela ATL lainnya, pesan ditangani oleh peta pesan.

Ketika Anda menggunakan DECLARE_WND_SUPERCLASS, kelas Windows baru akan didaftarkan. Kelas baru ini akan sama dengan kelas yang ada yang Anda tentukan, tetapi akan mengganti prosedur jendela dengan CWindowImpl::WindowProc (atau dengan fungsi Anda yang mengambil alih metode ini).

Contoh: Superclass kelas Edit

Berikut ini adalah contoh kelas yang menggantikan kelas Edit standar:

class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
   // "Edit" is the name of the standard Windows class.
   // "MyEdit" is the name of the new Windows class
   // that will be based on the Edit class.
   DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))

   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
   END_MSG_MAP()

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some character handling code
      return 0;
   }
};

Untuk membuat jendela Edit superkelas, buat instans CMyEdit lalu panggil Create metode .

Subkelas Jendela yang Ada

Untuk mensubkelas jendela yang ada, dapatkan kelas dari CWindowImpl dan deklarasikan peta pesan, seperti pada dua kasus sebelumnya. Namun, perhatikan bahwa Anda tidak menentukan informasi kelas Windows apa pun, karena Anda akan subkelas jendela yang sudah ada.

Alih-alih memanggil Create, panggil SubclassWindow dan teruskan handel ke jendela yang ada yang ingin Anda subkelas. Setelah jendela disubkelas, jendela akan menggunakan CWindowImpl::WindowProc (atau fungsi Anda yang mengambil alih metode ini) untuk mengarahkan pesan ke peta pesan. Untuk melepaskan jendela subkelas dari objek Anda, panggil UnsubclassWindow. Prosedur jendela asli jendela kemudian akan dipulihkan.

Lihat juga

Menerapkan Jendela