WPFで枠を消すその2

WPFで枠を消す の続きです。

前回紹介した方法は、以下のような内容でした。

  • WindowStyle=None, AllowsTransparency=True にすると枠が消える
  • 移動できるように、WM_NCLBUTTONDOWN + HTCAPTION を送信する

しかし、この方法には欠点があります。
AllowsTransparencyを有効にしていると、WindowsFormsHostが表示されなくなってしまうのです。

http://msdn.microsoft.com/ja-jp/library/aa970911(VS.80).aspx

HwndHost クラスは、レイヤ表示をサポートしません。つまり、WindowsFormsHost 要素で Opacity プロパティを設定しても何の効果もなく、AllowsTransparency が true に設定されている他の WPF ウィンドウとのブレンド操作は行われません。

そこで、DirectX と連携する際などは、AllowsTransparency を False のままにしておく必要があります。

困ったときのWinAPI。直接ウィンドウスタイルを設定して、枠を消してしまいましょう。
Windows Forms Application 時代は、CreateParams で設定していたような内容ですね。

[DllImport("user32.dll")]
static extern long GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32.dll")]
static extern long SetWindowLong(IntPtr hWnd, int nIndex, long dwNewLong);

[DllImport("user32.dll")]
static extern UInt32 SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);

private void RemoveFrame()
{
	long WS_THICKFRAME = 0x00040000L;
	int GWL_STYLE = -16;
	int SWP_FRAMECHANGED = 0x0020;
	int SWP_NOSIZE = 0x1;
	int SWP_NOMOVE = 0x2;
	int SWP_NOZORDER = 0x4;

	IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
	SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) ^ WS_THICKFRAME);

	SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
}

やっていることは以下のような感じです。

  • GetWindowLongでWindowStyleを取得
  • SetWindowLongで、今までのスタイルからWS_THICKFRAME(ウィンドウ枠)を除いたものを設定
  • SetWindowPosで表示を更新

最後のSetWindowPostをやらないと、サイズ変更するまで描画が崩れてしまいます。

注意点としては、WS_THICKFRAME を外すと、WM_NCLBUTTONDOWN で HTBOTTOMRIGHT を送信しても、サイズ変更できなくなります。
諦めて、自分でサイズ変更処理を書くしかないみたいですね。

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(16区分17回 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、Ruby Programmer Gold、AWSソリューションアーキテクト(アソシエイト)、日商簿記2級、漢検準1級などを保有。

babaの書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ