关于MDI主窗口背景用c++builder的实现(100分)

  • 主题发起人 主题发起人 locky_z
  • 开始时间 开始时间
L

locky_z

Unregistered / Unconfirmed
GUEST, unregistred user!
我参考过几个delphi的关于MDI主窗口背景的例子,但在c++builder不成功,有谁实现过的,
我的WM_BK....事件中仅仅是设了msg.result=true就返回。按理这样mainForm的color应该不起作用了。并且这个事件也响应了,但mainform仍被恢复成color的颜色。
(请不要贴delphi的例子,这个delphi的例子我看过了很多次了)
 
我列出我的程序
//MAINFORM.h
class TMainForm1 : public TForm
{
__published: // IDE-managed Components
protected:
private:
Graphics::TBitmap * BGBitmap;
TFarProc OldProc;
TFarProc NewProc;
void __fastcall ClientProc(TMessage &
Msg);
__fastcall ~TMainForm1();
void __fastcall WMEraseBkgnd(TWMEraseBkgnd &
Msg);
public: // User declarations
__fastcall TMainForm1(TComponent* Owner);
};
//MAINFORM.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm1 *MainForm1;
//---------------------------------------------------------------------------
__fastcall TMainForm1::TMainForm1(TComponent* Owner)
: TForm(Owner)
{
BGBitmap = new Graphics::TBitmap;
BGBitmap->LoadFromFile("mainform.bmg")
NewProc=MakeObjectInstance(ClientProc);
OldProc=(TFarProc)::SetWindowLong(Handle,GWL_WNDPROC,(LONG)NewProc);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm1::Button_EXITClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm1::ClientProc(TMessage &amp;
Msg)
{
if (Msg.Msg==WM_ERASEBKGND)
{RECT r;
HDC hdc1,hdc;
hdc1=GetDC(ClientHandle);
::GetClientRect(ClientHandle, &amp;r);
hdc = (HDC)Msg.WParam;
BitBlt(hdc,(r.right-BGBitmap->Width)/2,(r.bottom-BGBitmap->Height)/2, BGBitmap->Width, BGBitmap->Height,BGBitmap->Canvas->Handle, 0,0, SRCCOPY);
//如果用BitBle(HDC, ....)的话,BitBlt执行后,屏幕没变化,
//但如果改成BitBle(HDC1,...)的话,看到是写到屏幕了,
//但无论何种方式,退出过程后,窗口就恢复回原来form的底色
Msg.Result = true;
return;
}
Msg.Result = CallWindowProc((FARPROC)OldProc,ClientHandle,Msg.Msg,Msg.WParam,Msg.LParam);
}

__fastcall TMainForm1::~TMainForm1()
{
SetWindowLong(Handle,GWL_WNDPROC,(long)OldProc);
FreeObjectInstance(NewProc);
//删除位图。
delete BGBitmap;
}
void __fastcall TMainForm1::WMEraseBkgnd(TWMEraseBkgnd &amp;
Msg)
{
Msg.Result = false;
//TODO: Add your source code here
}
 
cb与delphi不同,cb可以直接用image实现。直接放一个image就可以了,搞得那么复杂。[:D][:D][:D][:D][:D][:D]
 
我觉得关键不是这个BGBitmap,
关键是响应了WM_ERASEBKGND,为什么还会覆盖我所画的内容
 
直接寫Canvas絕對是好方法!
 
我知道SDI就可以在在onpaint事件中作,但MDI的背景根本不能用canvas这种方法,
 
可以的, 在OnCreate裡面寫就行了
bmp.LoadFrmFile();
Self.Canvas.Brush.BitMap := bmp;
 
后退
顶部