Как не отказаться от пути CDC? - PullRequest
0 голосов
/ 23 октября 2009

Я рисую некоторые символы, которые принадлежат определенным объектам, в контексте устройства и теперь хочу иметь возможность позже проверить, находится ли курсор мыши над таким символом.

Для этого я планировал сначала создать путь CDC и использовать его для создания CRgn объекта региона.

pDC->BeginPath();
pDC->Ellipse(ellipse[0], ellipse[1], ellipse[2], ellipse[3]); // Create path only
pDC->EndPath();

// Actually draw the ellipse
pDC->StrokeAndFillPath(); // Apparently removes the path from the DC

CRgn region;
if (region.CreateFromPath(pDC)) // Would also remove the path from the DC
{
    // We never get here :-/

    // Here I would copy the region's data,
    // attach it to the object being drawn and
    // destroy the region.
    // That way I can create a region later on and do the hit-testing.
}

Как я могу использовать путь для рисования и создания области без необходимости рисовать дважды? Рисование вдвое в значительной степени удваивает время, затрачиваемое на мой метод рисования, чего я бы хотел избежать.

1 Ответ

1 голос
/ 23 октября 2009

region.CreateFromPath до вызова StrokeAndFillPath. Это сохраняет путь как регион - тогда вы можете StrokeAndFillPath, а после этого использовать регион.

Редактировать: Упс, совершенно верно. К счастью, кажется, что есть и способ обойти эту проблему: хотя в документации об этом прямо не говорится, похоже, что SaveDC / RestoreDC сохраняет и восстанавливает путь вместе с другими «вещами», поэтому вы можете сделать что-то вроде:

pDC->BeginPath();
pDC->Ellipse(ellipse[0], ellipse[1], ellipse[2], ellipse[3]);
pDC->EndPath();

int dc_id = pDC->SaveDC();

pDC->StrokeAndFillPath();

pDC->RestoreDC(dc_id);

CRgn region;
if (region.CreateFromPath(pDC))
{
            // Now we do get here...
    MessageBox(L"Region Created");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...