#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 минут, чтобы принять ответ. Портал не позволял мне сделать это раньше.