C++ 初始化器列表无法转换为常量页边距*
今天我跳到Visual Studio(C++)2013,我用了很多时间使用代码块,但我意识到代码块在编译某些代码时开始失败,比如:C++ 初始化器列表无法转换为常量页边距*,c++,margins,C++,Margins,今天我跳到Visual Studio(C++)2013,我用了很多时间使用代码块,但我意识到代码块在编译某些代码时开始失败,比如: //#define _WIN32_WINNT 0x0500 #include "hMain.h" #include <windows.h> #include <Uxtheme.h> int Width = 800; int Height = 600; const MARGINS* Margin = { 0, 0, Width , Heig
//#define _WIN32_WINNT 0x0500
#include "hMain.h"
#include <windows.h>
#include <Uxtheme.h>
int Width = 800;
int Height = 600;
const MARGINS* Margin = { 0, 0, Width , Height };
char lWindowName[256] = "TEEEST";
HWND hWnd;
char tWindowName[256] = "TEEEST";
HWND tWnd;
RECT tSize;
MSG Message;
LRESULT CALLBACK WinProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_PAINT:
Render ();
break;
case WM_CREATE:
DwmExtendFrameIntoClientArea(hWnd, Margin);
break;
case WM_COMMAND:
if (wParam == VK_ESCAPE) PostQuitMessage(0);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, Message, wParam, lParam);
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hSecInstance, LPSTR nCmdLine, INT nCmdShow)
{
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SetWindowToTarget, 0, 0, 0);
WNDCLASSEX wClass;
wClass.cbClsExtra = NULL;
wClass.cbSize = sizeof(WNDCLASSEX);
wClass.cbWndExtra = NULL;
wClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 0, 0));
wClass.hCursor = LoadCursor(0, IDC_ARROW);
wClass.hIcon = LoadIcon(0, IDI_APPLICATION);
wClass.hIconSm = LoadIcon(0, IDI_APPLICATION);
wClass.hInstance = hInstance;
wClass.lpfnWndProc = WinProc;
wClass.lpszClassName = (LPCWSTR)lWindowName;
wClass.lpszMenuName = (LPCWSTR)lWindowName;
wClass.style = CS_VREDRAW | CS_HREDRAW;
if(!RegisterClassEx(&wClass))
exit(1);
tWnd = FindWindow(0, (LPCWSTR)tWindowName);
if (tWnd)
{
GetWindowRect(tWnd, &tSize);
Width = tSize.right - tSize.left;
Height = tSize.bottom - tSize.top;
hWnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED, (LPCWSTR)lWindowName, (LPCWSTR)lWindowName, WS_POPUP, 1, 1, Width, Height, 0, 0, 0, 0);
SetLayeredWindowAttributes(hWnd, 0, 1.0f, LWA_ALPHA);
SetLayeredWindowAttributes(hWnd, 0, RGB(0, 0, 0), LWA_COLORKEY);
ShowWindow( hWnd, SW_SHOW);
}
DirectXInit(hWnd);
for (;;)
{
if (GetAsyncKeyState(VK_ESCAPE)) break;
if(PeekMessage(&Message, hWnd, 0, 0, PM_REMOVE))
{
DispatchMessage(&Message);
TranslateMessage(&Message);
}
Sleep(1);
}
return 0;
}
void SetWindowToTarget()
{
while(true)
{
tWnd = FindWindow(0, (LPCWSTR)tWindowName);
if (tWnd)
{
GetWindowRect(tWnd, &tSize);
Width = tSize.right - tSize.left;
Height = tSize.bottom - tSize.top;
DWORD dwStyle = GetWindowLong(tWnd, GWL_STYLE);
if(dwStyle & WS_BORDER)
{
tSize.top += 23;
Height -= 23;
}
MoveWindow(hWnd, tSize.left, tSize.top, Width, Height, true);
}
else
{
char* ErrorMsg[125];
MessageBox(0, L"MAL", (LPCWSTR)L"Error - Cannot find the game!", MB_OK | MB_ICONERROR);
exit(1);
}
Sleep(100);
}
}
/\define\u WIN32\u WINNT 0x0500
#包括“hMain.h”
#包括
#包括
整数宽度=800;
内部高度=600;
常量边距*边距={0,0,宽度,高度};
char lWindowName[256]=“TEEEST”;
HWND-HWND;
char tWindowName[256]=“TEEEST”;
HWND-tWnd;
矩形tSize;
消息;
LRESULT回调WinProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM)
{
开关(信息)
{
案例WM_油漆:
Render();
打破
案例WM_创建:
DwmExtendFrameIntoClientArea(hWnd,边距);
打破
case WM_命令:
if(wParam==VK_ESCAPE)PostQuitMessage(0);
打破
案例WM_销毁:
PostQuitMessage(0);
返回0;
违约:
返回DefWindowProc(hWnd、Message、wParam、lParam);
打破
}
返回0;
}
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hSecInstance、LPSTR nCmdLine、int nCmdShow)
{
CreateThread(0,0,(LPTHREAD_START_例程)设置WindowToTarget,0,0,0);
WNDCLASSEX WCLASSE;
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(0,0,0));
wClass.hCursor=LoadCursor(0,IDC_箭头);
wClass.hIcon=LoadIcon(0,IDI_应用程序);
wClass.hIconSm=LoadIcon(0,IDI_应用程序);
wClass.hInstance=hInstance;
wClass.lpfnWndProc=WinProc;
wClass.lpszClassName=(LPCWSTR)lWindowName;
wClass.lpszMenuName=(LPCWSTR)lWindowName;
wClass.style=CS|u VREDRAW | CS|HREDRAW;
如果(!RegisterClass(&wClass))
出口(1);
tWnd=FindWindow(0,(LPCWSTR)tWindowName);
中频(tWnd)
{
GetWindowRect(tWnd和&tSize);
宽度=tSize.right-tSize.left;
高度=tSize.bottom-tSize.top;
hWnd=CreateWindowEx(WS_EX_最顶端| WS_EX_透明| WS_EX_分层,(LPCWSTR)lWindowName,(LPCWSTR)lWindowName,WS_弹出窗口,1,1,宽度,高度,0,0,0);
SetLayeredWindowAttributes(hWnd、0、1.0f、LWA_ALPHA);
SetLayeredWindowAttributes(hWnd,0,RGB(0,0,0),LWA_颜色键);
展示窗口(hWnd、SW_展示);
}
DirectXInit(hWnd);
对于(;;)
{
if(GetAsyncKeyState(VK_ESCAPE))中断;
if(PeekMessage(消息和消息,hWnd,0,0,PM_删除))
{
DispatchMessage(&Message);
翻译消息(和消息);
}
睡眠(1);
}
返回0;
}
void SetWindowToTarget()
{
while(true)
{
tWnd=FindWindow(0,(LPCWSTR)tWindowName);
中频(tWnd)
{
GetWindowRect(tWnd和&tSize);
宽度=tSize.right-tSize.left;
高度=tSize.bottom-tSize.top;
DWORD dwStyle=GetWindowLong(tWnd,GWL_样式);
if(dwStyle和WS_边框)
{
tSize.top+=23;
高度-=23;
}
移动窗口(hWnd、tSize.left、tSize.top、宽度、高度、真值);
}
其他的
{
char*ErrorMsg[125];
MessageBox(0,L“错误”,(LPCWSTR)L“错误-找不到游戏!”,MB_确定| MB_icon);
出口(1);
}
睡眠(100);
}
}
所以,有两个问题。首先,我如何修复这个编译器错误:还有第二个问题。我意识到我必须在一些字符前加上“L”和(LPCWSTR),这是100%必需的吗?是否有任何方法至少可以避免(LPCWSTR)?感谢阅读。首先
const MARGINS* Margin = { 0, 0, Width , Height };
这是无效的。您可能希望创建一个新的MARGINS
对象,并使用给定的值对其进行初始化,在这种情况下,您不希望Margin
成为指针:
const MARGINS Margin = { 0, 0, Width , Height };
其次,dwmextendframeintoclienterea()
需要一个常量MARGINS*
,它是指向MARGINS
对象的指针。只需给它一个边距的地址
:
DwmExtendFrameIntoClientArea(hWnd, &Margin);
至于宽字符问题,我假设您是使用项目选项中的“Unicode字符集”编译此文件的。在这种情况下,Windows API中的大多数字符串都是指向宽字符的指针(wchar\u t*
)。但是,您正在分配窄字符数组(例如lWindowName
),并将它们转换为指向wchar\t
的指针:
wClass.lpszClassName = (LPCWSTR)lWindowName;
这会让你有各种奇怪的行为。确保字符串确实由宽字符组成:
wchar_t lWindowName[256] = L"TEEEST";
这将允许您删除大多数强制转换。不管怎样,它是一个4整数的结构。边距是一个windows结构,用于函数DwmExtendFrameIntoClientArea再次检查DwmExtendFrameIntoClientArea函数的行,因为它使用边距变量,但我收到相同的错误,我只是在测试,我没有意识到函数2参数在。。。非常感谢您的两个答案!:D