C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[999] [질문] 그레이데이션/프포
dreamsys [ ] 3968 읽음    1999-01-23 13:42
안녕하세요.

폼의 바탕화면을 가로채어 그레이데이션을 구현했는데,

다음 것은 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] 이재광.


+ -

관련 글 리스트
999 [질문] 그레이데이션/프포 dreamsys 3968 1999/01/23
1004     [답변] DREAMSYS/ 그레이데이션/프포 박지훈.임프 3986 1999/01/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.