ウィンドウは、wm_paintで作成された行が表示されていません
質問
私はこの領域にちょっと新しいので、次のコードを作成しました。私が理解している限り、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()
あなたのプログラムでは、今どこで実行されているかをテストします。
所属していません StackOverflow