c - прямоугольник win32 api не рисуется, если hdc передается методу - PullRequest
2 голосов
/ 10 февраля 2011

Я недавно играл с C и win32, и мне отказали следующие:

     case WM_PAINT:
         g_crntRect = (RECT*) malloc(sizeof(RECT));
         GetWindowRect(hwnd, g_crntRect);

         hpen = CreatePen(PS_SOLID, 1, RGB(255,25,5));

         hdc = BeginPaint (hwnd, &ps) ;

         oldPen = SelectObject(hdc, hpen);
         drawRects(hwnd, hdc);
         //Rectangle(hdc, 0, 0, 840, 525);

         SelectObject(hdc,oldPen);
         DeleteObject(hpen);

         EndPaint (hwnd, &ps) ;
         return 0 ;

Итак, если я вызову свой собственный метод выше для рисования прямоугольников, он ничего не рисует, однако вызов рисоватьпрямоугольник в WM_PAINT, который я прокомментировал выше, успешно работает без проблем.

Вот мой метод:

BOOL drawRects(HWND hwnd, HDC hdc)
{

char buffer[50];
BOOL res = FALSE;
RECT tempRect = {0};
char quadStr[6] = "";
int i = 0;
quadStr[i]='*';
OutputDebugString("Going to draw");
for (i = 1; i <= 4; i++)
{
    //get rect for each quadrent from the parent
    OutputDebugString("inside for");
    getRect(g_crntRect, &tempRect, i);

    OutputDebugString("got rectr");;
    res = Rectangle(hdc, tempRect.right, tempRect.top, tempRect.right, tempRect.bottom);

    if (res == FALSE)
    {
        OutputDebugString("false");;
        sprintf(buffer, "Error: %ld", GetLastError());
        OutputDebugString(buffer);
    }
    else
    {
        OutputDebugString("drew");;
    }

    quadStr[i]='*';
    printRect(quadStr, &tempRect);
}

return TRUE;

}

Глядя на выходные данные отладки, все выглядит нормально,Правильные значения передаются в метод Rectangle.Тем не менее, мне интересно, правильно ли я пропускаю HDC?

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2011

Изменить

BOOL drawRects(HWND hwnd, HDC* hdc)

на

BOOL drawRects(HWND hwnd, HDC hdc)

Дескриптор Windows на самом деле является указателем, поэтому нет необходимости передавать его по ссылке.Но если вы это сделаете, вам нужно будет вызвать вашу функцию как drawRects(hwnd, &hdc);

3 голосов
/ 11 февраля 2011

Похоже на простую опечатку. В вашем методе у вас есть:

res = Rectangle(hdc, tempRect.right, tempRect.top, tempRect.right, tempRect.bottom);

Второй параметр должен быть tempRect.left, а не tempRect.right. Вы пытаетесь нарисовать прямоугольник нулевой ширины.

1 голос
/ 10 февраля 2011

Как правило, вы не рисуете вне обработчика WM_PAINT. Если вы хотите, чтобы ваше окно обновлялось, просто вызовите InvalidateRect для области, которую вы хотите перерисовать Это вызовет вызов WM_PAINT, который затем перекрасит окно.

Есть ли причина, по которой вам нужно рисовать окно за пределами обработчика рисования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...