2

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;
}

QtCreatorからコードを実行しているときにエラーは発生しません。ただし、実行するとウィンドウは表示されませんが、出力コンソールには次のように表示されます。

「MyProgram.exeはコード0で終了しました

これは何が原因でしょうか?

4

2 に答える 2

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
于 2012-03-19T04:09:01.710 に答える
1

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

たとえば、登録しておらず、実際のウィンドウを作成しておらず、表示しておらず、(@ rodrigoが述べたように)メッセージループがありません。MSDNのこの例は、すべてがどのようになるかを示しています。

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

于 2012-03-17T21:06:09.730 に答える