ウィンドウは、wm_paintで作成された行が表示されていません

StackOverflow https://stackoverflow.com/questions/7377473

  •  28-10-2019
  •  | 
  •  

質問

私はこの領域にちょっと新しいので、次のコードを作成しました。私が理解している限り、wm_paintで行を作成していますが、ウィンドウが表示されていないため、この行が表示されません。全て。 2秒ごとにwm_paintを呼び出すスレッドがありますが、プログラムを実行してから何も表示されません。

Advancedに感謝します。

#include <windows.h>
#include <stdio.h>

DWORD WINAPI StartThread1(LPVOID LPElm); 

//---------------------------------------------------------------------------
HWND hWnd;
LPCTSTR ClsName = L"WndMsg";
LPCTSTR WindowCaption = L"Windows and Controls Messages";
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
    MSG         Msg;
    WNDCLASSEX  WndClsEx;

    WndClsEx.cbSize        = sizeof(WNDCLASSEX);
    WndClsEx.style         = CS_HREDRAW | CS_VREDRAW;
    WndClsEx.lpfnWndProc   = WndProc;
    WndClsEx.cbClsExtra    = NULL;
    WndClsEx.cbWndExtra    = NULL;
    WndClsEx.hInstance     = hInstance;
    WndClsEx.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    WndClsEx.hCursor       = LoadCursor(NULL, IDC_ARROW);
    WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClsEx.lpszMenuName  = NULL;
    WndClsEx.lpszClassName = ClsName;
    WndClsEx.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&WndClsEx);

    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                          ClsName,
                          WindowCaption,
                          WS_OVERLAPPEDWINDOW,
                          100,
                          120,
                          640,
                          480,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    DWORD ThreadId1, ThreadId2;
    HANDLE HandleThread1 = CreateThread(0,0,StartThread1,0,0,&ThreadId1);

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

    return Msg.wParam;
}

//---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
        HDC hDC;
    PAINTSTRUCT Ps;
    switch(Msg)
    {
    case WM_CREATE:
    //MessageBox(NULL, L"The window is being created", WindowCaption, MB_OK);
    break;
    case WM_SHOWWINDOW:
        break;

    case WM_PAINT:
    hDC = BeginPaint(hWnd, &Ps);
    MoveToEx(hDC, 0, 0, NULL);
    LineTo(hDC, 10, 10);
    EndPaint(hWnd, &Ps);

    break;

    case WM_DESTROY:
        PostQuitMessage(WM_QUIT);
        break;
    default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    return 0;
}
//---------------------------------------------------------------------------


DWORD WINAPI StartThread1(LPVOID LPElm)
{
    int n = 5000,i,j;

    for (i=0; i<n; i++)
    {
        SendMessage(hWnd,WM_PAINT,NULL,NULL);
        Sleep(2000);
        /*for (j=0;j<10;j++)
            a[j] = (rand() % 100);
        printf("\n");*/
    }

    return 0;
}
役に立ちましたか?

解決

あなたは送るべきではありません WM_PAINT あなた自身。使用する必要があります InvalidateRect. 。描く必要もあります 何かで - 使用する必要があります SelectObject 有効なPENオブジェクトをDCに選択します。

他のヒント

WM_PAINT ウィンドウが再描画されたときにメッセージがシステムによって送信されるため、メッセージを自分で送信する必要はありません。ウィンドウの使用を再描画する場合 InvalidateRect. 。使用する場合 Thread プログラムでは、スレッドを終了する必要があります ExitProcess(ThreadID), 、次のコードが実行されます。ペンのデフォルトの色は黒いので、あなたはそれを見ることができます。あなたの場合、あなたのスレッドは終了しなかったので、プログラムはそこで停止します。窓がペイントすることはありません。使用できます MessageBox() あなたのプログラムでは、今どこで実行されているかをテストします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top