Список инициализаторов не может быть преобразован в постоянные поля *

Сегодня я перешел на 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);
}
}

Итак, 2 вопроса. Во-первых, как я могу исправить эту ошибку компилятора: http://gyazo.com/6d7de9e0f3bad345dbbe7b9b80c90b8d И второй вопрос. Я понял, что я должен поставить «L» и (LPCWSTR) перед некоторыми символами *, это на 100% требуется? Есть ли способ избежать этого хотя бы (LPCWSTR)? Спасибо, что прочитали.

-1

Решение

Первый,

 const MARGINS* Margin = { 0, 0, Width , Height };

является недействительным. Вы, вероятно, хотите создать новый MARGINS объект и инициализировать его с заданными значениями, в этом случае вы не хотите Margin быть указателем:

 const MARGINS Margin = { 0, 0, Width , Height };

Во-вторых, DwmExtendFrameIntoClientArea() ожидает const MARGINS*, который является указателем на MARGINS объект. Просто дайте ему адрес Margin:

DwmExtendFrameIntoClientArea(hWnd, &Margin);

Что касается проблем с широкими символами, я предполагаю, что вы компилируете это с «набором символов Unicode» в опциях проекта. В этом случае большинство строк в Windows API будут указателями на широкие символы (wchar_t*). Однако вы выделяете узкие массивы символов (например, lWindowName) и приведение их к указателю на wchar_t:

wClass.lpszClassName = (LPCWSTR)lWindowName;

Это даст вам все виды странного поведения. Убедитесь, что ваши строки действительно сделаны из широких символов:

wchar_t lWindowName[256] = L"TEEEST";

Это позволит вам отказаться от большинства бросков.

1

Другие решения


По вопросам рекламы [email protected]