Pregunta

Soy un poco nuevo en esta área, así que ... Hice el siguiente código, por lo que entiendo, en wm_paint estoy creando una línea, sin embargo, no puedo ver esta línea, porque la ventana no se muestra en todos. Tengo un hilo que llama a WM_Paint cada 2 segundos, pero cada vez que nada se muestra una vez que ejecuta el programa.

gracias de antemano.

#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;
}
¿Fue útil?

Solución

No deberías enviar WM_PAINT tú mismo. Necesitas usar InvalidateRect. También necesitas estar dibujando con algo - Necesitas usar SelectObject Para seleccionar un objeto PEN válido en el DC.

Otros consejos

WM_PAINT El sistema envía el mensaje cuando la ventana está redactada, por lo que no necesita enviar el mensaje usted mismo. Si quieres volver a dibujar la ventana. InvalidateRect. Si utiliza Thread En su programa, debe salir del hilo con ExitProcess(ThreadID), entonces se ha ejecutado el siguiente código. El color predeterminado para el bolígrafo es negro, por lo que puede verlo. En su caso, su hilo no salió, por lo que el programa se detiene allí. La ventana nunca va a pintar. Puedes usar MessageBox() en su programa para probar dónde se está ejecutando ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top