FireMonkey의 Window Drag

5459 단어 FireMonkey델파이

테두리 없는 창 만들기



아래 그림과 같이 Window 의 BorderStyle 를 None 상태로 해


실행하면 ↓ 테두리도 타이틀 바도 없는 Client 영역만의 흰색 창이 생깁니다.


그렇지만, 이것이라면 이동조차 할 수 없어서 메짜 불편!

이동



VCL 의 때는 Window Message 의 WM_NCHITTEST 를 사용해 HTCAPTION 을 돌려주고 드래그 할 수 있도록 하는 것이 상보 수단이었습니다.

하지만 FireMonkey는 멀티 플랫폼 라이브러리이므로 Windows에서만 사용할 수있는이 방법은별로 사용하고 싶지 않습니다.

그래서!
FireMonkey 에는 StartWindowDrag 이라는 메소드가 TCommonCustomForm 에 준비되어 있습니다.

이것을 OnMouseDown 때 호출하면


이런 식으로 드래그 할 수 있습니다!


응?



드래그할 수 있으니까 뭐라고 하는….

그래서 모두 잊을지도 모릅니다만 TCommonCustomForm 에는 Transparency 라고 하는 프로퍼티가 있어요.

거기

모든 컨트롤이 투명하지는 않지만 평소와 같이 표시됩니다. 양식 배경만 투명 상태로 설정됩니다.

그리고 있습니다.
즉, TImage 라든가를 실어 거기에 투과 png 를 넣으면…


야터!
이미지의 형태로 잘라낸 창이 생겼어!

그건 그렇고

Transparency를 True로 설정하면 양식에 제목 표시줄이나 테두리가 표시되지 않습니다.

라고 있기 때문에 최초로 설정한 BorderStyle 은 특히 만질 필요는 없네요.

Desktop widget



그러면 Transparency 와 StartWindowDrag 를 사용하면 쉽게 위젯을 만들 수 있습니다.
다만, 위젯이라면 Taskbar의 표시를 지우고 싶네요…



지우는 방법은 아래와 같다.
이것에 관해서는 아무래도 따로따로 API를 호출하지 않으면 안됩니다.

Windows
uses
  Winapi.Windows, FMX.Platform.Win;

procedure HideTaskbar;
begin
  ShowWindow(ApplicationHWND, SW_HIDE);
end;

macOS
uses
  Macapi.AppKit;

procedure HideTaskbar;
var
  NSApp: NSApplication;
begin
  NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
  NSApp.setActivationPolicy(NSApplicationActivationPolicyAccessory);
end;

덧붙여서, Windows 판에서 부르고 있는 「ApplicationHWND」는 FMX.Platform.Win 에 정의하고 있는 함수로 Application 의 Window Handle 를 돌려줍니다.

그런데, 이것으로 Taskbar 로부터 사라졌습니다만, 사실은 TaskTray(Windows), StatusBar(macOS) 에 아이콘 표시시키고 싶네요.
다만, 이것은 이 기사에서 소개할 수 있는 분량이 아니기 때문에, 또 다음의 기회로 합니다!

우선, TPopupMenu 를 표시시켜 주면 종료시키거나 할 수 있습니다.


※ 덧붙여 FireMonkey 의 TForm 에는 PopupMenu 를 연결할 수 없기 때문에, 여기에서는 TImage 에 PopupMenu 를 관련짓고 있습니다. 따라서 StartWindowDrag도 TImage의 OnMouseDown에서 수행하도록 변경되었습니다.

요약



FireMonkey를 사용하면 Windows/macOS에서 데스크톱 위젯을 쉽게 만들 수 있습니다!

좋은 웹페이지 즐겨찾기