Могу ли я создать контекст устройства, который является лишь частью контекста другого устройства?

StackOverflow https://stackoverflow.com/questions/4551280

  •  13-10-2019
  •  | 
  •  

Вопрос

Я подключил графический элемент управления, который принимает контекст устройства, HDC, в качестве ввода и использует это для рисования. Мой новый элемент управления - это только оригинальный элемент управления, центрированный поверх большего изображения. Я хотел бы иметь возможность назвать исходный метод Draw Control's Draw () для повторного использования кода, но я не уверен, как продолжить.

Вот идея:

void CCheckBox::DrawCtrl( HDC hdc, HDC hdcTmp, LPSIZE pCtlSize, BYTE alpha ) {
    // original method draws a checkbox
}

void CBorderedCheckBox::DrawCtrl( HDC hdc, HDC hdcTmp, LPSIZE pCtlSize, BYTE alpha ) {
    // Draw my image here
    // Create new hdc2 and hdcTemp2 which are just some portion of hdc and hdcTemp
    //   For example, hdc2 may just be a rectangle inside of hdc that is 20 pixels 
    //   indented on all sides.
    // Call CCheckBox::DrawCtrl() with hdc2 and hdcTemp2
}
Это было полезно?

Решение

Я думаю, что вы можете быть смущены тем, что такое контекст устройства. Контекст устройства - это место в памяти, на которое вы можете нарисовать, будь то буфер экрана, растровый карту или что -то еще. Поскольку я представляю, вы хотите только рисовать на экране, вам нужен только один DC. Чтобы выполнить то, что вы хотите, я бы порекомендовал перенести прямоугольник к функции, которая говорит ей, где рисовать. При желании, и с более низкой производительностью вы можете создать новую растровую карту для меньшей области и дать функции DC Bitmap DC. Теперь, когда я думаю об этом, это могло быть тем, что вы имели в виду в первую очередь: P Удачи!

Другие советы

Хотя это и не надежный, вы можете подделать DC в качестве подраздела DC, используя комбинацию SetViewPortorgex а также SelectObject с регионом, подрезанной до подставной зоны.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top