지금 투명폼을 만들고 있는데요...
아래의 소스처럼 만들면 자주 깜박거려 문제가 있구여...
Invalidete구절을 생략 하면 처음은 투명이 되지만 이미지 이동시에는 이전 상태의
이미지가 계속 같이 움직이 더라구요...
그리구 예를 들어 아래와 같은 이미지
+---+ <-(1)
| +---------+
| <-(2) |
| +---------+
+---+
(1) 번부분에서도 마우스를 (투명 처리부분)되어도 이동하거든요 ...
(2) 번부분만 마우스를 작동 되게 하구 싶습니다...
마스크 이미지를 만들어 처리 하구 싶지만 방식을 몰라 고전 중입니당...
영대님이 만드신 NeoBrowser 처럼 화면이 이동하는 폼을 만들고 싶어요 -_-;;
도움 주시면 고맙겠습니다...
참고로 아래의 소스는 상하로만 움직이게 제가 고정 시켰습니다.
procedure TOnlineForm.IMGMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
yMouse := y;
MoveFlags := true;
end;
procedure TOnlineForm.IMGMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var top_pos : Integer;
NewRect : TRect;
begin
if MoveFlags then begin
SystemParametersInfo(SPI_GETWORKAREA, 0, Pointer(@NewRect), 0);
top_pos := top - yMouse + y;
if top_pos < 0 then top_pos := 0;
if (height + top_pos) > NewRect.Bottom then top_pos := NewRect.Bottom - height;
SetWindowPos(handle, HWND_TOP, left,top_pos, width, height, SWP_NOZORDER);
end;
end;
procedure TOnlineForm.IMGMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MoveFlags := false;
end;
procedure TOnlineForm.FormShow(Sender: TObject);
begin
top := 0;
left := 0;
Height := IMG.Height;
Width := IMG.Width;
MoveFlags := False;
end;
procedure TOnlineForm.CreateParams(var P: TCreateParams);
begin
inherited CreateParams(P);
P.ExStyle := P.ExStyle or WS_EX_TRANSPARENT;
OnlineForm.Brush.Style := bsClear;
end;
procedure TOnlineForm.FormPaint(Sender: TObject);
begin
Invalidate;
end;
저는 김병건님과 같은 문제로 고민을 하다가 간단한 방법을 생각했습니다.
폼에 우선 이미지콘트롤을 깐다음에...
이미지의 경계선을 검출하는 루틴을 만듭니다..
그래서 그 포인트들을 일정한 버퍼에 넣고 나서는
ppPoint := TPointType(RgnStream.memory);
Wrgn := CreatePolygonRgn(ppPoint^,i,WINDING);
RgnStream.Free;
SetWindowRgn(handle,Wrgn,True);
이렇게 코딩을 하는거죠...
물론 RgnStream에 경계좌표가 줄을 이어서 써져있는거죠..
그러면 정확히 그림이 있는곳의 영역을 짤라서 움직일 수 있을겁니다.
빈공간의 움직임도 없을테구요..
그럼...
김병건 wrote:
> 지금 투명폼을 만들고 있는데요...
> 아래의 소스처럼 만들면 자주 깜박거려 문제가 있구여...
> Invalidete구절을 생략 하면 처음은 투명이 되지만 이미지 이동시에는 이전 상태의
> 이미지가 계속 같이 움직이 더라구요...
> 그리구 예를 들어 아래와 같은 이미지
> +---+ <-(1)
> | +---------+
> | <-(2) |
> | +---------+
> +---+
> (1) 번부분에서도 마우스를 (투명 처리부분)되어도 이동하거든요 ...
> (2) 번부분만 마우스를 작동 되게 하구 싶습니다...
> 마스크 이미지를 만들어 처리 하구 싶지만 방식을 몰라 고전 중입니당...
> 영대님이 만드신 NeoBrowser 처럼 화면이 이동하는 폼을 만들고 싶어요 -_-;;
> 도움 주시면 고맙겠습니다...
>
> 참고로 아래의 소스는 상하로만 움직이게 제가 고정 시켰습니다.
>
> procedure TOnlineForm.IMGMouseDown(Sender: TObject; Button: TMouseButton;
> Shift: TShiftState; X, Y: Integer);
> begin
> yMouse := y;
> MoveFlags := true;
> end;
>
> procedure TOnlineForm.IMGMouseMove(Sender: TObject; Shift: TShiftState; X,
> Y: Integer);
> var top_pos : Integer;
> NewRect : TRect;
> begin
> if MoveFlags then begin
> SystemParametersInfo(SPI_GETWORKAREA, 0, Pointer(@NewRect), 0);
> top_pos := top - yMouse + y;
> if top_pos < 0 then top_pos := 0;
> if (height + top_pos) > NewRect.Bottom then top_pos := NewRect.Bottom - height;
> SetWindowPos(handle, HWND_TOP, left,top_pos, width, height, SWP_NOZORDER);
> end;
> end;
>
> procedure TOnlineForm.IMGMouseUp(Sender: TObject; Button: TMouseButton;
> Shift: TShiftState; X, Y: Integer);
> begin
> MoveFlags := false;
> end;
>
> procedure TOnlineForm.FormShow(Sender: TObject);
> begin
> top := 0;
> left := 0;
> Height := IMG.Height;
> Width := IMG.Width;
> MoveFlags := False;
> end;
>
> procedure TOnlineForm.CreateParams(var P: TCreateParams);
> begin
> inherited CreateParams(P);
>
> P.ExStyle := P.ExStyle or WS_EX_TRANSPARENT;
> OnlineForm.Brush.Style := bsClear;
> end;
>
> procedure TOnlineForm.FormPaint(Sender: TObject);
> begin
> Invalidate;
> end;
>