WinAPI CreatePen() не правильно рисует линию

Здравствуйте.
И снова что-то неведанное просходит :dizzy_face:
Хочу нарисовать жёлтую линию

void DrawLine(HDC dc, int x1, int y1, int x2, int y2)
{
    MoveToEx(dc, x1, y1, nullptr);
    LineTo(dc, x2, y2);
}

void DrawRay(HDC dc, Ray ray, double rayLength)
{
    Vec2 rayFinish = ray.origin + VectorMultipleScalar(ray.direction, rayLength);
    DrawLine(dc, (int)ray.origin.x, (int)ray.origin.y, (int)rayFinish.x, (int)rayFinish.y);
}
            HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
            if (pen)
            {
                SelectObject(dcMem, pen);
                DrawRay(dcMem, reflectedRay, rayLength);
                DeleteObject(pen);
            }

Если стоит PS_SOLID, то линия не рисуется. Если ставить PS_DASH или PS_DOT, то рисуется, но не жёлтым, а белым.
Это почему так?
Даже если делать HPEN pen = CreatePen(PS_DOT, 1, RGB(0, 0, 0)), то рисует белую линию :man_facepalming:
Зачем тогда нужен последний параметр и как поменять цвет?
Меняется только так:

SelectObject(dcMem, GetStockObject(WHITE_PEN));
//или
SelectObject(dcMem, GetStockObject(BLACK_PEN))

А как свой цвет поставить?

Я понял. Я брал DC своей панели, а надо было DC рабочего стола. Иначе, там что-то сглубиной цвета не сходится.


        HWND w = GetDesktopWindow();
        HDC dc0 = GetDC(w);
        HDC dcMem = CreateCompatibleDC(dc0);
        HBITMAP bmpMem = CreateCompatibleBitmap(dc0, .....);

Но почему нельзя брать DC своего static’a, на котором рисуешь? :thinking: У него же, по-идее, глубина цвета такая же, как у рабочего стола.

Теперь цвет меняется, но линия всегда сплошная. Как сделать PS_DOT или PS_DASH?

Может ширина не 1 сейчас?

CreatePen function (wingdi.h) - Win32 apps | Microsoft Docs

This style is valid only when the pen width is one or less in device units.


А зачем рисовать через винапи?) Есть же куча более удобных вариантов.

Я знаю. Ширина = 1.

Когда я пишу тестовые примеры, то всегда делаю это на WinAPI. Потому что это исключает влияние сторонних библиотек. А потом уже адаптирую код туда, куда надо.

И вообще линия какая-то странная.


Она жёлтая с белыми точками :thinking:

Вот код из другого проекта:

void RenderScene(HDC dc)
{
    RECT r;
    if (GetClientRect(hPanelRender, &r))
    {
        HDC dcMem = CreateCompatibleDC(dc);
        if (!dcMem) 
        {
            return;
        }

        //bitmap для двойной буферизации
        HBITMAP bmpMem = CreateCompatibleBitmap(dc, r.right, r.bottom);
        if (!bmpMem) 
        {
            DeleteDC(dcMem);
            return;
        }
        //связываем созданный bitmap с DC
        SelectObject(dcMem, bmpMem);

        FillRect(dcMem, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

        SelectObject(dcMem, (HPEN)GetStockObject(WHITE_PEN));

        for (size_t i = 0; i < circles.size(); i++)
        {
            HBRUSH brush = CreateSolidBrush(circles[i].color);
            if (brush)
            {
                SelectObject(dcMem, brush);
                DrawCircle(dcMem, (int)circles[i].position.x, (int)circles[i].position.y, (int)circles[i].radius);
                DeleteObject(brush);
            }
        }

        HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
        SelectObject(dcMem, pen);
        Vec2 pt;
        for (size_t i = 0; i < rays.size(); i++)
        {
            if (GetClosestIntersectionPoint(rays[i], circles, pt))
            {
                double len = VectorsDistance(rays[i].origin, pt);
                DrawRay(dcMem, rays[i], len);
                SelectObject(dcMem, (HBRUSH)GetStockObject(WHITE_BRUSH));
                DrawCircle(dcMem, (int)pt.x, (int)pt.y, 5);
            }
            else
            {
                //DrawRay(dcMem, rays[i], 300.0);
            }
        }
        DeleteObject(pen);
        
        BitBlt(dc, 0, 0, r.right, r.bottom, dcMem, 0, 0, SRCCOPY);
        DeleteDC(dcMem);
        DeleteObject(bmpMem);
    }
}
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(wnd, &ps);

            HDC dc = GetDC(hPanelRender);
            RenderScene(dc);
            ReleaseDC(hPanelRender, dc);

            EndPaint(wnd, &ps);
            break;
        }

Здесь оно просто берёт и работает. Жёлтая линия правда жёлтая. И никакого рабочего стола ему не надо.
В чём разница между этим кодом и предыдущим, кроме названия функции?

Так проблема ж вроде с DC была

Надо весь код смотреть, в первом непонятно откуда DC был.