Управление рисовать в окне GDI

Я использовал Visual Basic 6 в прошлом (LOONG ago), и у него был элемент управления, называемый PictureBox, в который можно было просто рисовать элементы, получать контекст устройства, если вы хотите, и т. Д. Я сейчас пытаюсь выяснить, как получить аналогичный "контроль" в чистом GDI/WinApi (без MFC, .net, atl, gdi+ и т. д.). Я использовал элемент управления для рисования владельцем, но вы не можете (легко) получить координаты мыши при нажатии, поэтому я подумал, что мне нужен какой-то другой элемент управления. Я попробовал статический элемент управления, но у него нет поддержки для рисования владельцем. Я попытался обработать WM_PAINT, но, насколько я знаю (после поисков в Google в течение нескольких часов), нет способа использовать его для обновления только одной области клиента или только одного HWND.

Итак, я спрашиваю, как люди оживляют или выделяют отдельные области окна, будь то элемент управления или что-то еще, используя чистый GDI и Windows API? Я знаю, что в MFC есть нечто, называемое подклассом, но поскольку MFC - это просто оболочка для Windows API, ОБЯЗАТЕЛЬНО ДОЛЖЕН БЫТЬ способ сделать это без него (также, как я говорил ранее, MFC не вариант).

2 ответа

Решение

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

Вам нужно будет создать собственный элемент управления. Использование существующего элемента управления для этого является плохой практикой, потому что это не то, как они были предназначены для использования. Чтобы создать пользовательский элемент управления, сначала необходимо создать класс окна с помощью WNDCLASSEX или WNDCLASS.

WNDCLASS: http://msdn.microsoft.com/en-us/library/ms633576
WNDCLASSEX: http://msdn.microsoft.com/en-us/library/ms633577

После того, как вы это сделаете и зададите все необходимые значения элементов, вы должны зарегистрировать класс с помощью RegisterClass или RegisterClassEx.

Один из членов объектов WNDCLASS(EX) принимает указатель на функцию оконной процедуры. Любое окно, созданное этим классом окна, будет использовать эту оконную процедуру.

Как только вы зарегистрируете свой класс окна, вы можете создать окно, используя класс окна, который вы создали. Просто сделайте CreateWindow(..., "ВАШЕ ОКНО КЛАСС ЗДЕСЬ", ...);

Теперь ваша оконная процедура должна выглядеть примерно так:

LRESULT CALLBACK MyDrawProcedure(HWND hwnd, UMSG uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
      case WM_PAINT:
      {
        // Handle painting your control here.
      }
      break;

      default:
         return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}

Ну, я надеюсь, это немного поможет.

Создайте дочернее окно и сделайте его роспись в своем WM_PAINT, Вызов InvalidateRect() когда вы хотите заставить перекрасить.

Другие вопросы по тегам