Форум — Ответы     (  К темам )
 ?  TRANSPARENT: Фоновая картинка TMemo — не все так уж гладко... (11-01-2003 03:09:11)
Сначала спасибо Devnvd за помощь.Но к сожалению так как вы написали, б.г.
прорисовывается корректно(и без repaint в onChange)но,только пока TMemo не скролируется вверх.Но если начать фон превращается в винигрет.Я дописал обработку EN_VSCROLL стало чуть
получше (чуть винигрета сверху и чуть снизу-в основной же массе фон выживает).
Помоему нужно найти для Repaint более подходящее место,либо при скролинге как-то сделать
чтоб обновлялся весь б.г. а не только тот фрагмент который мы вытянули на свет божий,
или как-то перехватить WM_PAINT или WM_ERASEBKGROUND(???) TMemo только подскажите как это сделать и как TBitmap нарисовать на DC ???
Да и кстати почему TMemo не шлет WM_COMMAND Parent'у если его скролировать за ползунок?
(скролинг клавишами и щелчками мышки WM_COMAND вызывает)
И можноли также "переопределить" WndProc контрола?


Заранее благодарен за ответы.

Истина где-то рядом!!!


Graphics::TBitmap *BmpMemo=NULL;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WindowProc=MyWindowProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyWindowProc(Messages::TMessage &msg)
{ switch(msg.Msg)
{ case WM_CTLCOLOREDIT:
if(msg.LParam==(int)Memo1->Handle)
{ HDC hdc=(HDC)msg.WParam;
SetBkMode(hdc,TRANSPARENT);
msg.Result=0; return; } break;

case WM_COMMAND:
if((HWND)msg.LParam==Memo1->Handle && msg.WParamHi==EN_VSCROLL)
{Memo1->Repaint();msg.Result=0;return;}break;

default: break;
}
WndProc(msg);}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(!OpenDialog1->Execute())return;

Memo1->Brush->Bitmap=NULL;
if(!BmpMemo)BmpMemo=new Graphics::TBitmap();
BmpMemo->LoadFromFile(OpenDialog1->FileName);
Memo1->Brush->Bitmap=BmpMemo;
Memo1->Repaint();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Memo1->Brush->Bitmap=NULL;
if(BmpMemo)delete BmpMemo;
BmpMemo=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
//Memo1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Repaint();
}
//---------------------------------------------------------------------------
 Devnvd (11-01-2003 20:10:08)
О проблеме скроллинга я знал.
Переопределить WndProc можно. Отработать Scrolling тоже можно.
Но возни, чтобы всё выглядело гладко, настолько много, что игра не стоит свеч.
Проще самому сделать подобие TMemo, но не используя системный Edit Control.
Выбирайте, продолжать возиться или сделать по другому. TMemo явно не подходит.

Graphics::TBitmap *BmpMemo=NULL;
TWndMethod OldMemoWindowProc;
//-------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WindowProc=MyWindowProc;
OldMemoWindowProc=Memo1->WindowProc;
Memo1->WindowProc=MemoWindowProc;
}
//------------------------------------------------------------------
void __fastcall TForm1::MyWindowProc(Messages::TMessage &msg)
{
switch(msg.Msg)
{
case WM_CTLCOLOREDIT:
if(msg.LParam==(int)Memo1->Handle)
{
HDC hdc=(HDC)msg.WParam;
SetBkMode(hdc,TRANSPARENT);
msg.Result=0;
return;
}
break;
case WM_COMMAND:
if(msg.WParamHi==EN_HSCROLL ||msg.WParamHi==EN_VSCROLL)
{
if(msg.LParam==(int)Memo1->Handle)
{
WndProc(msg);
Memo1->Repaint();
}
}
default:
break;
}
WndProc(msg);
}
//--------------------------------------------------------------
//Загрузим фоновую картинку для Memo1
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(!OpenDialog1->Execute())return;
Memo1->Brush->Bitmap=NULL;
if(!BmpMemo)BmpMemo=new Graphics::TBitmap();
BmpMemo->LoadFromFile(OpenDialog1->FileName);
// Memo1->Brush->Bitmap=BmpMemo;
Memo1->Repaint();
}
//------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Memo1->Brush->Bitmap=NULL;
if(BmpMemo)delete BmpMemo;
BmpMemo=NULL;
}
//-----------------------------------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
Memo1->Repaint();
}
//-------------------------------------------------------------------
void __fastcall TForm1::MemoWindowProc(Messages::TMessage &msg)
{
//Это извращение рисовать самому то что рисуется и так
if(msg.Msg==WM_ERASEBKGND && BmpMemo)
{
HDC hdc=(HDC)msg.WParam;
BitBlt(hdc,0,0,Memo1->Width,Memo1->Height,
BmpMemo->Canvas->Handle,0,0,SRCCOPY);
msg.Result=true;
return;
}
OldMemoWindowProc(msg);
switch(msg.Msg)
{
case WM_HSCROLL:
case WM_VSCROLL:
Memo1->Repaint();
default:
break;
}
}