2009-10-23 2 views
0

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

Для этого мой план состоял в том, чтобы сначала создать путь 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

район.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"); 
} 
+0

Не работает здесь (VC9) ... MSDN говорит: «После того, как CreateFromPath преобразует путь в область, Windows отбрасывает закрытый путь из контекста устройства». – foraidt

+0

Я не уверен, что вы автоматически уведомлены об изменениях, но на всякий случай, если вы этого не сделаете, посмотрите на отредактированный ответ. –

+0

Хорошо, теперь это работает. Но сохранение и восстановление состояния постоянного тока, по-видимому, также требует много времени. Я не вижу увеличения производительности по сравнению с чертежом дважды. (Если вы хотите числа: длительность моего теста варьируется от 180 мс до 200 мс в обоих случаях, где метод сохранения/восстановления выглядит немного медленнее.) – foraidt

 Смежные вопросы

  • Нет связанных вопросов^_^