Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
21 / 21 / 7
Регистрация: 30.05.2014
Сообщений: 431

Рисование на окне из другой функции

13.02.2016, 20:20. Показов 1876. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно нарисовать на окне края из другой функции.
Вот мой "нерабочий" метод
C++
1
2
3
4
5
6
7
        case WM_CREATE:
        {
            // create borders
            std::thread thr(Drawing::RainbowColor, 50, hWnd);
            thr.detach();
            break;
        }
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
namespace Drawing
{
    //Функция отрисовки бордеров у окна размером в 1px
    void DrawBorder(HWND hWnd, HDC hdc, Color borderColor)
    {
        RECT rect;
        GetClientRect(hWnd, &rect);
        SelectObject(hdc, GetStockObject(DC_PEN));
        SelectObject(hdc, GetStockObject(DC_BRUSH));
        SetDCPenColor(hdc, RGBColor(borderColor));
        Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
    }
 
    void RainbowColor(int Speed, HWND hWnd)
    {
        PAINTSTRUCT ps;
        while (true)
        {
            for (int i = 0; i < 700; i ++)
            {
                HDC hdc = BeginPaint(hWnd, &ps);
                Sleep(Speed); // thread sleep. Too fast.
                DrawBorder(hWnd, hdc,Rainbow(i));
                EndPaint(hWnd, &ps);
            }
        }
    }
 
    Color Rainbow(int progress)
    {
        auto div = (abs(progress % 100) * 6);
        auto ascending = ((div % 1) * 255);
        auto descending = 255 - ascending;
        Color retColor;
        switch (div)
        {
        case 0:
            retColor.R = 255;
            retColor.G = ascending;
            retColor.B = 255;
            break;
        case 1:
            retColor.R = descending;
            retColor.G = 255;
            retColor.B = 0;
            break;
        case 2:
            retColor.R = 0;
            retColor.G = 255;
            retColor.B = ascending;
            break;
        case 3:
            retColor.R = 0;
            retColor.G = descending;
            retColor.B = 255;
            break;
        case 4:
            retColor.R = ascending;
            retColor.G = 0;
            retColor.B = 255;
            break;
        default: // case 5:
            retColor.R = 255;
            retColor.G = 0;
            retColor.B = descending;
            break;
        }
        return retColor;
    }
ну и структура Color с дефайном
C++
1
2
3
4
5
6
7
8
9
10
11
#define RGBColor(Color) RGB(Color.R, Color.G, Color.B)
 
namespace Drawing
{
    struct Color
    {
        BYTE Alpha = 0;
        BYTE R = 0;
        BYTE G = 0;
        BYTE B = 0;
    };
У меня не работает отрисовка анимации бордера у окна.

Добавлено через 2 часа 6 минут
upd1: мне это нужно делать не в WM_PAINT, и в отдельном потоке.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2016, 20:20
Ответы с готовыми решениями:

Рисование в окне
Здравствуйте. Я пишу программу средствами WIN API на C++. У меня такой вопрос: Есть ли встроенные функции, позволяющие рисовать в окне...

Рисование в окне
Есть задача - рисование различных картинок при клике левой и правой кнопкой мыши. Решил вот так: #include &quot;TemplWnd.h&quot; ...

Рисование в окне
Здраствуйте! Помогите в написании программы (MFC):1) окно которое вызывает арифметическое действие; 2) вызывает меню с рисованием ...

3
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
14.02.2016, 19:18
Словами опишите что хотите получить.
0
21 / 21 / 7
Регистрация: 30.05.2014
Сообщений: 431
14.02.2016, 20:06  [ТС]
ок. Опишу тупым языком.
У меня есть окно.
Надо нарисовать у него бордеры.
Бордеры должны быть анимированы.
Пример : https://github.com/Nummer/Dest... g/releases (C#)
Мне это надо реализовать на C++ WinAPI
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
15.02.2016, 00:25
Лучший ответ Сообщение было отмечено Nummerok как решение

Решение

То есть ваше окно? В вашей программе, вашего процесса? Просто непонятно что есьм "из другой функции".
Чем вам не нравится WM_PAINT?
Использовать BeginPaint/EndPaint можно только внутри WM_PAINT. Иначе использовать Get*DC/ReleaseDC.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2016, 00:25
Помогаю со студенческими работами здесь

Рисование в чужом окне
Собственно, я понимаю как рисовать, мне больше интересно 2 момента: 1) Если я просто буду рисовать на окне, то при его перерисовке всё...

Рисование на окне диалога
Здравствуйте. Наследуюсь от CPaintDc. class CMyPaintDC:public CPaintDC { public: CMyPaintDC(CDialog* pWnd); void...

Рисование в графическом окне
Всем здравствуйте. Мы нарисовали на PictureBox средствами GDI+ или API графический примитив. Свернув-развернув форму мы получим чистое...

Рисование в окне (mfc c++)
Задание: разработать программу, позволяющую рисовать эллипсы в окне мышью. Предусмотреть в меню Undo, Redo и Del all. С помощью...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru