2012-03-17 20 views
2

私はWinAPIの使用については初心者です。私はコードスニペットを見つけたチュートリアルに従っています。スニペットは、基本的なプログラムを示しています。Qt Creatorの私の最初のWinAPIプログラムはウィンドウを表示しませんか?

#include "a.h" 
#include "windows.h" 

LRESULT CALLBACK WndProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    WNDCLASSEX WndClsEx; 
    WndClsEx.cbSize  = sizeof(WNDCLASSEX); 
    WndClsEx.style  = CS_HREDRAW | CS_VREDRAW; 
    WndClsEx.lpfnWndProc = WndProcedure; 
    WndClsEx.cbClsExtra = 0; 
    WndClsEx.cbWndExtra = 0; 
    WndClsEx.hInstance = hInstance; 

    return 0; 
} 

LRESULT CALLBACK WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Msg) 
    { 
    case WM_DESTROY: 
     PostQuitMessage(WM_QUIT); 
     break; 
    default: 
     return DefWindowProc(hWnd, Msg, wParam, lParam); 
    } 
    return 0; 
} 

Qt Creatorからコードを実行する際にエラーは発生しません。しかし、それを実行するときに、何のウィンドウが表示されていないが、出力コンソールには示しています

がこれを引き起こす可能性がありますどのような

「myprogram.exeというコード0で終了しましたか」?

+1

これはQTプログラムではありません。これはネイティブのWin32プログラムでもなく、あまりにも多くのコードがありません。あなたはRTFMする必要があります。 –

+0

万が一「Qt Creator」を意味しましたか?では、使用しているIDEと同じですか? Qtと「Qt Creator」は2つの異なるものですから。そして、Hansが言っているように、表示しているコードはQtとは関係ありません。 – Bart

+0

クイック返信ありがとう...私は実際に何をすべきかわかりません。Qt SDKを使用しています。Qtの作成者はここに埋め込まれた部分です。私はQTを使用してwinapiプログラミングをしたいです。それは可能ではありませんか?親切に私に何かを提案してもらえますか? –

答えて

3

私は以下の私の完全なコードを掲示しています:

をあなたのコードは、標準のWin32のようにたくさん見えるが、それは多くのコードが含まれていません。

たとえば、この非常に単純なTEST.CPPファイルは、完全な作業Win32アプリケーション含まれています。それは、コマンドラインからコンパイルしてリンクすることができ

#define STRICT 
#include <windows.h> 

long PASCAL WndProc (HWND, UINT, WPARAM, LPARAM); 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPSTR lpszCmdParam, int nCmdShow) 
{ 
    static char szClassName[] = "Hello World"; 
    MSG   msg; 
    WNDCLASS wndclass; 

    memset(&wndclass, '\0', sizeof(wndclass)); 

    wndclass.style   = CS_HREDRAW|CS_VREDRAW; 
    wndclass.lpfnWndProc = WndProc; 
    wndclass.cbClsExtra  = 0; 
    wndclass.cbWndExtra  = 0; 
    wndclass.hInstance  = hInstance; 
    wndclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION); 
    wndclass.hCursor  = LoadCursor (NULL, IDC_ARROW); 
    wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH); 
    wndclass.lpszMenuName = 0; 
    wndclass.lpszClassName = szClassName; 
    RegisterClass (&wndclass); 

    // create a new window 
    HWND hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, 
           szClassName, 
           "My Hello World Window", 
           WS_OVERLAPPEDWINDOW, 
           CW_USEDEFAULT, 
           CW_USEDEFAULT, 
           CW_USEDEFAULT, 
           CW_USEDEFAULT, 
           NULL, 
           NULL, 
           hInstance, 
           NULL); 

    ShowWindow (hwnd, nCmdShow); 

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

    return msg.wParam; 
} 

long APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) { 
     case WM_DESTROY: 
      PostQuitMessage (0); 
      return 0; 
    } 

    return DefWindowProc (hwnd, message, wParam, lParam); 
} 

を:

C:\TEMP>cl test.cpp user32.lib gdi32.lib 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

test.cpp 
Microsoft (R) Incremental Linker Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:test.exe 
test.obj 
user32.lib 
gdi32.lib 

test.exeを実行すると、ウィンドウが表示されます。

C:\TEMP>test.exe 
+1

種類のスニペットありがとう。 –

1

Hans Passantが彼のコメントで示唆しているように、多くのコードがありません。どのチュートリアルからこのスニペットをコピーしたのか分かりませんが、もっとコードが必要です。

たとえば、registered itでもcreated the actual windowでもない場合は、showing itではなく、(@rodrigoで述べたように)メッセージループがありません。 This example on MSDNは、そのすべてがどのように見えるかを示しています。

はい、実際にQtをユーザインタフェースに使用しなくても、Qt Creatorで完全にアプリケーションを開発できます。しかし私はそれを却下しません。あなたが自由に使えるツールをすべて持っているので、Qt自体も見てください。あなたはそれが好きかもしれません。

+1

そして最も重要なことに、彼は_メッセージループを持っていません。それがなければ、たとえ彼が他のすべてのことをしたとしても、その直後にプログラムが終了し、ウィンドウが消えてしまいます。 – rodrigo

+0

@rodrigoああ、私がリンクしている例では暗黙のうちに言及しておきます。私はそれを追加しました。 – Bart

+0

はい、あなたは正しいです。私はたくさんのコードを見逃しています。後で、実際にチュートリアルに存在するものがいくつか見つかっています。ありがとうございました。 –

関連する問題