Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878

Скрытая отрисовка окна

19.02.2015, 17:52. Показов 2776. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем такая проблема, есть диалоговое окно, когда оно показывается
C++ (Qt)
1
ShowWindow(диалогвое окно,SW_SHOWNORMAL);
иногда происходит мерцание контролов, само окно с флагами |WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
поэтому прорисовка происходит следующим образом,
1) рисуется фон контролов(Erasebknd),
2) фон самого окна (Erasebknd),
3) WM_PAINT контролов
4) WM_PAINT окна

следовательно это вызывает мерцание.

Как можно решить проблему с мерцанием? МБ можно как-то заставить окно показыватся только после полной отрисовки, или сделать невидимым - отрисовать, скопировать растр и нарисовать его?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2015, 17:52
Ответы с готовыми решениями:

Отрисовка окна(C#)
Здравствуйте! столкнулся с такой проблемой, использую код private void Form1_Paint(object sender, PaintEventArgs e) { ...

Отрисовка окна
Привет всем. Не правильная отрисовка окна, координаты мыши остаются на окне. Как исправить? Работа сделана в VC2008 на C++. ...

MFC отрисовка окна
Привет. В MFC для MDI существует метод OnDraw для отрисовки окна. Но этот метод вызывается только при определенных событиях (свертывание,...

23
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.02.2015, 20:33
Цитата Сообщение от mh-coder Посмотреть сообщение
Как можно решить проблему с мерцанием?
Не рисовать так как ты рисуешь.
* Цвет фона окна задаётся в классе.
* Зачем рисовать фон элементов управления?
* Если явно посылаешь WM_PAINT - это не правильно.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
19.02.2015, 20:55  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
* Цвет фона окна задаётся в классе.
* Зачем рисовать фон элементов управления?
* Если явно посылаешь WM_PAINT - это не правильно.
*В фрне у меня рисуется изображение,
*ну потому что с флагом WS_CLIPCHILDREN главное окно на том месте где находятся контролы - ничего не рисует и там остается белый прямоугольник
*я явно ничего не посылаю, с чего вы взяли?
тот список последовательности отрисовки, что я написал выше, производится камандами главного окна, я лишь участвую в отрисовки WM_PAINT, WM_ERASEBKND
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
20.02.2015, 10:04
Цитата Сообщение от mh-coder Посмотреть сообщение
Как можно решить проблему с мерцанием?
Double buffering спасет отца русской демократии:
http://www.codeproject.com/Art... ble-Buffer
http://www.codeproject.com/Art... d-DC-Class
http://www.codeproject.com/Art... PI-Program
http://www.codeproject.com/Art... g-With-GDI
(ну и прочие гуглоссылки по лексеме double buffering.....)
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 10:49  [ТС]
Цитата Сообщение от CheshireCat Посмотреть сообщение
Double buffering спасет отца русской демократии:
двойной буфер я могу применить при отрисовки контрола, но морцание возникает из за не одновременной отрисовки контролов и окна
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
20.02.2015, 13:07
Цитата Сообщение от mh-coder Посмотреть сообщение
но морцание возникает из за не одновременной отрисовки контролов и окна
А кто Вам сказал , что они должны одновременно прорисовываться ?
Как сказал CheshireCat,
Цитата Сообщение от CheshireCat Посмотреть сообщение
Double buffering спасет отца русской демократии
и это единственное правильное решение !
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 17:01  [ТС]
Цитата Сообщение от Игорь с++ Посмотреть сообщение
А кто Вам сказал , что они должны одновременно прорисовываться ?
может и не должны, но так нужно сделать чтобы не мерцало, в этом и вся суть вопроса
Цитата Сообщение от Игорь с++ Посмотреть сообщение
и это единственное правильное решение !
контролы и так через двойной буфер рисуются
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 18:29
Цитата Сообщение от mh-coder Посмотреть сообщение
контролы и так через двойной буфер рисуются
Может ты покажешь нам простейший пример воспроизводящий эту проблему?
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 18:36  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Может ты покажешь нам простейший пример воспроизводящий эту проблему?
к сожалению немогу, просто подскажите как можно реализовать отрисовку всех конролов в общую копию DC которая находится в памяти с последующим копирование в основной DC главного окна
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 18:59
Цитата Сообщение от mh-coder Посмотреть сообщение
к сожалению немогу, просто подскажите как можно реализовать отрисовку всех конролов в общую копию DC которая находится в памяти с последующим копирование в основной DC главного окна
К сожалению не могу.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 19:05  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
К сожалению не могу.
ну и зачем тогда что-то отвечать в теме? я лично немогу показать код, по той причине, что мне для этого нужно из 30к строк кода, выдрать половину, на это уйдёт пол дня минимум, да и вобще, для ответа на вопрос как отрисовать контрол в виртульном окне, какой либо код ненужен.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 19:32
Цитата Сообщение от mh-coder Посмотреть сообщение
к сожалению немогу
Ну и зачем тогда создавать тему?

Цитата Сообщение от mh-coder Посмотреть сообщение
я лично немогу показать код, по той причине, что мне для этого нужно из 30к строк кода, выдрать половину
Не надо нам тут 15к строк кода. Покажи как ты это делаешь на простом примере (1-2 КБ кода)! Ты же знаешь как ты это делаешь, или нет?
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 20:33  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Не надо нам тут 15к строк кода. Покажи как ты это делаешь на простом примере (1-2 КБ кода)! Ты же знаешь как ты это делаешь, или нет?
такс, уложился в 1к, в общем там в цикле будет появлятся окно поверх другова, через раз, или через несколько раз оно будет появлятся с мерцанием.
Вложения
Тип файла: zip testWINDOW.zip (710.6 Кб, 5 просмотров)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 20:59
У меня связь с сетью интернет очень плохая, 700КБ без ошибок с форума скачать не могу.
Одни исходники можешь выложить?
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 21:11  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Одни исходники можешь выложить?
без изображений мерцание возникает не так часто
весь код в сообщение не влазит((

http://mh-proxy.ru/code.txt
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 21:23
Стоп. Погоди. Ты сказал что уложился в 1 (один) килобайт. Что мне делать с 28-ю КБ исходного кода?
Просто максимально запакуй исходник на 1КБ без исполняемых файлов и изображений и выложи на форум.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 21:24  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Стоп. Погоди. Ты сказал что уложился в 1 (один) килобайт. Что мне делать с 28-ю КБ исходного кода?
1к - имеется в виду 1000 строк,

прикрепил, запакованый исходник, без ничего,

вот заодно картинки, мб сможешь скачать
http://mh-proxy.ru/1.jpg
http://mh-proxy.ru/2.bmp
Вложения
Тип файла: zip code.zip (6.0 Кб, 5 просмотров)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 21:58
При всём желании помочь я говорил не об этом. Я хотел увидеть простое оконное приложение с регистрацией класса, созданием окна и процедурой обработки сообщений.
То, что ты сделал, нельзя назвать простейшим примером, воспроизводящим проблему.
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
20.02.2015, 22:09  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
При всём желании помочь я говорил не об этом. Я хотел увидеть простое оконное приложение с регистрацией класса, созданием окна и процедурой обработки сообщений.
То, что ты сделал, нельзя назвать простейшим примером, воспроизводящим проблему.
а как мне иначе показать проблему? в создании окна проблем нет, проблема в том что мерцает второе окно когда оно повторно активизируется. ну вот регистрация класса и процедура обработки

PS:а есть у тебя аська или скайп?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
WNDCLASSEX wc       = { 0 };
    wc.cbSize           = sizeof( WNDCLASSEX );                 // Размер структуры
    wc.style            = CS_HREDRAW | CS_VREDRAW | CS_PARENTDC;                // Перерисовывать окна по вертикали и горизонтали при измении размеров
    wc.lpfnWndProc      = WndProc;                              // Адрес функции окна обработки сообщений
    wc.cbClsExtra       = 0;                                    // Должно быть ноль
    wc.cbWndExtra       = 0;                                    // Должно быть ноль
    wc.hInstance        = ::histance;                           // Дескриптор экземпляра приложения
    wc.hIcon            = LoadIcon( NULL, IDI_APPLICATION );    // Загрузка иконки
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );        // Загрузка курсора
    wc.hbrBackground    = ( HBRUSH )( COLOR_WINDOW + 1 );       // Цвет окна
    wc.lpszClassName    = CLASS_NAME;                           // Имя класса
    wc.hIconSm          = LoadIcon( NULL, IDI_APPLICATION );    // Загрузка иконки
RegisterClassEx( &wc );
C++ (Qt)
1
2
3
4
5
6
7
8
9
::hWnd = CreateWindow(  CLASS_NAME,                                             
        WND_NAME,                                               
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_TABSTOP | WS_THICKFRAME |WS_CLIPSIBLINGS,                                    
        CW_USEDEFAULT, 0,                                       
        CW_USEDEFAULT, 0,                                       
        NULL,                                                   
        NULL,                                               
        ::histance,                                                         
        NULL );




C++ (Qt)
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
79
80
81
82
83
84
85
86
// Функция окна обработки сообщений
LRESULT CALLBACK WndProc(   HWND    hWnd,       // Дескриптор окна 
                         UINT   msg,        // ID сообщения
                         WPARAM wParam, // Дополнительная информация о сообщении
                         LPARAM lParam )    // Дополнительная информация о сообщении
{
 
    if( msg == WM_ERASEBKGND ){
        return 1;
    }
    if( msg == WM_PAINT ){
 
        LP_BM_Image LPBM = &MapWindowBM_Image[(INT64)hWnd];
 
        if( LPBM->SetBGImage ){
 
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
 
 
            if(LPBM->LoadBGImage){
 
                LPBM->BGID.init = 1;
                LPBM->BGID.memHdc = CreateCompatibleDC(hdc);
                LPBM->BGID.memBM = CreateCompatibleBitmap(hdc,ps.rcPaint.right,ps.rcPaint.bottom);
                HBITMAP old = (HBITMAP)SelectObject (LPBM->BGID.memHdc, LPBM->BGID.memBM );
                DeleteObject(old);
                Gdiplus::Graphics graphics(LPBM->BGID.memHdc);
                Gdiplus::Image image(LPBM->BGimagePath.c_str());
                graphics.DrawImage(&image,0,0,ps.rcPaint.right,ps.rcPaint.bottom);
                LPBM->LoadBGImage = 0;
 
                BitBlt(hdc,0,0,ps.rcPaint.right,ps.rcPaint.bottom,LPBM->BGID.memHdc,0,0,SRCCOPY);
                if(MapCopyWindowBG.find((INT64)hWnd) == MapCopyWindowBG.end() ){ // если копии hdc еще нету
                    BGimageData BM;
                    BM.memHdc = CreateCompatibleDC(hdc);
                    BM.memBM = CreateCompatibleBitmap(hdc,ps.rcPaint.right,ps.rcPaint.bottom);
                    DeleteObject((HBITMAP)SelectObject ( BM.memHdc, BM.memBM ));
                    BitBlt(BM.memHdc,0,0,ps.rcPaint.right,ps.rcPaint.bottom,hdc,0,0,SRCCOPY);
                    BM.init = 1;
                    MapCopyWindowBG.insert(map < INT64, BGimageData, less<INT64> >::value_type((INT64)hWnd,BM));
                }
 
            }else{
                BitBlt(hdc,0,0,ps.rcPaint.right,ps.rcPaint.bottom,LPBM->BGID.memHdc,0,0,SRCCOPY);
            }
            EndPaint(hWnd, &ps);
            return 0;
        }else{
            if( MapCopyWindowBG.find((INT64)hWnd) == MapCopyWindowBG.end() ){
                RECT rc;
                GetClientRect(hWnd,&rc);
                HDC hdc = GetDC(hWnd);
                BGimageData BM;
                BM.memHdc = CreateCompatibleDC(hdc);
                BM.memBM = CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
                DeleteObject((HBITMAP)SelectObject ( BM.memHdc, BM.memBM ));
                BitBlt(BM.memHdc,0,0,rc.right,rc.bottom,hdc,0,0,SRCCOPY);
                BM.init = 1;
                MapCopyWindowBG.insert(map < INT64, BGimageData, less<INT64> >::value_type((INT64)hWnd,BM));
                ReleaseDC(hWnd,hdc);
            }
            return DefWindowProc( hWnd,msg,wParam,lParam );
        }
 
 
    }
 
 
    if( msg == WM_DESTROY) {
 
 
        PostQuitMessage( 0 );
 
    }else{
 
        return DefWindowProc(   hWnd,       // Дескриптор окна 
            msg,        // ID сообщения
            wParam, // Дополнительная информация о сообщении
            lParam );   // Дополнительная информация о сообщении
    }
 
 
    return 0;
 
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.02.2015, 22:34
Извини, но помочь не смогу, с GDI+ не знаком.
Просто совет: в процедуре обработки сообщений используй switch-case.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2015, 22:34
Помогаю со студенческими работами здесь

Отрисовка диалогового окна на главном.
Непонятная проблема возникла. Создал диалоговое окно, вызываю его, а оно отрисовывается на главном окне. Кто-нибудь с таким встречался? ...

Отрисовка окна и его изменение
Делаю приложения для себя для изучения английских слов, программа выбирает из словаря слово и выводит его с 3 вариантами ответа. Суть в...

Почему отрисовка начинается не с начала окна?
Ребята объясните пожалуйста. Начал разбираться в openGL. Возник вопрос хочу нарисовать обычную линию. glBegin(GL_LINES); ...

D3D11 - Отрисовка изображения в заданной части окна
Добрый день всем! Надеюсь на помощь форумчан в следующем вопросе: Итак, есть тектура, т.е. указатель на интерфейс ID3D11Texture2D...

скрытая сьемка
Мне нужно на ноуте с виндовз 8.1 поставить сьемку через вебкамеру и потушитб монитлр чтоб присудствующие у меня в комнате не знали что идет...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru