link8236 link8237 link8238 link8239 link8240 link8241 link8242 link8243 link8244 link8245 link8246 link8247 link8248 link8249 link8250 link8251 link8252 link8253 link8254 link8255 link8256 link8257 link8258 link8259 link8260 link8261 link8262 link8263 link8264 link8265 link8266 link8267 link8268 link8269 link8270 link8271 link8272 link8273 link8274 link8275 link8276 link8277 link8278 link8279 link8280 link8281 link8282 link8283 link8284 link8285 link8286 link8287 link8288 link8289 link8290 link8291 link8292 link8293 link8294 link8295 link8296 link8297 link8298 link8299 link8300 link8301 link8302 link8303 link8304 link8305 link8306 link8307 link8308 link8309 link8310 link8311 link8312 link8313 link8314 link8315 link8316 link8317 link8318 link8319 link8320 link8321 link8322 link8323 link8324 link8325 link8326 link8327 link8328 link8329 link8330 link8331 link8332 link8333 link8334 link8335 link8336 link8337 link8338 link8339 link8340 link8341 link8342 link8343 link8344 link8345 link8346 link8347 link8348 link8349 link8350 link8351 link8352 link8353 link8354 link8355 link8356 link8357 link8358 link8359 link8360 link8361 link8362 link8363 link8364 link8365 link8366 link8367 link8368 link8369 link8370 link8371 link8372 link8373 link8374 link8375 link8376 link8377

Форум — Ответы     (  К темам )
 ?  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;
}
}