안녕하세요.
폼의 바탕화면을 가로채어 그레이데이션을 구현했는데,
다음 것은 MDI스타일일때만 됩니다.
그냥 보통(Noraml)스타일일때는 구현이 안됩니다.
해결해 주십시오.
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ExtCtrls.hpp>
#include <checklst.hpp>
//---------------------------------------------------------------------------
class TMDIParent : public TForm
{
__published: // IDE-managed Components
private: // User declarations
Pointer OriginalClientProc;
Pointer ClientObjectInstance;
virtual void __fastcall CreateWnd();
virtual void __fastcall DestroyWnd();
virtual void __fastcall ClientProc(TMessage &Msg);
virtual void __fastcall DrawClientWindow (HDC &Hdc) ;
void __fastcall WMEraseBkgnd(TWMEraseBkgnd &Msg);
public: // User declarations
__fastcall TMDIParent(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,WMEraseBkgnd)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TMDIParent *MDIParent;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <stdctrls.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Digits"
#pragma resource "*.dfm"
TMDIParent *MDIParent;
//---------------------------------------------------------------------------
__fastcall TMDIParent::TMDIParent(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMDIParent::CreateWnd(void)
{
TForm::CreateWnd();
ClientObjectInstance = MakeObjectInstance (ClientProc) ;
OriginalClientProc = (Pointer) SetWindowLong (ClientHandle,
GWL_WNDPROC,
(long) ClientObjectInstance);
}
void __fastcall TMDIParent::ClientProc (TMessage &Msg)
{
switch (Msg.Msg)
{
case WM_ERASEBKGND:
DrawClientWindow ((HDC) Msg.WParam) ;
Msg.Result = true;
return;
case WM_HSCROLL:
case WM_VSCROLL:
Msg.Result = CallWindowProc ((FARPROC)OriginalClientProc, ClientHandle,
Msg.Msg, Msg.WParam, Msg.LParam);
InvalidateRect (ClientHandle, 0, true) ;
break ;
default:
Msg.Result = CallWindowProc ((FARPROC)OriginalClientProc, ClientHandle,
Msg.Msg, Msg.WParam, Msg.LParam);
}
}
void __fastcall TMDIParent::DrawClientWindow (HDC &Hdc)
{
const int NumGradients = 64;
const TColor StartColor = clBlue;
TRect rect ;
::GetClientRect (ClientHandle, (RECT *) &rect) ;
Graphics::TBitmap *MemBitmap = new Graphics::TBitmap;
MemBitmap->Width = rect.Right - rect.Left;
MemBitmap->Height= rect.Bottom- rect.Top;
MemBitmap->Canvas->Brush->Style = bsSolid;
MemBitmap->Canvas->Brush->Color = clBlack;
MemBitmap->Canvas->FillRect(Rect(0,0,
MemBitmap->Width,
MemBitmap->Height));
int GradientHeight = MemBitmap->Height / NumGradients;
int InitialRed = GetRValue(StartColor);
int InitialGreen = GetGValue(StartColor);
int InitialBlue = GetBValue(StartColor);
int RedIncrement = (InitialRed + 1) / NumGradients;
int GreenIncrement= (InitialGreen + 1)/ NumGradients;
int BlueIncrement = (InitialBlue + 1) / NumGradients;
TColor FillColor;
for (int j=0;j< NumGradients;j++)
{
rect.Bottom = rect.Top + GradientHeight;
FillColor = (TColor) RGB( InitialRed -(RedIncrement * j),
InitialGreen -(GreenIncrement* j),
InitialBlue -(BlueIncrement * j));
MemBitmap->Canvas->Brush->Color = FillColor;
MemBitmap->Canvas->FillRect(rect);
rect.Top += GradientHeight;
}
::BitBlt(Hdc,0,0,MemBitmap->Width, MemBitmap->Height,
MemBitmap->Canvas->Handle,0,0,SRCCOPY);
delete MemBitmap; // delete the temporary bitmap.
}
void __fastcall TMDIParent::DestroyWnd ()
{
SetWindowLong (ClientHandle, GWL_WNDPROC, (long) OriginalClientProc) ;
FreeObjectInstance (ClientObjectInstance) ;
TForm::DestroyWnd();
}
void __fastcall TMDIParent::WMEraseBkgnd(TWMEraseBkgnd &Msg)
{
Msg.Result = false;
}
해결해 주십시오.
부탁드리겠습니다.
그럼.
[WhiteSanke] 이재광.
|