155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 759
1

Рисование полупрозрачного прямоугольника на прозрачном окне

04.01.2021, 21:43. Показов 5040. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую. Моя цель это рисование чего-либо непрозрачного (или полупрозрачного) на полностью прозрачном окне. С созданием окна проблем у меня не возникло, там всё довольно понятно. Но вот с его настройкой и рисованием есть много непонимания.

Вот мой текущий код для создания прозрачного окна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <Windows.h>
 
int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
LRESULT CALLBACK windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    WNDCLASS windowClass {};
 
    windowClass.lpfnWndProc = windowProc;
    windowClass.hInstance = hInstance;
    windowClass.lpszClassName = L"Keystrokes";
    windowClass.style = CS_NOCLOSE;
    windowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 
    if (!RegisterClass(&windowClass))
    {
        return 0;
    }
 
    HWND hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW, L"Keystrokes", L"Keystrokes", WS_POPUP, 0, 0, 148, 140, 0, 0, hInstance, 0);
 
    if (!hwnd)
    {
        return 0;
    }
 
    SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
 
    ShowWindow(hwnd, nCmdShow);
 
    MSG msg {};
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_LBUTTONDOWN:
        {
            SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
        }
        
        break;
 
        case WM_MBUTTONDOWN:
        {
            PostQuitMessage(0);
        }
 
        break;
 
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hDC = BeginPaint(hwnd, &ps);
 
            EndPaint(hwnd, &ps);
        }
    }
 
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
На stackoverflow мне удалось найти код который рисует прямоугольник на этом прозрачном окне
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
bool paintRect(HDC hdc, RECT dim, COLORREF penCol, COLORREF brushCol, unsigned int opacity)
{
    HDC tempHdc = CreateCompatibleDC(hdc);
    BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, 0 };
 
    HBITMAP hbitmap;       // bitmap handle 
    BITMAPINFO bmi;        // bitmap header 
    // zero the memory for the bitmap info 
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
 
    // setup bitmap info  
    // set the bitmap width and height to 60% of the width and height of each of the three horizontal areas. Later on, the blending will occur in the center of each of the three areas. 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = dim.right - dim.left;
    bmi.bmiHeader.biHeight = dim.bottom - dim.top;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;         // four 8-bit components 
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = (dim.right - dim.left) * (dim.bottom - dim.top) * 4;
 
    // create our DIB section and select the bitmap into the dc 
    hbitmap = CreateDIBSection(tempHdc, &bmi, DIB_RGB_COLORS, NULL, NULL, 0x0);
    SelectObject(tempHdc, hbitmap);
 
    SetDCPenColor(tempHdc, RGB(0, 0, 255));
    SetDCBrushColor(tempHdc, RGB(0, 0, 255));
    FillRect(tempHdc, &dim, CreateSolidBrush(RGB(0, 0, 255)));
 
    return bool(AlphaBlend(hdc, dim.left, dim.top, dim.right, dim.bottom, tempHdc, dim.left, dim.top, dim.right, dim.bottom, blend));
}
Да, я знаю что в коде рисования прямоугольника некоторые аргументы функции не подставлены в нужные места. Но это не важно. Меня интересует другое. Почему при использовании LWA_ALPHA вместо LWA_COLORKEY меняется прозрачность всего окна а не только его фона? Для моей цели нужно использовать именно LWA_COLORKEY или я что-то не так делаю с LWA_ALPHA? Почему если изменить прозрачность в коде рисования прямоугольника то он становится темнее вместо того чтобы стать прозрачнее? Такое ощущение что он всё-же становится прозрачнее но под ним находится что-то тёмное. Как сделать так чтобы этого темного не было?

Пожалуйста, не посылайте меня на msdn или гуглить. Я уже всё это делал и ничего не смог понять. На Вас одна надежда.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2021, 21:43
Ответы с готовыми решениями:

Рисование прямоугольника в графическом окне по двум кликам мыши
Задача такова: при нажатии правой клавиши миши первый раз должны записатся её координаты на экране,...

Рендер на картинку полупрозрачного прямоугольника с заокруглёнными краями
Здравствуйте. В названии темы видно, что мне нужно нарисовать. Но не всё так просто.. С помощью...

Рисование на прозрачном фоне формы
Приветствую. Возникла проблема с рисованием на прозрачном фоне формы. Создал простую форму....

Векторное рисование на прозрачном изображении
Здравствуйте. Сейчас разбираюсь с векторным рисованием, и возник вопрос - как избавится от тёмных...

2
28 / 21 / 7
Регистрация: 21.01.2019
Сообщений: 110
05.01.2021, 12:26 2
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Моя цель это рисование чего-либо непрозрачного (или полупрозрачного) на полностью прозрачном окне
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <Windows.h>
#define UNICODE
#define _UNICODE
using namespace std;
 
LRESULT CALLBACK windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_LBUTTONDOWN:
        {
            SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
        }
 
        break;
 
        case WM_MBUTTONDOWN:
        {
            PostQuitMessage(0);
        }
 
        break;
 
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hDC = BeginPaint(hwnd, &ps);
            RECT r{100,100,200,200};
            HBRUSH hBrush = CreateSolidBrush(RGB(200,200,200));
            TextOut(hDC,10,10,L"hello world", 11);
            FillRect(hDC,&r,hBrush);
            EndPaint(hwnd, &ps);
            DeleteObject(hBrush);
        }
    }
 
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
 
int main()
{
    cout << "Hello world!" << endl;
 
    HINSTANCE hInstance = GetModuleHandle(NULL);
    WNDCLASS windowClass{ };
 
    windowClass.lpfnWndProc = windowProc;
    windowClass.hInstance = hInstance;
    windowClass.lpszClassName = L"Keystrokes";
    windowClass.style = CS_NOCLOSE;
    windowClass.hbrBackground = (HBRUSH)(CreateSolidBrush(RGB(1, 1, 1)));;
    windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 
    if (!RegisterClass(&windowClass))
    {
        return 0;
    }
 
    HWND hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW, L"Keystrokes", L"Keystrokes", WS_POPUP, 0, 0, 600, 600, NULL, NULL, hInstance, 0);
    if (!hwnd)
    {
        return 0;
    }
 
    SetLayeredWindowAttributes(hwnd, RGB(1, 1, 1), 100, LWA_COLORKEY|LWA_ALPHA);
 
    ShowWindow(hwnd, SW_SHOW);
 
    MSG msg {};
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
1
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 759
25.04.2021, 21:26  [ТС] 3
beep7433, У каждого объекта может быть абсолютно любой цвет и любая прозрачность, в Вашей реализации к сожалению это не поддерживается.
0
25.04.2021, 21:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2021, 21:26
Помогаю со студенческими работами здесь

Текст DirectDraw на прозрачном окне
Всем привет. Я новичок в C++, и я хочу создать программу, где фон окна будет прозрачным, и на этом...

Смаргивает черный фон в прозрачном окне
Доброго времени суток! Использую стиль WS_EX_LAYERED и ф-цию SetLayeredWindowAttributes для...

Отображение контролов WinForms в прозрачном окне
собственно вопрос в названии темы. У меня есть кастомное окно, в котором установлено свойство...

Как открыть видео плеер в прозрачном окне
делаю видео галерею http://lidacity.hx0.ru/video/page, по нажатию на картинку открывается новое...

Рисование прямоугольника
Добрый день ! Решил воспользоваться функцией FillRect(); которая заполняет прямоугольник кистью....

Рисование прямоугольника
Не получается нарисовать прямоугольник на pictureBox, чтобы можно было изменять его размер (как в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru