C++ 初始化器列表无法转换为常量页边距*

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

今天我跳到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 , 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