Классическое приложение Windows, не выводит графику
В коде оконного приложения есть такой фрагмент для обработки сообщений.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rcTmp; // temporary rectangle
POINT ptClientUL; // client area upper left corner
POINT ptClientLR; // client area lower right corner
static HDC hdcCompat; // DC for copying bitmap
static POINT pt; // x and y coordinates of cursor
static RECT rcBmp; // rectangle that encloses bitmap
static RECT rcTarget; // rectangle to receive bitmap
static RECT rcClient; // client-area rectangle
static BOOL fDragRect; // TRUE if bitmap rect. is dragged
static HBITMAP hbmp; // handle of bitmap to display
static HBRUSH hbrBkgnd; // handle of background-color brush
static COLORREF crBkgnd; // color of client-area background
static HPEN hpenDot; // handle of dotted pen
crBkgnd = GetBkColor(hdc);
hbrBkgnd = CreateSolidBrush(crBkgnd);
ReleaseDC(hWnd, hdc);
hpenDot = CreatePen(PS_DOT, 1, RGB(0, 0, 0));
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
Rectangle(ps.hdc, rcBmp.left, rcBmp.top,
rcBmp.right, rcBmp.bottom);
StretchBlt(ps.hdc, rcBmp.left + 1, rcBmp.top + 1,
(rcBmp.right - rcBmp.left) - 2,
(rcBmp.bottom - rcBmp.top) - 2, hdcCompat,
0, 0, 32, 32, SRCCOPY);
for(int eow=0;eow<10;eow++)
SetPixel(hdc, 100+eow, 100-eow, RGB(12,20,40));
SetTextColor(hdc, 0x00FF0000); // синий цвет букв
TextOut(hdc, 10, 20, _T("=sin()"), 7);
// TODO: Добавьте сюда любой код прорисовки, использующий HDC...
EndPaint(hWnd, &ps);
return FALSE;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
И когда окно выводится, в нём нет ни одного графического элемента из case WM_PAINT:
.
Судя по отладке, сначала выполняется ShowWindow и UpdateWindow, затем указанные графические команды, а потом TranslateMessage и DispatchMessage. Закрытие окна обоими способами и вызов справки работают нормально.
Ответы (1 шт):
Автор решения: Максим Гаврилов
→ Ссылка
Прочитал комментарий, переместил ReleaseDC(hWnd, hdc);
, поместив перед EndPaint
, заработало.