Программирование на Windows: разность pWnd и HWND

Почему некоторые функции в Windows требуют параметра pWnd то время как другим требуется параметр HWND? Пример:

// Get a dc for a CWnd object pointer.
CPaintDC dc(pWnd);
// Send my private massage.
::SendMessage(pWnd->m_hWnd, WM_MYMESSAGE, (LPARAM) &dc.m_ps, 0);

На самом деле, почему Windows имеет оба типа pWnd и HWND?

Поскольку HWND можно получить через pWnd->m_hWnd, функции всегда всегда могут принимать pWnd в качестве параметра. Какова философия дизайна?

1 ответ

В Windows нет ни одной функции, которая принимает CWnd* (которую вы вызываете pWnd). Windows (в частности, user32.dll) использует исключительно HWND для идентификации объектов окна.

class CWnd является частью MFC, которая представляет собой библиотеку C++, построенную поверх Windows. Только MFC и классы и функции, написанные с использованием MFC, даже будут знать, что это такое.

(И тогда есть современный пользовательский интерфейс, ранее известный как-Metro, который не имеет ничего из вышеперечисленного. Он также не использует user32.dll но это другая тема.)

licensed under cc by-sa 3.0 with attribution.