h

[戻る]
初心者 2007/02/10(土) 10:15:53
#include <windows.h>
unsigned int num;

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {

    HDC hdc;
    PAINTSTRUCT ps;
    static TCHAR str[64];

    switch (msg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
        
    case WM_PAINT:
        hdc = BeginPaint(hwnd , &ps);
        wsprintf(str , "%d" , num);
        TextOut(hdc , 10 , 10 , str , lstrlen(str));
        EndPaint(hwnd , &ps);
    }
    return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
            PSTR lpCmdLine , int nCmdShow ) {
    HWND hwnd;
    MSG msg;
    WNDCLASS winc;

    winc.style        = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc    = WndProc;
    winc.cbClsExtra    = winc.cbWndExtra    = 0;
    winc.hInstance        = hInstance;
    winc.hIcon        = LoadIcon(NULL , IDI_APPLICATION);
    winc.hCursor        = LoadCursor(NULL , IDC_ARROW);
    winc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winc.lpszMenuName    = NULL;
    winc.lpszClassName    = TEXT("KITTY");

    if (!RegisterClass(&winc)) return -1;

    hwnd = CreateWindow(
            TEXT("KITTY") , TEXT("Kitty on your lap") ,
            WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
            CW_USEDEFAULT , CW_USEDEFAULT ,
            CW_USEDEFAULT , CW_USEDEFAULT ,
            NULL , NULL , hInstance , NULL
    );

    if (hwnd == NULL) return -1;

    while (TRUE) {
        if (PeekMessage(&msg , NULL , 0 , 0 , PM_REMOVE)) {
            if(msg.message == WM_QUIT) break;
            DispatchMessage(&msg);
        }
        else {
            num++;
            InvalidateRect(hwnd , NULL , FALSE);
        }
    }
            
    return msg.wParam;
}

初心者 2007/02/10(土) 10:33:11
すいません。確認中、送信を押しました。



1 WNDCLASS構造体の初期化
2  RegisterClass()、構造体を登録
3  CreateWindowで、ウインドウ生成

次から解らないのですが、

4   while文からウインドウプロシージャへ?
5   WM_PAINTで文字描画。


このプログラムの流れが見えないのですが、教えてください。


特にどのタイミングで、PeekMessage()の
else{num++; InvalidateRect()}文が呼び出されのか教えてください。

お願いします。

ITO 2007/02/10(土) 13:19:52
ん? MFCを使っていた人ですか?

改めてSDKを使ってみるならば、書籍の購入を進めます。

普通に「新規作成」の「Win32 Aplication」を選択すればMFC同様
ある程度動かすことの出来るソースコードを作成してくれます。

VCは、6.0でしたっけ?
VC6.0場合は、「標準的なhalloアプリケーション」を選択します。
そこで作成されるソースコードをみて流れを掴んでみてください。

詳しくは、書籍を読んでみたらどうですか。
サイトで学ぶよりいいです。

Kerry 2007/02/10(土) 16:53:39
> 4   while文からウインドウプロシージャへ?

これに関しては、DispatchMessage()が大雑把以下のような実装になっている
と言えば理解できますでしょうか。

LONG WINAPI DispatchMessage(const MSG * msg)
{
    WNDPROC proc = (WNDPROC)GetClassLong(msg->hwnd, GCL_WNDPROC);
    return (*proc)(msg->hwnd, msg->message, msg->wParam, msg->lParam);
}

Ban 2007/02/10(土) 17:27:13
# http://forums.belution.com/ja/cpp/000/064/54.shtml
# このような質問の仕方を「マルチポスト」といいます。
# http://rararahp.cool.ne.jp/cgi-bin/lng/lng.htm

wclrp ( 'o') 2007/02/10(土) 17:30:58
> 特にどのタイミングで、PeekMessage()の
> else{num++; InvalidateRect()}文が呼び出されのか教えてください。

PeekMessageが0を返したとき。
というかmsdnなどヘルプや説明を見たら。

古いスレッドには追加発言できません。