Пользовательский контроль CStatic
-
06-07-2019 - |
Вопрос
Я пытаюсь создать пользовательский элемент управления CStatic
в vc ++
, и у меня возникли некоторые проблемы.
Изначально я просто использовал элемент управления CStatic
со стилем SS_BLACKRECT
. Это было хорошо для ситуации, пока мне не нужно было отобразить изображение элемента управления по требованию.
Я выяснил всю логистику, лежащую в основе фактического рисования изображения на элементе управления, но я не могу понять, как это сделать, не мешая другим вещам.
В основном я хочу, чтобы элемент управления функционировал как обычный CStatic
со стилем SS_BLACKRECT
в большинстве случаев. Р>
Тогда мне нужно иметь возможность вызывать метод, который заставит его рисовать изображение поверх элемента управления. Я делаю рисование с использованием GDI
и пробовал его как в методе OnPaint ()
, так и в методе DrawItem ()
, но безуспешно. Я могу заставить его рисовать в OnPaint ()
, но когда я вызываю базу CStatic :: OnPaint ()
, он рисует поверх моего изображения. Р>
Мне нужно, чтобы он рисовался как обычно, но затем просто добавляю изображение сверху. Когда я попытался сделать это в методе DrawItem ()
, у меня возникла проблема, потому что, очевидно, он рисовал не в стиле SS_BLACKRECT
, а ждал, когда я отрисую элемент управления, как его должен.
Я думаю, что я ищу, это одна из трех вещей. Способ рисования с использованием GDI
после завершения базового метода OnPaint ()
. Способ заставить элемент управления рисовать стиль SS_BLACKRECT
по умолчанию, а затем OWNERDRAW
изображение впоследствии. Или код для имитации рисования SS_BLACKRECT
. Р>
Последний может быть самым простым, но я просто не знаю всех вещей, которые мне нужно настроить, чтобы нарисовать элемент управления CStatic
, такой как DrawItem по умолчанию. Р>
Решение
Попробуйте вызвать Default ()
в обработчике OnPaint ()
.
Затем, в зависимости от того, рисуете ли вы свое изображение, вы можете рисовать поверх стандартного элемента управления CStatic
.
Другие советы
Вот пара идей:
Если CStatic :: OnPaint ()
рисует поверх вашего изображения, попробуйте сначала вызвать его, а затем нарисовать изображение.
В противном случае, из того, что я мало видел в SS_BLACKRECT, вы сможете скопировать его рисунок, просто вызывая CDC :: FillSolidRect ()
, передавая прямоугольник вашего элемента управления, полученный через GetClientRect ()
и используя цвет, возвращаемый GetSysColor (COLOR_WINDOWFRAME)