Форум — Ответы     (  К темам )
 ?  Dr.Phoenix: Как отключить / включить перерисовку формы? (26-12-2002 17:37:40)
Моя форма слишком долго перерисовывается. Как выключить перерисовку фомы при FormResize, а потом включить обратно, когда изменение размеров закончится?
 Devnvd (26-12-2002 20:22:00)
Если у вас в системе в настройках рабочего стола помечено
"Отображать содержимое окна при перетаскивании",
то при этом и происходит полная перерисовка при изменении размеров и перемещении окна.
Чтобы на время отключить это, необходимо воспользоваться функцией
SystemParametersInfo и программно отключить это свойство. по событию WM_LBUTTONUP мы узнаём, что процесс перетаскивания или изменения размеров закончился.

BOOL bFullDragWindows;
bool bProcessResize=false;
//-----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnMessage = AppMessage;
}
//-------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
if(!bProcessResize)
{
SystemParametersInfo(SPI_GETDRAGFULLWINDOWS,0,&bFullDragWindows,0);
if(bFullDragWindows)//Если есть в этом необходимость
{
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,FALSE,NULL,0);
bProcessResize=true; //Процесс пошёл
}
}
}
//---------------------------------------------------------------------
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if(bProcessResize && WM_LBUTTONUP)//Процесс завершился
{
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,bFullDragWindows,NULL,0);
bProcessResize=false;
//Перерисуем окно, чтобы убрать возможные артефакты
RedrawWindow(Form1->Handle, NULL, NULL,
RDW_FRAME| RDW_UPDATENOW| RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}
 Devnvd (26-12-2002 20:28:04)
Поправлюсь:
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
if(bProcessResize && Msg.message ==WM_LBUTTONUP)
{
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,bFullDragWindows,NULL,0);
bProcessResize=false;
RedrawWindow(Form1->Handle, NULL, NULL,
RDW_FRAME| RDW_UPDATENOW| RDW_INVALIDATE | RDW_ALLCHILDREN);
}
}