5

これまでのところ、SendMessage を介して GetThemePartSize、GetThemeMetric、GetSystemMetrics、WM_GETTITLEBARINFOEX、およびその他のいくつかの呼び出しを使用してみましたが、実際のサイズ (テーマが有効になっている Windows 7) に近づくことさえできませんでした。

基本的に私の質問は次のとおりです。これらのボタンのサイズ (および位置、理想的にはハンドルも) を取得する方法と、GetThemePartSize から取得した値は何を意味しますか? 彼らは何のために良いですか?

私はすでにこの回答と他の多くを見ましたが、それらは単に機能しません。

ありがとうございました

アップデート

ハンスの場合:

[DllImport("uxtheme", ExactSpelling=true)]
private extern static Int32 GetThemePartSize(IntPtr hTheme, IntPtr hdc, WindowPart part, WindowPartState state, ref RECT pRect, ThemeSize eSize, out SIZE size);

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int left; 
    public int top; 
    public int right;
    public int bottom;
}

[StructLayout(LayoutKind.Sequential)]
private struct SIZE
{
    public int cx;
    public int cy;
} 

private const int TS_TRUE = 1;
private const int CBS_NORMAL = 1;
private const int WP_CLOSEBUTTON = 18;
private const string VSCLASS_WINDOW = "WINDOW";

/* inside a method */
var rect = new RECT {left = 0, right = 200, top = 0, bottom = 200};
var size = new SIZE();
var windowHandle = new WindowInteropHelper({MyWindow}).Handle;
var theme = OpenThemeData(windowHandle, VSCLASS_WINDOW);
GetThemePartSize(theme, null, WP_CLOSEBUTTON, CBS_NORMAL, ref rect, TS_TRUE, ref size);

// result on w7 with default theme -> size.cx == 28, size.cy == 17
4

2 に答える 2

2

Firefox 17.0.1 のソース コード (つまり、ファイル nsNativeThemeWin.cpp および nsUXThemeData.cpp) を参照した後、Vista 以降で実行されているデスクトップ アプリの部分的な解決策を思いつくことができました。

private const int DWMWA_CAPTION_BUTTON_BOUNDS = 5;

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left;
    public int top;
    public int right; 
    public int bottom;
}

[DllImport("dwmapi.dll")]
public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute);

var windowHandle = new WindowInteropHelper(Main.Instance).Handle;
var buttonsRect = new RECT();
var sizeButtonsRect = Marshal.SizeOf(buttonsRect);
DwmGetWindowAttribute(windowHandle, DWMWA_CAPTION_BUTTON_BOUNDS, out buttonsRect, sizeButtonsRect);

buttonsRect に格納された結果はやや奇妙です: 幅の差 (右 - 左 == 105) は実際の境界に正確に適合しますが、高さの差 (29px) はボタンが実際に占める領域よりも 8 ピクセル大きくなります。

これはどの質問にも完全には答えていないので、このスレッドは今後の回答のために開いたままにします.

貴重でよく考え抜かれたコメントをありがとう、ハンス。ご覧のとおり、プログラミング言語とコード スニペットがすべてでした。

于 2013-01-01T20:13:31.333 に答える
1

Microsoft.Windows.Shell.dll をカスタム クロム ウィンドウ ライブラリと組み合わせて使用​​して、ウィンドウ ボタンを変更またはアドレス指定できます。Windows 8 UIスタイルのアプリケーションを作成するためにこれを使用しています

http://www.codeproject.com/Articles/131515/WPF-Custom-Chrome-Library

http://archive.msdn.microsoft.com/WPFShell

于 2013-01-01T16:50:01.500 に答える