#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
Мобильная версия