6

お気に入りのプロジェクトとして、私は Aero Glass 効果を SWT アプリケーションに統合するという概念を試してきました。Łukasz Milewski は、これをどのように達成できるかを説明する優れたブログ投稿を行っています。

final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FormLayout());
final MARGINS margins = new MARGINS();
margins.cyTopHeight = -1;

final Composite c = new Composite(shell, SWT.NORMAL);
c.setBackground(new Color(shell.getDisplay(), new RGB(0, 0, 0)));
final FormData fd = new FormData();
fd.top = new FormAttachment(0, 0);
fd.left = new FormAttachment(0, 0);
fd.right = new FormAttachment(100, 0);
fd.bottom = new FormAttachment(100, 0);
c.setLayoutData(fd);

OS.DwmExtendFrameIntoClientArea(shell.handle, margins);

shell.open();
while (!shell.isDisposed()) {
    if (!display.readAndDispatch()) {
        display.sleep();
    }
}

コントロールを追加するまで、これは美しく機能します。これにより、黒は透明のままになります。

コントロール付き透明シェル

フォローアップ投稿でもこれを行う方法を示していますが、SWT ライブラリを変更する必要があります。(少なくとも、プライベート SWT 関数は でオーバーライドされるため、私はそう信じてい@Overrideます。)

コントロールが透明にならないようにするにはどうすればよいですか? さらに良いことに、透明性の恩恵を受けるにはどうすればよいですか (たとえば、その上に画像を配置するなど)、それを賢明な方法で使用するにはどうすればよいですか?

4

3 に答える 3

2

オーバーライドされたメソッドは「パッケージ プライベート」です。org.eclipse.swtコンパイル時のエラーなしでそれらをオーバーライドするには、クラスをスーパークラスと同じパッケージ、つまりパッケージに入れる必要がありorg.eclipse.swt.widgetsます。あなたが引用したブログの投稿では、実際にこの実装の詳細が最後に言及されているため、わかりません。これが本当にあなたの質問に答えているかどうかはわかりません。

于 2010-09-10T17:55:08.710 に答える
0

内部メソッドをオーバーライドするソリューションに関心がありますが、そもそも内部 SWT クラスを使用しています。これは、(少なくとも現在の SWT 実装では) アプリに見栄えを良くするための非常にハックで脆弱な方法のように思えます... 本番コードでこれを行っていないことを願っています。

于 2010-09-09T17:44:02.677 に答える
0

コントロールをガラス領域を超えて配置するか、コントロールに強制背景色を使用してみてください。

于 2010-09-09T11:57:02.390 に答える