C++ линия, нарисованная через HDC LineTo(), мерцает

130
02 июля 2019, 09:00

При запуске, программа должна рисовать короткую линию по середине экрана (Поверх всех программ). Линия рисуется, все хорошо, но очень сильно мерцает. Как решить проблему?

Вот код:

#include <iostream>
#include <windows.h>
#include <winuser.h>
#include <stdio.h>

using namespace std;
int main() {
    int y = 0;
    int x = 0;
    int xs = 0;
    int ys = 0;
    RECT desktop;
    const HWND hDesktop = GetDesktopWindow();
    GetWindowRect(hDesktop, &desktop);
    x = desktop.right / 2;
    y = desktop.bottom / 2 - 2;
    xs = desktop.right / 2 - 2;
    ys = desktop.bottom / 2;
    HPEN pen = CreatePen(PS_SOLID, 8, RGB(255, 0, 0));
    HDC dot = ::GetDC(0);
    for (;;) {
        SelectObject(dot, pen);
        MoveToEx(dot, x, y, NULL);
        LineTo(dot, x, y + 4);
        Sleep(10);
    }
}
Answer 1

Цикл не нужен, Вы постоянно перерисовываете линию, поэтому она и мерцает. Достаточно нарисовать линию и остановить выполнение программы. Также важно освобождать ресурсы.

HPEN op = (HPEN)SelectObject(dot, pen);
//for (;;) 
{
    MoveToEx(dot, x, y, NULL);
    LineTo(dot, x, y + 40); // 
    //Sleep(10);
}
SelectObject(dot, op);
DeleteObject (pen);
ReleaseDC (0, dot);
getchar();

Ну и конечно, как только произойдет перерисовка, то линия затрется. Именно поэтому лучше создать прозрачное окно и перерисовывать линию по событию WM_PAINT окна. В этом случае линия будет перерисовываться, когда приложение будет становится активным.

READ ALSO
Оператор эквивалентности &lt;=&gt;

Оператор эквивалентности <=>

Увидел недавно оператор <=> в чужом коде и испытал культурный шокЧто за зверь, что он делает и когда использовать?

134
Switch quantity on integer | *** wasnt declared in this scope

Switch quantity on integer | *** wasnt declared in this scope

Не первый раз ошибка *** wasnt declared in this scope, так и не могу понять в чем дело

126
Как узнать размер массива переданного в функцию?

Как узнать размер массива переданного в функцию?

Необходимо определить размер массива, переданного в функциюПробовал вот так:

127
Интегральные типы

Интегральные типы

Почему конструкция switch case работает только с интегральными типами, и что вообще такое интегральные типы?

129