2015-05-31 3 views
-1

Сегодня я прыгнул в Visual Studio (C++) 2013, я использовал CodeBlocks много времени, но я понял, что CodeBlocks начинает терпеть неудачу при компиляции некоторых кодов, как это:Initilizer-список не может преобразовать в константные ПОЛЯ *

//#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)? Спасибо за чтение.

+0

Что такое MARGINS? – isanae

+0

Nevermind, это структура из 4 целых чисел. – isanae

+0

MARGINS - это структура окон, которая используется в funcion. DwmExtendFrameIntoClientArea –

ответ

1

Во-первых,

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

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

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

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

DwmExtendFrameIntoClientArea(hWnd, &Margin); 

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

wClass.lpszClassName = (LPCWSTR)lWindowName; 

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

wchar_t lWindowName[256] = L"TEEEST"; 

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

+0

OMG. Я не понимал, что аргумент функции 2 был _In ... Спасибо вам столько за оба ответа! : D –