Вызов функции GetDesktopWindow() в winuser.h вместо CWnd::GetDesktopWindow() в функции MFC onButtonClick

#c #visual-studio #visual-c #mfc

Вопрос:

Для моего собственного образования я играю с фрагментами кода некоторых онлайн-примеров.

В начале этих примеров есть такие строки:

 HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);
 

По соображениям удобства я добавил новую кнопку в свой демонстрационный проект MFC на основе диалогового окна, и код, который я собираюсь протестировать, будет записан в ::OnBnClickedRuntest() функцию.

Это хорошо работало в прошлом с различными другими фрагментами кода, которые я изучал, модифицировал и тестировал таким образом. Однако для этих строк я получаю ошибку E0144 во время компиляции:

значение типа «CWnd *» не может использоваться для инициализации сущности типа «HWND».

Я решил, что столкнулся с какой-то проблемой сопоставления имен/видимости. Как я надеюсь вызвать GetDesktopWindow() и GetDC() определить winuser.h , но, по-видимому, в CWnd классе также есть методы с точно такими же именами и разными типами возвращаемых данных.

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdesktopwindow

https://docs.microsoft.com/en-us/cpp/mfc/reference/cwnd-class?view=msvc-160#getdesktopwindow

Очевидно, что мой тестовый код помещается в OnButtonClicked функцию диалогового окна MFC GetDesktopWindow() и GetDC() предпочитает вызывать методы CWnd::GetDesktopWindow() and CWnd::GetDC() вместо запланированных winuser.h функций.

Как я могу объяснить компилятору, что вместо CWnd методов я хочу использовать winuser.h функции с одинаковыми именами?

Комментарии:

1. В МФЦ вы можете воспользоваться CClientDC dc(GetDesktopWindow()); . CClientDC звонки GetDC/ReleaseDC . Но вызов основных функций с оператором разрешения также может быть полезен.

Ответ №1:

Используйте оператор разрешения области для функций:

 ::GetDesktopWindow();
::GetDC();
 

Комментарии:

1. ВОТ ЧЕГО МНЕ НЕ ХВАТАЛО! Я знал, что в противном случае я мог бы принудительно использовать методы класса, вызвав CWnd::GetDesktopWindow. Чего я не знал, так это того, что способ заставить неклассовую функцию просто написать двойные точки с запятой. И я даже не знал, как сформулировать этот вопрос для поисковой системы.

2. Эд, мне пришлось подождать 10 минут, чтобы принять ответ. Портал не позволял мне сделать это раньше.