그림자 효과와 양식을 달성

절차 ShadeIt (F : TForm을, C : TControl의 선폭 : 정수] 색상 :을 TColor);
var에 
  RECT : TRect; 
  구 :을 TColor; 
시작 
  하는 경우 (c.Visible는) 다음 
  시작 
    하는 구형을 : = c.BoundsRect; 
    rect.Left : = + rect.Left 폭; 
    rect.Top : = + rect.Top 폭; 
    rect.Right : = + rect.Right 폭; 
    rect.Bottom : = + rect.Bottom 폭; 
    구 : = f.Canvas.Brush.Color; 
    f.Canvas.Brush.Color : = 색상; 
    f.Canvas.fillrect (RECT);
    f.Canvas.Brush.Color는 : = 오래된;
  ;
; 

절차 TForm1.FormPaint (발신자 : TObject의);
VAR 
  내가 : 정수; 
시작하기 
  위해 I = 0  으로 Self.ControlCount - 1  수행 
    ShadeIt (자기, Self.Controls [I], (3) , clBtnShadow)를;
 ;
코드보기

모바일 더 창틀 없습니다

    절차 WMMove ( var에 메시지 : TWMMove); 메시지 WM_MOVE;
  ; 

VAR 
  Form3 : TForm3; 

구현 

{ $의 R * .DFM } 

절차 TForm3.WMMove ( var에 메시지 : TWMMove);
시작할 
  경우 TForm을 (Self.Owner) = 전무  
    출구; 
  TForm을 (Self.Owner)는 .left : = Self.left - 7 ; 
  TForm을 (Self.Owner) .Top : = Self.Top - 7 ; // + FDistT; 
 ;
코드보기

완벽한 PNG 반투명 양식 솔루션

이 시스템은 비스타 먼저, 가장 매력적인 반투명 프로스트 윈도우 인터페이스를 나온 많은 사람들의 마음을 붙 잡았다. 방법이 인터페이스 효과를 달성하기 위해이 즉시 프로그래밍 인터페이스 기술 분야의 소동, 많은 사람들이 요구하는 트리거? 물론, Vista에서 실제로 매우 간단, 시스템 자체에 대한 지원은 코드를 작성하기 위해 거의 필요가있다,하지만 여전히 XP 지배했습니다, 그래서 우리는 XP에서이 효과를 달성하는 방법을 공부할 수 있습니다. 

        달성하는 첫 번째 데스크톱 날씨 쇼뿐만 아니라 간단한 생각을 가진 종 있어야 물고기가 데스크톱 소프트웨어를 표시 한 후 낚시를 성공적으로 XP에서 비스타 사이드 바 모방, 실제로 사람들이 흥분, 그러나 기밀 질문 또한 기술을 기억하고, 사용하지 정확히 무엇을 요구하는 부유 한 포럼 : (HTTP // 에 www.delphibbs.com 델파이 포럼 유명)이이 목적을 위해 논의하고, 마지막으로 ID 제공이라는 빛 비 형제가되었습니다 : 방법, 다음은 델파이 구현 코드입니다 (물론 그는, 샨다는 현재 비 형에, 무한 예배에서 그녀를 만났다 나도 몰라 원래되지 않습니다)         

var에 
; PT1, PT2 TPoint 
로 tsize; SZ는 
BF : TBlendFunction, 
선두 
비트 맵 : . = tgpbitmap 만들기 (PNGFile); // 이있는 특정 PNGFile PNG 이미지 경로 
PT1 : = 포인트 (왼쪽, 위쪽)가 // 상단을 할 수있는 윈도우 좌표 
PT2 = 포인트 ( 0 , 0 ) ;// 이가 말했다하지 않았을의 시력 (0,0)을 이해해야합니다 
sz.cx을 = bitmap.GetWidth;   // 이미지 크기 이하의 크기, 그렇지 않으면 윈도우가 아무것도 없습니다, 심지어 그림자 
SZ .CY = bitmap.GetHeight;   //  
bf.BlendOp = AC_SRC_OVER; // 이들 광고 기억 
bf.BlendFlags를 = 0 ;                   // 문헌를 
IF (nTran < 0 ) 또는 (nTran> 255 ) 당시  
nTran : = 255 ; 
bf.SourceConstantAlpha : = nTran;   //  
bf.AlphaFormat = AC_SRC_ALPHA; // 상술 
DeleteObject 매크로 (BMP); //이것은 실수 앞에 여기되었거나 메모리 무한한 양이 증가 
bitmap.GetHBITMAP ( 0 , BMP)을; // HBITMAP이있어 투명성을 지원하는 표준 윈도우 비트 맵 형식 HBITMAP에 tgpbitmap의 전환이다 
DeleteDC (DC); 
DC : = CreateCompatibleDC (Canvas.Handle) 
old_bmp : = SelectObject 매크로 (DC, BMP) 
UpdateLayeredWindow (핸들, Canvas.Handle @ PT1, @sz, DC, @ PT2, 0 , @에 BF, ULW_ALPHA); // 콜 달성 UpdateLayeredWindow 
, 
         이 방법은 실제로 PNG 양식을 생성, 우리는 알고하는 PNG 사진 알파 속성입니다 PNG가 설치 프로스트 반투명 그래서 만약, 반투명 젖 가득 생성 된 형태로, gdipobj, 위의 코드에는 GDIPlus 클래스 gdipapi를 사용하여 사용해야합니다, 

        우리는 코드가 위의 코드에 의해 생성 될 수있는 시스템 초기화 인터페이스 날짜 질문으로, 다른, 겉으로는 완벽한 사람에 의해 작성된 것입니다,이 코드를 논의하기 위해 여기에 없습니다 :



        그러나,이 코드는 치명적인 문제가, 당신은 버튼, 편집 등, 컴파일러는 다시는, 모든 컨트롤이 표시되지 않는 마법을 찾을 수로, 위의 양식에 일부 컨트롤을 넣어 시도 할 수 있으며,이는 일이 어떻게? MSDN의 리뷰를 검토 한 결과, 우리는 문제가 UpdateLayeredWindow 기능에 달려 있음을 발견했다. 

        MSDN, 비고에 관한이 기능은 설명이 있습니다 

UpdateLayeredWindow이의 기능은 창 유지 ' . UpdateLayeredWindow 인으로 인해 전화에 계층 창 그들은 계산 한 경우 다시 그릴 필요가 없습니다 윈도우 아래에 화면에 S 모양을, 시스템이 자동으로 다시 칠하기 때문이다. 이 계층화 된 윈도우의 원활한 애니메이션을 가능하게한다. 

        말을하는 것입니다,이 기능을 사용 후, 형태의 다음 층이 다시 그려되지 않습니다 효과로, 양식이 무거운의 OnPaint 이벤트에 응답하지 않습니다 그린 모든 컨트롤은 컨트롤의 결과로 볼 수없는 있지만, 사실은 컨트롤이 존재, 당신은 어떤 버튼을, 당신은 여전히 반응하는 버튼 클릭 이벤트를 찾을 수에 대한 응답으로 위치를 클릭 할 수 있습니다,하지만 그들은 볼 수 없습니다. 

        이것은 당신이 컨트롤을 사용할 수없는 경우, 두통, 또는 빛의 보이지 않는 형태를 제어 한 후 좋은 것을 사용은 무엇입니까? 사실, 마이크로 소프트는이 기능과 원활한 연결을 통해 애니메이션을하고있는 것 같다, MSDN의 일이 매우 명확하게 대답 :이 원활한 애니메이션 허용 의를계층화 된 창. 

        그것을 해결하기 위해 두 가지 형태를 사용하는 것이 생각 그래서 아, 물론,이 방법은, 술집 후 작동하지 않기 때문에. 

        창 형태는 어떻게 해결 하는가? 사실, 아주 간단한, 뒷면에 반투명 PNG의 한 형태로, 형태와 같은 형태는 그것이 날짜 찾기를했다 거기에 두 개의 동기식 이동 등의 경우 전면, 다음 폼에 컨트롤을 배치하기 , 방문 형태 : 



이 양식은 반투명 상단과 하단 테두리를 가지고,하지만 난 그것을 무너 뜨리는 경우도, 당신이 어려워 이해하기 수 위의 표시를 제어 : 



      

        어떻게? 그래서 당신은 찾을 사실,이 개 테두리의 앞에 형태, 뒤에 배경 양식에 : = 폼의 컨트롤 없음, 다음 두 가지 형태를 동기화로 이동, 그래서 우리는 반투명 창을 위조 몸. 사실, 많은 소프트웨어는 같은 원리입니다 음영 몇 가지 형태를 포함, 그렇게하는 것입니다. 

        동기식 이동에 관해서는, 그것의 처리 OnMove 메시지도 매우 간단 

함수 LRESULT; WndNewProc (:; UINT;; WPAR WPARAM LPAR : LPARAM 풍력 uMsg HWND) _stdcall ,
 VAR의  
사각형 다음 TRect는, 
선두 
결과 : = 0 ;
 케이스 uMsg 
WM_LBUTTONDOWN : 및 SendMessage (풍력 상기 WM_SYSCOMMAND, SC_MOVE+ 2 , 0 ),
 그렇지 않으면 
선두 
IF 합니다 (uMsg = WM_MOVING () 또는 (= uMsg WM_MOVE))  GetWindowRect (풍력, 사각형) 그때 
을 SetWindowPos (ComponentForm.Handle, 0 , rect.left, rect.top, 0 , 0 , SWP_NOSIZE) 
결과는 : = 하며 DefWindowProc를 지나온 (풍력, uMsg, WPAR, LPAR)
 ,
 ,
 끝을 , 
        우리가 마우스 왼쪽 버튼을 누를 때 컨트롤이 배경 양식을 이동할 때 우리가 컨트롤이 폼 이름 ComponentForm을 마련 할 것이라고 가정 양식 동기화 운동 다음에 할 수 있습니다.

        물론, 때로는 우리가 직접 코드 배경 양식을 생성 할 수 있습니다, 그래서 일부 프로그램의 볼륨을 줄일 수 있습니다, 배경은 추가 매개 변수가있을 것입니다 우리가 우리만큼 보여주는, 여기에 전주의와 함께 사용하는 기능 CreateWindowEx 함수를 호출 할 수 있습니다 양식을 생성 이 함수의 첫 번째 파라미터가 그것에 WS_EX_LAYERED 설정되어, 그 별도의 층의 특성이있다. 

        우리가 직접 두 가지 형태를 사용할 수 있습니다 두 방법도 효과는 동일 개인 취향에 따라, 양식 배경을 생성하는 CreateWindowEx 함수 기능을 사용할 수 있습니다.
코드보기

 

추천

출처www.cnblogs.com/blogpro/p/11453698.html