Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 10

Мерцание при перерисовке окна

06.08.2012, 15:44. Показов 3853. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я хочу заменить одно из дочерних окон Outlook своим. Делаю это так: отлавливаю дескрипторы, мое окно ставлю поверх стандартного, размеры стандартного убираю в ноль и блокирую ему WM_SIZE
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
IntPtr outlookWindow = FindOutlookWindow(); // заменяемое окно
Form1 myForm;  // Мое окно
IntPtr myWindow = myForm.Handle; 
Rectangle outlookRect = GetWindowRectange(outlookWindow);
SetPosition();
Rectangle myRect = GetWindowRectange(myWindow);
SetWindowPos(outlookWindow, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOREDRAW); // Так скрываю старое окно
hwndManager outlookManager = new hwndManager();
outlookManager.AssignHandle(outlookWindow);
 
private void SetPosition() // Устанавливаю мое окно поверх старого
{
    apiImport.SetWindowPos(myWindow, HWND_TOP, 0, 0, outlookRect.Width, outlookRect.Height, SWP_NOMOVE);
    myForm.Left = greedRect.Left;
    myForm.Top = greedRect.Top;
}
 
public class hwndManager : NativeWindow
{
 protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {               
                case WM_SIZE:
                    SizeChanged();
                    break;
                default:  
                    base.WndProc(ref m);
                    break;
            }
        }
}
 
SizeChanged()
{
outlookRect = GetWindowRectange(outlookWindow);
SetPosition();
}
Схема работает, но при ресайзе моя форма довольно сильно мерцает. Поскажите, как это исправить? Я вроде все события из лога MS SPY++ проверил, ниче не получилось. В Api я новичок
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2012, 15:44
Ответы с готовыми решениями:

При перерисовке главного окна мигают дочерние окна
При перерисовке главного окна мигают дочерние окна. Для отрисовки главного окна используется двойная буферизация, как и в дочерних окнах....

GDI FillRect, видно мерцание на месте контрола при движении окна
WINAPI Я использую FillRect для очистки фона, WM_ERASEBKGRN заблокировал, отрисовка по таймеру через двойную буферизацию. Так вроде...

Моргание экрана при перерисовке
Ребята, может кто знает, как убрать моргание экрана при перерисовке, пользуюсь функцией InvalidateRect(), моргает не всегда, но бывает....

8
 Аватар для Genco
16 / 16 / 3
Регистрация: 05.08.2012
Сообщений: 89
06.08.2012, 21:42
У формы C# надо выставить DoubleBuffered=true. У обычных окон (не .NET) двойная буфферизация делается вручную, здесь же можно просто включить.
Возможно, это поможет.
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
07.08.2012, 06:34
размеры стандартного убираю в ноль и блокирую ему WM_SIZE
Может проще ShowWindow(wnd,SW_HIDE)
0
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 10
07.08.2012, 07:39  [ТС]
Цитата Сообщение от Genco Посмотреть сообщение
У формы C# надо выставить DoubleBuffered=true. У обычных окон (не .NET) двойная буфферизация делается вручную, здесь же можно просто включить.
Возможно, это поможет.
У формы не помогло, но вообще хорошая мысль, попоробую порыть поглубже

Цитата Сообщение от murderer Посмотреть сообщение
Может проще ShowWindow(wnd,SW_HIDE)
Я так и хотел, но после ресайза окно снова становится видимым, пришлось занулять размер
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
07.08.2012, 07:51
DestroyWindow
0
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 10
07.08.2012, 16:10  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
DestroyWindow
Тоже пробовал, тоже нет) Тем более само по себе окно нужно
0
 Аватар для Genco
16 / 16 / 3
Регистрация: 05.08.2012
Сообщений: 89
07.08.2012, 22:35
А рисование всё в OnPaint() происходит?
Блин, ну можно ещё руками рисовать на достаточно большом Bitmap, а потом копировать на окно кусок по размеру ( шарповским аналогом BitBlt ) , но это будет по сути ручная реализация буферизации - странно, что она не помогает((
0
0 / 0 / 0
Регистрация: 04.04.2012
Сообщений: 10
08.08.2012, 15:14  [ТС]
Цитата Сообщение от Genco Посмотреть сообщение
А рисование всё в OnPaint() происходит?
Блин, ну можно ещё руками рисовать на достаточно большом Bitmap, а потом копировать на окно кусок по размеру ( шарповским аналогом BitBlt ) , но это будет по сути ручная реализация буферизации - странно, что она не помогает((
OnPaint() - событие формы? Если нет, то я про такое не знаю) Если да - нет, оно не используется
0
 Аватар для Genco
16 / 16 / 3
Регистрация: 05.08.2012
Сообщений: 89
08.08.2012, 16:18
Ну точнее, просто Paint, которое отрисовка. Просто немного не понял, из C# создается форма или нативное окно?
Я пока так понял, что окно outlook спрятано, а все изменения размера/отрисовки касаются только формы, которая ловит апишные сообщения, а остальное берет на себя. Если так - то есть ли кастомное рисование и если да, где оно ещё может быть кроме Paint? оО
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.08.2012, 16:18
Помогаю со студенческими работами здесь

Не сохраняет цвет при перерисовке через bitmap
Не буду первой, но прощу помощи. Банально пробуем рисовать квадрат в буфер и обратно на экран. Квадрат в оригинале - синий, в итоге все...

Мерцание при перерисовке
Доброго времени суток. Есть несколько элементов(прямоугольников). При перетаскивании их мышью каждый раз все изображения перерисовываются....

Мерцание при перерисовке (MFC)
Господа Программисты! Делаю Тетрис на MFC. При перерисовке игрового поля (сообщение ON_WM_PAINT), возникает мерцание. ...

Мерцание формы при перерисовке
после каждого хода идет прорисовка поля и сопровождается мерцанием. даблбуфер не помогает... namespace soft { public partial...

Мерцание при перерисовке кадра игры
Добрый вечер. Делаю обычную игру "Рикошет". Суть игры: снизу пластинка, а так же летает и отбивается шарик, нельзя, чтобы шарик упал. ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru