2015-01-15 1 views
2

Мне нужно создать ID2D1SolidColorBrush и у меня есть указатель на ID2D1Brush. Я использую мой ID2D1HwndRenderTarget создать сплошной цвет кисти:Правильность ввода - ID2D1Brush to ID2D1SolidColorBrush (DirectX)

ID2D1Brush* brush = nullptr; 

myRenderTarget->CreateSolidColorBrush(color, 
       reinterpret_cast<ID2D1SolidColorBrush**>(&brush)); 

Приведенный выше код работает, но мне интересно, если reinterpret_cast является правильным выбором.

+0

Не можете ли вы просто изменить 'brush' на тип' ID2D1SolidColorBrush * 'вместо этого? MSDN говорит, что «ID2D1SolidColorBrush» наследует от «ID2D1Brush», поэтому вы все равно сможете использовать «кисть», как если бы это был указатель на базовый класс. – Praetorian

+1

Правильный способ - вернуть ID2D1SolidColorBrush ** обратно из вызова, а затем вызвать 'QueryInterface', чтобы получить другой интерфейс, а затем освободить интерфейс, который вы получили от вызова. – Mgetz

+0

@Praetorian Нет, я не могу. Я бы предпочел хранить 'ID2D1Brush', чтобы я мог разбирать различные кисти. – Nick

ответ

6

Вы должны использовать метод QueryInterface для получения любого другого интерфейса, который не является базовым интерфейсом того, который вы получаете. Кроме того, я предлагаю использовать некоторые интеллектуальные указатели COM, например _com_ptr_t или те, которые сгенерированы #import или CComPtr<>.

UPDATE

Хорошо, я вижу, что ID2D1SolidColorBrush inherits from ID2D1Brush. В этом случае, если я был бы вынужден не использовать смарт-указатели, я хотел бы использовать что-то вроде этого:

ID2D1SolidColorBrush * solid_brush = nullptr; 
myRenderTarget->CreateSolidColorBrush(color, &solid_brush); 
ID2D1Brush * brush = solid_brush; 

Определенно не использовать reinterpret_cast.

UPDATE

Не используйте dynamic_cast бросить обратно в производном интерфейсе. Вместо этого используйте QueryInterface. https://stackoverflow.com/a/1460850/341065 объясняет это немного.

+0

Я получаю исключение, если добавлю следующий код к вашему: 'solid_brush = dynamic_cast (brush);'. Пожалуйста, объясните, почему это происходит? – Nick

+0

@Nick: Я обновил ответ. – wilx

+0

Действительно, просто используйте один из упомянутых умных указателей COM. – wilx

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