2016-04-25 12 views
0

私はC++や他の言語の経験がありますが、C++を使用する前にゲームを作っただけです。OBSプラグインを作成する必要があります..C++でウィンドウを作成する

私は、ウィンドウを作成しようとしている -

int nHeight = 500; 
int nWidth = 500; 

#define metaData(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\ 
    CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) 

if (GetAsyncKeyState(VK_F5)) 
    { 
     //MsgeBox::myMessage::createMessage(NULL, (LPCWSTR)L"Hello", (LPCWSTR)L"I See You.", MB_ICONWARNING | MB_CANCELTRYCONTINUE); 
     #define CreateWindow metaData; 
    } 

これは、ウィンドウを作成しませんし、それがエラーを与えるものではありません..私は閉じよう一度、私はそれだけで表示されるメッセージボックスを呼び出すとき窓..それはなぜですか?

個別のウィンドウを作成するにはどうすればよいですか?

次のチュートリアルイムは - https://msdn.microsoft.com/en-us/library/bb384843.aspx

+1

この関数の宣言は、あなたがフォローしているウォークスルーのどこにも発生しません。より詳細に検討してください。関数宣言と関数呼び出しの違いがわからない場合、おそらくあなたの好きなC++の本を再訪する時が来ます。 – molbdnilo

+0

@molbdnilo私はダンプ・モーメントを持っていました。申し訳ありません^^私の質問を更新しましょう – Gerwin

+0

あなたがあなたに従っていると言っているチュートリアルに従うだけで、多くの問題を解決することができます。 (それらのマクロは意味をなさないので、私の本の再訪のアドバイスはまだまだ立っています。) – molbdnilo

答えて

1

あなたがキーメッセージに応答し、メッセージのプロシージャを作成する必要があります。たとえば、

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) 
{ 
    switch (msg) 
    { 
    case WM_KEYDOWN: 
     if (wp == VK_F5) 
     CreateWindow(L"ChildClass", L"Child window", 
        WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION, 
        0, 0, 300, 200, hwnd, 0, 0, 0); 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hwnd, msg, wp, lp); 
} 

"ChildClass"の2番目のクラス名を登録してから、この子クラスの別のメッセージプロシージャを作成する必要があります。

次に、に似ているChildProcという別の関数を追加します。例:

#define UNICODE 
#include <Windows.h> 

HINSTANCE g_hinstance = 0; 

LRESULT CALLBACK ChildProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) 
{ 
    switch (msg) 
    { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hwnd, msg, wp, lp); 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) 
{ 
    switch (msg) 
    { 
    case WM_KEYDOWN: 
    { 
     if (wp == VK_F5) 
     { 
      MessageBox(0, L"VK_F5 detected", 0, 0); 
      if (!CreateWindow(L"ChildClass", L"ChildTitle", 
       WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION, 100, 100, 300, 200, 
       hwnd, 0, g_hinstance, 0)) 
      { 
       DWORD err = GetLastError(); 
       wchar_t buf[100]; 
       wsprintf(buf, L"%d\n", err); 
       MessageBox(0, buf, 0, 0); 
      } 
     } 
     break; 
    } 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hwnd, msg, wp, lp); 
} 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int) 
{ 
    WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; 
    wcex.style = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = WndProc; 
    wcex.hInstance = hInstance; 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 
    wcex.lpszClassName = L"MainClass"; 
    RegisterClassEx(&wcex); 

    wcex.lpszClassName = L"ChildClass"; 
    wcex.lpfnWndProc = ChildProc; 
    RegisterClassEx(&wcex); 

    CreateWindow(L"MainClass", L"MainTitle", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
     0, 0, 600, 400, 0, 0, hInstance, 0); 

    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int)msg.wParam; 
} 
+0

これを実装しようとすると、次のようになります。最初の後{ – Gerwin

+0

私はエラーメッセージを理解していません。その後、 '{'? –

+0

後 - それはまた言うLRESULT CALLBACK WndProcメソッド(HWND hwndは、UINT MSG、WPARAMのwp、LPARAM LP) { - エラーエラーC2601: 'WndProcメソッド':ローカル関数定義が\t C違法である:\パス – Gerwin

関連する問題