Нарисуйте прозрачную линию, используя родной Win32 GDI - PullRequest
0 голосов
/ 11 октября 2018

Я рисую линии, используя win32 gdi native apis.Теперь я хочу нарисовать линию как прозрачную.Я установил свойство альфа-канала в цвете.Однако настройка альфа-канала в цвете не делает линию прозрачной.Я читал об Alpha Blend Api, но не смог найти решение.

var hdc = g.GdiDeviceContext;
var srcHdc = CreateCompatibleDC(hdc);

var clipRegion = CreateRectRgn(x, y, x + width, y + height);

SelectClipRgn(hdc, clipRegion);

var pen = CreatePen(PenStyle.Solid, LineWidth, (uint)ColorTranslator.ToWin32(colour));



if (pen != IntPtr.Zero)
{
     var oldPen = SelectObject(hdc, pen);
     Polyline(hdc, points, points.Length);
     SelectObject(hdc, oldPen);
     DeleteObject(pen);
}

SelectClipRgn(hdc, IntPtr.Zero);
AlphaBlend(hdc, x, y, width, height, srcHdc, x, y, width, height, new BlendFunction(0x00, 0, 0x7f, 0x00));
DeleteObject(clipRegion);

Я пытаюсь нарисовать линию прозрачной.

1 Ответ

0 голосов
/ 12 октября 2018
var srcHdc = CreateCompatibleDC(hdc);

Это создает контекст устройства памяти.Это правильный первый шаг.Но память постоянного тока еще не готова.Также требуется растровое изображение памяти.

SelectObject(hdc, pen);
Polyline(hdc, points, points.Length);

Это будет отображаться в контексте устройства Windows.Но мы хотим нарисовать контекст устройства памяти, а затем нарисовать память в HDC, используя AlphaBlend

См. Пример ниже:

int w = 100;
int h = 100;

//create memory device context
var memdc = CreateCompatibleDC(hdc); 

//create bitmap
var hbitmap = CreateCompatibleBitmap(hdc, w, h);

//select bitmap in to memory device context
var holdbmp = SelectObject(memdc, hbitmap);

//begine drawing:
var hpen = CreatePen(0, 4, 255);
var holdpen = SelectObject(memdc, hpen);
Rectangle(memdc, 10, 10, 90, 90);

//draw memory device (memdc) context on to windows device context (hdc)
AlphaBlend(hdc, 0, 0, w, h, memdc, 0, 0, w, h, new BLENDFUNCTION(0, 0, 128, 0));

//clean up:
SelectObject(memdc, holdbmp);
SelectObject(memdc, holdpen);
DeleteObject(hbitmap);
DeleteObject(hpen);
DeleteDC(memdc);
...