10

私は WPF で独自のカスタム ウィンドウを設計しており、以前に WinForms で使用したサイズ変更機能を実装しようとしています。何らかの理由で、私の WndProc の戻り値が適切な結果を与えていません。

すべての WndProc メッセージと結果の NativeMethods クラスがあります。

public class NativeMethods
{
    public const int WM_NCHITTEST  = 0x84;
    public const int HTCAPTION     = 2;
    public const int HTLEFT        = 10;
    public const int HTRIGHT       = 11;
    public const int HTTOP         = 12;
    public const int HTTOPLEFT     = 13;
    public const int HTTOPRIGHT    = 14;
    public const int HTBOTTOM      = 15;
    public const int HTBOTTOMLEFT  = 16;
    public const int HTBOTTOMRIGHT = 17;
}

そして、ここに私のウィンドウのコードビハインドがあります:

public partial class MainWindow : Window
{
    const int GripSize   = 16;
    const int BorderSize = 7;

    public MainWindow()
    {
        InitializeComponent();
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        IntPtr windowHandle = new WindowInteropHelper(this).Handle;
        HwndSource windowSource = HwndSource.FromHwnd(windowHandle);
        windowSource.AddHook(WndProc);
    }

    private IntPtr WndProc(IntPtr hwnd, int msg,
        IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == NativeMethods.WM_NCHITTEST)
        {
            int x = lParam.ToInt32() << 16 >> 16, y = lParam.ToInt32() >> 16;
            Point pos = PointFromScreen(new Point(x, y));

            if (pos.X > GripSize && 
                pos.X < ActualWidth - GripSize &&
                pos.Y >= ActualHeight - BorderSize)
            {
                return (IntPtr)NativeMethods.HTBOTTOM; // This doesn't work?
            }

            // Top, Left, Right, Corners, Etc.
        }

        return IntPtr.Zero;
    }
}

カーソルが「サイズ変更下矢印」に変わり、サイズ変更機能が WinForms プロジェクトと同じように機能することを期待していました。ブレークポイントを設定しましたが、カーソルが予想される位置にあるときに HTBOTTOM リターンが発生します。XAML では、ResizeMode を CanResize に設定し、WindowStyle を None に設定しています。私は何を間違っていますか?

4

3 に答える 3

16

おそらく、WindowChrome を割り当てる方が簡単です。コメントによると、グリップを使用するだけでなく、すべての側面からサイズを変更できる必要があります。達成する)

<Window x:Class="MVVMProtoType.View.Test.Test"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Test" Height="300" Width="300" WindowStyle="None" AllowsTransparency="False" ResizeMode="CanResizeWithGrip">

コード ビハインドでは、window に Window Chrome を設定する必要があります。あなたはこのようにすることができます:

WindowChrome.SetWindowChrome(this, new WindowChrome());

または 、次のようなウィンドウ スタイルにセッターを使用できます。

<Setter Property="WindowChrome.WindowChrome">
        <Setter.Value>
            <WindowChrome CornerRadius="0" GlassFrameThickness="1" UseAeroCaptionButtons="False"/>
        </Setter.Value>
</Setter>

詳細については、MSDN リンク

WindowChrome クラスは .NET 4.5 Framework の一部であることに注意してください。.NET 4.0 ユーザーは、 archive.msdn.microsoft.com /WPFShell をチェックしてください

于 2013-12-10T15:08:37.430 に答える
7

別の投稿で解決策を書きました。ウィンドウのサイズを変更できます。.NET 4.5 または WPFShell を使用する必要があります。

このように WindowChrome コードを MainWindow.xaml に直接配置することもでき、セッターを配置しなくても完全に機能します。

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Concursos"
    mc:Ignorable="d"
    Title="Concuros" Height="350" Width="525"
    WindowStyle="None"
    WindowState="Normal" 
    ResizeMode="CanResize"
    >
<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

    <Grid>

    <YOUR CODE HERE

</Grid>

ここにアクセスして、完全な投稿を表示できます。

解決

前後はこちら

チャレンジ ソリューション

于 2016-03-28T09:39:29.017 に答える