Я использую Embarcadero RAD Studio C ++ Builder XE7.
Для функции рисования с использованием Windows GDI мне нужно добавить область клипа в контекст устройства холста.
Протестировав мой код, я заметил, что иногда область отсечения была меньше ожидаемого размера.Я искал почему и обнаружил странное поведение функции OffsetRgn (), которая позволяет мне немного озадачиться.
Чтобы применить область клипа, я использую код, подобный следующему:
std::unique_ptr<TBitmap> pBitmap(new TBitmap());
pBitmap->PixelFormat = pf32bit;
pBitmap->AlphaFormat = afDefined;
pBitmap->SetSize(60, 7);
TCanvas* pCanvas = pBitmap->Canvas;
::SelectClipRgn(pCanvas->Handle, NULL);
const TRect sourceRect = pCanvas->ClipRect;
HRGN pClipRegion = ::CreateRectRgn(50, -2, 60, 8);
::SelectClipRgn(pCanvas->Handle, pClipRegion);
const TRect intermediateRect = pCanvas->ClipRect;
const int deltaX = pCanvas->ClipRect.Left - 50;
const int deltaY = pCanvas->ClipRect.Top - (-2);
::OffsetRgn(pClipRegion, -deltaX, -deltaY);
::SelectClipRgn(pCanvas->Handle, pClipRegion);
const TRect finalRect = pCanvas->ClipRect;
ПРИМЕЧАНИЕ написано так и вне его контекста, приведенный выше код на самом деле не имеет смысла, и я знаю, что это нелогично.Пожалуйста, не судите о его качестве, это не цель моего вопроса.Я собрал несколько отрывков, которые я сгруппировал в исполняемый код для постановки проблемы.
Жестко закодированные значения являются примером значений, которые я получаю в своем приложении при возникновении проблемы.Если я выполняю приведенный выше код, я измеряю:
- left = 0, top = 0, right = 60, bottom = 7 в значении sourceRect
- left = 50, top = 0, справа = 60, снизу = 7 в промежуточном значении Rect
- слева = 50, сверху = 0, справа = 60, снизу = 6 в окончательном виде
Iоднако ожидается, что нижнее значение также должно быть равно 7 в finalRect, который является пределом холста, поскольку я только переместил регион и ничего больше.Так почему же его значение внезапно стало меньше ожидаемого?