2017-06-19 12 views
-3

Winapiを使ってC++でguiを開発しようとしていますが、VM_CREATEで問題が発生しています。VM_CREATEはうまく動作しますがVM_CREATEのコードは動作しません。これは、私のコード:::(Visual Studioがエラーを与えない)あなたは、むしろグローバルHWNDよりも、静的およびボタンのcreateWindow呼び出しのコールバックでのhWnd入力を使用する必要がありますC++ WIN API:なぜ私はWM_CREATEを使用できないのですか

#include <windows.h> 
#include <tchar.h> 



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 

HWND textfield, hwnd, Button; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 

    WNDCLASSEX wc; 
    MSG msg; 
    memset(&wc, 0, sizeof(wc)); 
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.lpfnWndProc = WndProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wc.lpszClassName = L"WindowClass"; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if (!RegisterClassEx(&wc)) { 
     MessageBox(NULL, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK); 
     return 0; 
    } 

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"WindowClass", L"Window", WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     500, 
     500, 
     NULL, NULL, hInstance, NULL); 

    while (GetMessage(&msg, NULL, 0, 0) > 0) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

    switch (message) 
    { 

    case WM_CREATE:      // WORKS TILL HERE 
    textfield = CreateWindow(L"STATIC", L"HELLO", 
      WS_VISIBLE | WS_CHILD | WS_BORDER, 
      300, 300, 100, 25, 
      hwnd, NULL, NULL, NULL); 
    Button = CreateWindow(L"BUTTON",L"Hello this is a button", 
       WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 
       20, 
       20, 
       300, 
       300, 
       hwnd, 
       NULL, 
       NULL, 
       NULL); 

    break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
     break; 
    } 

    return 0; 
} 
+0

「機能しない」とはどういう意味ですか?あなたは詳細を教えていただけますか?そして、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間を割けてください。 –

+0

それは私がそれを意味していない仕事Windowsとテキストもボタンもないというタイトルのウィンドウがあります –

+0

[この 'WM_CREATE'リファレンス](https://msdn.microsoft.com/en-us/library/windows)を読むことをお勧めします/desktop/ms632619(v=vs.85).aspx)。 –

答えて

3

いただきました問題であり、 WM_CREATEが呼び出された時点で設定されていない(WM_CREATEがCreateWindowが返される前に呼び出される)

だから、switch文のWM_CREATE部分の

textfield = CreateWindow(L"STATIC", L"HELLO", 
     WS_VISIBLE | WS_CHILD | WS_BORDER, 
     300, 300, 100, 25, 
     hWnd, NULL, NULL, NULL); 
Button = CreateWindow(L"BUTTON",L"Hello this is a button", 
      WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 
      20, 
      20, 
      300, 
      300, 
      hWnd, 
      NULL, 
      NULL, 
      NULL); 
+0

sry new to C++コードを送信することができます –

+0

@GameplayerXdあなたの 'WndProc'関数の最初の引数は何ですか? 'WM_CREATE'の場合、ウィンドウ*が作成されます(' WinMain'で呼び出される 'CreateWindowEx'関数はまだ返されていません)。 –

+0

私はhwndをhWndに変更することで問題を解決しましたが、まだthnxです upvoteが原因で私はstackoverflowから禁止されることになりますがawsomeです –

-1

は、より多くのパラメータを追加します。

textfield = CreateWindow(L"STATIC", L"HELLO", 
         WS_VISIBLE | WS_CHILD | WS_BORDER, 
         300, 300, 100, 25, 
         hWnd, (HMENU)1, hInstance, NULL); 

少なくともhInstanceが重要です。

+0

'CS_GLOBALCLASS'スタイルで登録されたクラスでは、インスタンスハンドルは無視されます。 '' STATIC''コントロールのような標準コントロールはグローバルとして登録されます。この場合、 'nullptr'を渡すことは、他のインスタンスハンドルを渡すのと同じ効果があります。詳細については、[CreateWindowとRegisterClassに渡されたHINSTANCEは何ですか?](https://blogs.msdn.microsoft.com/oldnewthing/20050418-59/?p=35873)を参照してください。 – IInspectable

関連する問題