var
frmRegion, tempRegion: HRGN;
I: Integer;
aRect: TRect;
begin
frmRegion := 0;
for I := 0 to ControlCount - 1 do
begin
// create a region for the control
aRect := Controls[i].BoundsRect;
// coordinates have to be window-relative, not client area relative
OffsetRect( aRect, clientorigin.x - left, clientorigin.y - top );
tempRegion := CreateRectRgnIndirect( aRect );
// merge the region with the "summary" region we are building
if frmRegion = 0 then
frmRegion := tempRegion
else
begin
CombineRgn( frmRegion, frmRegion, tempRegion, RGN_OR );
DeleteObject( tempRegion );
end;
end;
// create a region for the caption and menu bar and add it to the summary
tempregion :=
CreateRectRgn( 0, 0, Width,
GetSystemMetrics( SM_CYCAPTION )+
GetSystemMetrics( SM_CYSIZEFRAME )+
GetSystemMetrics( SM_CYMENU ));
CombineRgn( frmRegion, frmRegion, tempRegion, RGN_OR );
DeleteObject( tempRegion );
SetWindowRgn( handle, frmRegion, true );
end;
주석도 영어로 달려있고.. 프로시져랑 함수들에 대한 설명이 없어서..
정확히 어떤 방법으로 폼을 투명하게 만드는지 알 수 가 없거든요?
각 라인에 대한 상세한 설명을 알고 싶은데..
도와주세요~
영역의 핸들입니다. HRGN이라는 게 영역의 핸들이죠
// 이놈을 가지고 내가 원하는 모양으로 만들수 있는겁니다.
// ControlCount 정확히는 Self.controlcount 또는 Form1.Controlcount겠죠? 현재 폼안에 있는 모든 콘트롤의 갯수죠.. 이걸로 콘트롤들을
엑세스 할려는거 같군요
// 역시나 해당 콘트롤의 위치값을 얻습니다..
// 이 rect값으로 할려는거 같군요.
// 이노은 그냥 rect의 내용을 조금 변화시키는 겁니다.
이 함수 사용안해도 무방합니다....
단지 clientorigin <-- 이변수는 전역인듯 하군요.
현재 폼의 위치에 따라서 rect의 값을 약간 변화시켜 줍니다.
// 이제 해당 rect로 영역을 만들어 내죠...
// 이게 제일처음 즉 영역값이 0이면 없는거니까.. 없을때는 그냥주고
그게 아닐때는 둘다 합치는군요..
// CombineRgn에 두개의 영역을 OR로 합치는 겁니다.
// 그럼 두개가 하나의 핸들 즉 frmRegion이 되겠죠?
// 당연히 사용한 이전의 템프는 없애 버려야죠
// 이놈은 이제 타이틀 을 구해서 역시나 똑같은 짓을 하는군요
// 영역을 만들기만 하면 안되겟죠? 내 폼에다가 적용을 해야지..
// 마짐막으로 적용시킵니다.
에구구.. 용일이형 말과 같이 콘트롤의 영역만 존재하는 이상한 폼이 되겟군요.
콘트롤들이 어떤 위치에 잇느냐에 따라서 상당히 이상한 폼이 될듯 하네요..
일단 모양을 여러가지로 하는건 핸들이 있는건 다 됩니다. 마지막 함수잇죠?
SetWindowRgn 저기에서 핸들이 들어갈수 잇는 콘틀롤은 다된다고 보시면 됩니다.. 뭐 동그란 버튼 <-- 이런게 된다는거죠. 물론 동작하는건 이상해서
콤포넌트를 다시 작업해줘야 겟지만. ㅎㅎ
중요한건 위에서 보이는 콤비네이션 하구요. Create 부분입니다.
Create관련하여서는 몇개의 함수가 더있거든요? 도움말을 참조 하시구요..
보통 원이나 사각형 polygon도 있으니 이런것들을 이용해서 이쁜 윈도우를 만듭니다..
한가지 부연설명 하자면 이건 투명한것과는 다른겁니다.
투명한건 내 윈도우 영역에 상위의 윈도우의 그림을 그리는겁니다.
따라서 실제로 윈도우는 존재하죠 그래서 마우스 클릭이라던지 이런 이벤트들이 먹습니다. 하지만 이건 영역자체가 없는것이기 때문에 위에서도 마찬가지로 콘트롤이 없는 부분은 바탕화면에 클릭이 되는것이죠..
잘모르시는거 같아서 쉽게 한다고 했는데 이해가 되었는지 모르겟네요.
그럼.