Почему функция createpolygonrgn() терпит неудачу?
Поэтому я пытаюсь создать цифровые часы, используя только WinAPI с C++ (см. скриншот)[^]
Функция drawDash() вызывается 7 раз, чтобы нарисовать одну цифру. я использую таймер, который перерисовывает цифры каждые 100 миллисекунд.
Все выглядит нормально, но по какой-то причине функция CreatePolygonRgn() начинает отказывать после определенного количества вызовов. Вот код, где все происходит:
void drawDash(HWND hwnd, const RECT& rect, UINT color) // this RECT is {left, top, width, height}!!! { // define some variables... HDC hdc = GetDC(hwnd); int trLen = min(rect.right, rect.bottom) *0.5; // ◣ length of this triangle (there will be 4 of them) bool bHorizontal = rect.right > rect.bottom; // should we rotate the thing? // make clipping rgn that will make rgn look like a dash in digit clock POINT pointsVert[] = { trLen, 0, trLen *2, trLen, trLen *2, rect.bottom -trLen, trLen, rect.bottom, 0, rect.bottom -trLen, 0, trLen}; POINT pointsHorz[] = { trLen, 0, rect.right -trLen, 0, rect.right, trLen, rect.right -trLen, rect.bottom, trLen, rect.bottom, 0, trLen }; POINT *ptArray = bHorizontal ? pointsHorz : pointsVert; // draw colored rgn! HRGN hrgnClip = CreatePolygonRgn(&ptArray[0], sizeof(pointsHorz) / sizeof(pointsHorz[0]), ALTERNATE); static int timesCalled = 0; // fails exactly at 9989-th time timesCalled++; OffsetRgn(hrgnClip, rect.left, rect.top); FillRgn(hdc, hrgnClip, CreateSolidBrush(color)); DeleteObject(SelectObject(hdc, GetStockObject(WHITE_BRUSH))); ReleaseDC(hwnd, hdc); DeleteObject(hrgnClip); }
Что я уже пробовал:
Так что CreatePolygonRgn() начинает давать сбой именно при 9989-м вызове. Он возвращает 0, поэтому после этого ничего не рисуется. я попробовал GetLastError(), но он возвращает 0 (документация msdn CreatePolygonRgn() не говорит, что я могу использовать GetLastError() для получения кода ошибки).
у меня было две одинаковые точки в массивах - документация говорит, что "каждая вершина может быть указана только один раз", поэтому я удалил их, но это ничего не изменило.
Gerry Schmitz
Вы указываете ptArray на разные массивы в разное время; но CreatePolygonRgn жестко закодирован в один.
Avtem
Но он меняет массивы, вы можете видеть это на скриншоте