Hallo,
nachdem ich nun nach langen suchen im Delphitreff für das im Titel angesprochene Problem fündig wurde, möchte ich die Lösung für den C++ Builder dem Forum nicht vorenthalten.
Der Link auf den Beitrag ist folgender: http://www.delphi-treff.de/tipps/grafik/sonstiges/bild-im-mdi-client-bereich-anzeigen/
Es wird das Bild, welches in Image1 enthalten ist, als Kachel auf der MDIForm gezeichnet. Um das ganze noch etwas flimmerfreier zu gestalten, wird das Bild zuerst in ein Bitmap "gekachelt" und dann in auf die MDIForm geblittet.
Zuerst die .H Datei:
[cpp]
class TMain : public TForm
{
__published:
TImage *Image1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private:
FARPROC m_ClientInstance;
FARPROC m_PrevClientProc;
Graphics::TBitmap *m_bg;
void __fastcall DrawBk(HWND dc);
void __fastcall ClientWndProc(Messages::TMessage & Message);
void __fastcall CallPrevWndProc(Messages::TMessage & Message);
};
//---------------------------------------------------------------------------
inline void __fastcall TMain::CallPrevWndProc(Messages::TMessage & Message)
{
Message.Result= ::CallWindowProc(m_PrevClientProc,
ClientHandle,
Message.Msg,
Message.WParam,
Message.LParam);
}
[/cpp]
Und die cpp-Datei
[cpp]
//---------------------------------------------------------------------------
void __fastcall TMain::FormCreate(TObject *Sender)
{
m_ClientInstance = (FARPROC)MakeObjectInstance(ClientWndProc);
m_PrevClientProc = (FARPROC)(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle,GWL_WNDPROC,LongInt(m_ClientInstance));
m_bg = new Graphics::TBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TMain::FormDestroy(TObject *Sender)
{
delete m_bg;
}
//---------------------------------------------------------------------------
void __fastcall TMain::ClientWndProc(Messages::TMessage & Message)
{
switch (Message.Msg)
{
case WM_ERASEBKGND:
DrawBk((HWND)(Message.WParam));
Message.Result =1;
break;
case WM_VSCROLL:
case WM_HSCROLL:
CallPrevWndProc(Message);
InvalidateRect(ClientHandle,0,TRUE);
break;
default:
CallPrevWndProc(Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TMain::DrawBk(HWND dc)
{
int x=0,y=0;
m_bg->SetSize(Width,Height);
for (y = 0; y < Height; y +=Image1->Height)
{
for (x=0; x < Width;x += Image1->Width)
{
m_bg->Canvas->Draw(x,y,Image1->Picture->Graphic);
}
}
BitBlt(dc,0,0,m_bg->Width, m_bg->Height,
m_bg->Canvas->Handle,0,0,SRCCOPY);
}
[/cpp]