?
Hallo zusammen
Ich blende in der CaptionBar einen Button ein, womit ein modales Fenster geöffnet, welches die Versionsinformationen usw enthält.
Da ich dies in fast jedem meiner Programme verwende, habe ich dies als Makro in einer Headerdatei deklariert. Soweit funktioniert auch alles.
Makro für Headerdatei
#define ABOUT_BUTTON_H /*info button rect*/ \
TRect InfoButtonRect; \
TRect HelpButtonRect; \
/*os message functions*/ \
void __fastcall WMNCLButtonDown(TMessage &Msg); \
void __fastcall WMNCPaint(TMessage &Msg); \
void __fastcall WMNCActivate(TMessage &Msg); \
void __fastcall WMActivate(TMessage &Msg); \
/*catch os messages*/ \
BEGIN_MESSAGE_MAP \
VCL_MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown) \
VCL_MESSAGE_HANDLER(WM_NCPAINT, TMessage, WMNCPaint) \
VCL_MESSAGE_HANDLER(WM_NCACTIVATE, TMessage, WMNCActivate) \
VCL_MESSAGE_HANDLER(WM_ACTIVATE, TMessage, WMActivate) \
END_MESSAGE_MAP(TForm)
Makro für Cpp Datei
#define ABOUT_BUTTON_CPP(TfMain, INI_FILE)void __fastcall TfMain::WMNCPaint(TMessage &Msg) \
{ \
TForm::Dispatch(&Msg); \
TCanvas * FCanvas = new TCanvas(); \
Graphics::TBitmap *Bmp = new Graphics::TBitmap; \
\
/*get window handle*/ \
FCanvas->Handle = GetWindowDC(Handle); \
Bmp->LoadFromResourceName(int(HInstance), "RES_INFO"); \
\
\
/*calc width*/ \
InfoButtonRect.left = GetSystemMetrics(SM_CXSIZE) * 3 + GetSystemMetrics(SM_CXFRAME) + Bmp->Width; \
InfoButtonRect.left = Width - InfoButtonRect.left; \
\
/*calc last three points of rect*/ \
if(BorderStyle == bsSizeable) \
{ \
InfoButtonRect.top = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYBORDER); \
} \
else \
{ \
InfoButtonRect.top = GetSystemMetrics(SM_CYFRAME); \
} \
InfoButtonRect.right = InfoButtonRect.left + Bmp->Width; \
InfoButtonRect.bottom = InfoButtonRect.top + Bmp->Height; \
\
SetBkMode(FCanvas->Handle, TRANSPARENT); \
\
/*draw bitmap*/ \
FCanvas->Draw(InfoButtonRect.left, InfoButtonRect.top, Bmp); \
Repaint(); \
/*overwrite top to catch all clicks on bitmap*/ \
InfoButtonRect.top = -1; \
\
ReleaseDC(Handle, FCanvas->Handle); \
delete Bmp; \
delete FCanvas; \
} \
/*---------------------------------------------------------------------------*/ \
void __fastcall TfMain::WMNCLButtonDown(TMessage &Msg) \
{ \
TForm::Dispatch(&Msg); \
\
if (Msg.WParam == HTCAPTION) \
{ \
int LSpace = GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME); \
int TSpace = GetSystemMetrics(SM_CXSIZE); \
\
POINTS MPoints = MAKEPOINTS(Msg.LParam); \
TPoint MousePoint = TPoint(MPoints.x + LSpace, (MPoints.y + TSpace)); \
MousePoint = ScreenToClient(MousePoint); \
\
/*info button pressed?*/ \
if(PtInRect(InfoButtonRect, MousePoint)) \
{ \
fAbout = new TfAbout(NULL, INI_FILE); \
fAbout->ShowModal(); \
delete fAbout; \
} \
} \
} \
/*---------------------------------------------------------------------------*/ \
void __fastcall TfMain::WMActivate(TMessage &Msg) \
{ \
TForm::Dispatch(&Msg); \
\
Perform(WM_NCPAINT, 0, 0); \
} \
/*---------------------------------------------------------------------------*/ \
void __fastcall TfMain::WMNCActivate(TMessage &Msg) \
{ \
TForm::Dispatch(&Msg); \
\
Perform(WM_NCPAINT, 0, 0); \
}
Außerdem habe ich noch dies eingefügt, daß beim ändern der Größe der Button sofort gezeichnet wird:
//---------------------------------------------------------------------------
void __fastcall TfMain::FormResize(TObject *Sender)
{
Perform(WM_NCPAINT, 0, 0);
}
Wenn ich nun jedoch mein Fenster maximiere, wird zwar der Button an der neuen Position angezeigt, jedoch an der alten bleibt er erhalten. Dieser verschwindet erst, wenn ich das Programm in Taskleiste legen und wieder herstelle.
Wie kann ich nun den alten Button löschen?
MfG Stephan