Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2011, 20:59   #1
*PB*
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 558
По умолчанию Как убрать мерцания systabcontrol32

Собственно вопрос в заголовке темы - systabcontrol32 сильно мерцает при изменении размеров контрола или переключении вкладок.
Двойная буферизация устраняет мерцания самого контрола но из-за нее начинают мерцать дочерние контролы.
Код:
  If Msg = #WM_ERASEBKGND
    Result = 1
 
  ElseIf Msg = #WM_PAINT
    hDC=BeginPaint_(hWnd,ps)
    If hDC
      wdc = hDC
      mdc = CreateCompatibleDC_(wdc)
      GetClientRect_(hWnd, @r)
      bmp = CreateCompatibleBitmap_(wdc, r\right - r\left, r\bottom - r\top)
      oldBmp = SelectObject_(mdc, bmp)
      If ps\fErase 
        CallWindowProc_(*PointOldtabcontrolFunc, hWnd, #WM_ERASEBKGND, mdc, 0)
      EndIf
      CallWindowProc_(*PointOldtabcontrolFunc, hWnd, #WM_PAINT, mdc, 0)
      BitBlt_(wdc, 0, 0, r\right, r\bottom, mdc, 0, 0, #SRCCOPY)
      SelectObject_(mdc, oldBmp)
      DeleteObject_(bmp)
      DeleteDC_(mdc)
      EndPaint_(hWnd,ps)
    EndIf 
    Result = 0
Установка стиля WS_CLIPCHILDREN у контрола, приводит к глюкам прорисовки дочерних контролов.
Может есть действенный способ борьбы с мерцаниями?
*PB* вне форума Ответить с цитированием
Старый 19.07.2011, 21:50   #2
Exception
Пользователь
 
Регистрация: 31.12.2007
Сообщений: 37
По умолчанию

Стиль WS_CLIPCHILDREN необходимо выставить у диалога. А стиль WS_CLIPSIBLINGS - у элемента управления.

Код:
WM_PRINTCLIENT, WM_PAINT, WM_UPDATEUISTATE

var
  ps    : TPaintStruct;
  hdcIn : HDC;
  hdcMem: HDC;
  hbmMem: HBITMAP;
  hbmOld: HBITMAP;
  rcItem: TRect;
begin
  if (wParam = 0) then
    hdcIn := BeginPaint(hWnd, ps)
  else
    hdcIn := wParam;
  if (hdcIn <> 0) then
  try
    GetClientRect(hWnd, rcItem);
    hdcMem := CreateCompatibleDC(hdcIn);
    hbmMem := CreateCompatibleBitmap(hdcIn, rcItem.Right - rcItem.Left, rcItem.Bottom - rcItem.Top);
    hbmOld := SelectObject(hdcMem, hbmMem);
    CallWindowProc(@pcp.CtrlProc, hWnd, WM_ERASEBKGND, hdcMem, 0);
    CallWindowProc(@pcp.CtrlProc, hWnd, WM_PRINTCLIENT, hdcMem, PRF_ERASEBKGND or PRF_CLIENT or PRF_NONCLIENT);
    BitBlt(
      hdcIn,
      0,
      0,
      rcItem.Right - rcItem.Left,
      rcItem.Bottom - rcItem.Top,
      hdcMem,
      0,
      0,
      SRCCOPY
    );
    SelectObject(hdcMem, hbmOld);
    DeleteObject(hbmMem);
    DeleteDC(hdcMem);
  finally
    if (wParam = 0) then
      EndPaint(hWnd, ps);
  end;
  Result := 0;
end;

WM_ERASEBKGND

begin
  Result := 1;
end;

Последний раз редактировалось Exception; 19.07.2011 в 21:52.
Exception вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избавиться от мерцания при передвижении Timages. jocry Помощь студентам 13 22.07.2012 09:46
Пользователь запретил приглашать себя в приложения", сколько не парился никак не могу убрать. Как убрать? nigretos Свободное общение 3 10.06.2011 15:48
Как избавиться от мерцания в консоле? MaRKer.nsk Общие вопросы C/C++ 8 13.04.2010 12:41
как избавиться от мерцания в OpenGL при перспективной проекции (двойная буферизация включена) anyx Свободное общение 0 01.02.2010 10:00