Управление рисовать в окне GDI - PullRequest
0 голосов
/ 20 мая 2011

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

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

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

Честно говоря, я думаю, что это может быть немного большим проектом для вас, чтобы начать его прямо сейчас.Возможно, вы захотите попробовать несколько более простых проектов, используя 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;
}

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

2 голосов
/ 20 мая 2011

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

...