La fenêtre ne montre pas la ligne fabriquée dans wm_paint
Question
Je suis un peu nouveau dans ce domaine, donc .. J'ai fait le code suivant, pour autant que je comprends, dans WM_PAINT, je crée une ligne, mais je ne vois pas cette ligne, car la fenêtre ne s'affiche pas à tout. J'ai un fil qui appelle wm_paint toutes les 2 secondes, mais chaque fois, rien n'est affiché une fois exécuté le programme.
Merci d'avance.
#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;
}
La solution
Tu ne devrais pas envoyer WM_PAINT
toi-même. Vous devez utiliser InvalidateRect
. Vous devez également dessiner avec quelque chose - Vous devez utiliser SelectObject
Pour sélectionner un objet Pen valide dans le CC.
Autres conseils
WM_PAINT
Le message est envoyé par le système lorsque la fenêtre est redessinée, vous n'avez donc pas besoin d'envoyer le message vous-même. Si vous souhaitez redessiner la fenêtre Utiliser InvalidateRect
. Si tu utilises Thread
Dans votre programme, vous devez quitter le fil avec ExitProcess(ThreadID)
, alors le code suivant est exécuté. La couleur par défaut du stylo est noire, vous pouvez donc le voir. Dans votre cas, votre fil ne sortait pas, donc le programme s'arrête là. La fenêtre ne va jamais peindre. Vous pouvez utiliser MessageBox()
dans votre programme pour tester où fonctionne maintenant.