Ошибка при попытке добавить «DwmSetWindowAttribute» в базовое окно [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка при попытке добавить «DwmSetWindowAttribute» в базовое окно [дубликат]

Сообщение Anonymous »

Я попробовал объединить два фрагмента кода от Microsoft и, к сожалению, для этого я просмотрел множество разных решений и попробовал немало, но не смог понять, что не так и как это исправить.Я использую VS 2022 Community Edition, и для него установлен C++14. Я начал с базового «Настольного приложения Windows», взятого с веб-сайта Microsoft (https://learn.microsoft.com/en-us/cpp/w ... view=msvc- 170). Он использует довольно много команд Win32, но со мной все в порядке, поскольку я могу найти хорошие ссылки в Интернете. Прежде чем добавить несколько строк кода, я запустил программу, и она работала как положено, то есть отображала окно с сообщением. Затем я снова добавил код, взятый непосредственно с веб-сайта Microsoft (https://learn.microsoft.com/en-us/windo ... sition-ovw). Я добавил необходимые

#include

в начало исходного кода. Поскольку DisableNCRendering — это функция, я добавил ее вызов сразу после команды CreateWindowEx. В конце концов, моя цель — поиграть с DwmWindowAttribute.
Теперь, когда я запускаю код, я получаю сообщение об ошибке, неразрешенный внешний символ _imp_DwmSetWindowAttribute... :
Изображение

Я так понимаю, что где-то есть звонок, который неизвестен, потому что не может найти ссылку на него. Я пробовал разные вещи, но безуспешно. Я нашел один вариант — использовать оператор [dllimport], но я не уверен, где его поместить в код. В любом случае, вот полный код. В комментариях я выделил три места, где я добавил код.

Код: Выделить всё

// HelloWindowsDesktop.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include 
#include 
#include 
#include 
//********************************************************************************
//**************************** THIS PART WAS ADDED *******************************
#include 
//********************************************************************************
//********************************************************************************

// Global variables

// The main window class name.
static TCHAR szWindowClass [ ] = _T ( "DesktopApp" );

// The string that appears in the application's title bar.  static
TCHAR szTitle [ ] = _T ( "Windows Desktop Guided Tour Application" );

// Stored instance handle for use in Win32 API calls such as
FindResource HINSTANCE hInst;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM );

//********************************************************************************
//**************************** THIS PART WAS ADDED *******************************
HRESULT DisableNCRendering ( HWND hWnd ) {
HRESULT hr = S_OK;

DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;

// Disable non-client area rendering on the window.
hr = ::DwmSetWindowAttribute ( hWnd,
DWMWA_NCRENDERING_POLICY,
&ncrp,
sizeof ( ncrp ) );

if ( SUCCEEDED ( hr ) )
{
// ...
}

return hr; }
//********************************************************************************
//********************************************************************************

int WINAPI WinMain (
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR     lpCmdLine,
_In_ int       nCmdShow ) {
WNDCLASSEX wcex;

wcex.cbSize = sizeof ( WNDCLASSEX );
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon ( wcex.hInstance, IDI_APPLICATION );
wcex.hCursor = LoadCursor ( NULL, IDC_ARROW );
wcex.hbrBackground = ( HBRUSH ) ( COLOR_WINDOW + 1 );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon ( wcex.hInstance, IDI_APPLICATION );

if ( !RegisterClassEx ( &wcex ) )
{
MessageBox ( NULL,
_T ( "Call to RegisterClassEx failed!" ),
_T ( "Windows Desktop Guided Tour" ),
NULL );

return 1;
}

// Store instance handle in our global variable
hInst = hInstance;

// The parameters to CreateWindowEx explained:
// WS_EX_OVERLAPPEDWINDOW : An optional extended window style.
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindowEx (
WS_EX_OVERLAPPEDWINDOW,
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
NULL,
NULL,
hInstance,
NULL
);

if ( !hWnd )
{
MessageBox ( NULL,
_T ( "Call to CreateWindow failed!" ),
_T ( "Windows Desktop Guided Tour" ),
NULL );

return 1;
}

//********************************************************************************
//**************************** THIS PART WAS ADDED *******************************
HRESULT test = DisableNCRendering ( hWnd );
//********************************************************************************
//********************************************************************************

// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow ( hWnd,
nCmdShow );
UpdateWindow ( hWnd );

// Main message loop:
MSG msg;
while ( GetMessage ( &msg, NULL, 0, 0 ) )
{
TranslateMessage ( &msg );
DispatchMessage ( &msg );
}

return ( int ) msg.wParam; }

//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE: Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window >
//  WM_DESTROY  - post a quit message and return
LRESULT CALLBACK WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting [ ] = _T ( "Hello, Windows desktop!" );

switch ( message )
{
case WM_PAINT:
hdc = BeginPaint ( hWnd, &ps );

// Here your application is laid out.
// For this introduction, we just print out "Hello, Windows desktop!"
// in the top left corner.
TextOut ( hdc,
5, 5,
greeting, _tcslen ( greeting ) );
// End application-specific layout section.

EndPaint ( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
return DefWindowProc ( hWnd, message, wParam, lParam );
break;
}

return 0; }
Еще раз спасибо, что нашли время прочитать мой пост, и спасибо за любую информацию, которую вы можете предоставить.

Подробнее здесь: https://stackoverflow.com/questions/791 ... sic-window
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»