重载WndProc函数 捕获WM_NCHITTEST消息,网上有很多wpf五矿窗体改变大小的代码。。。而且都是一样的。。。。
我也是看了一个帖子之后才明白的
地址是http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/77b566aa-be88-47a4-8c29-b1e44946348e/
其中的一段代码可以借鉴:
<Window x:Class="WpfTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowTransparency" Height="483" Width="300" WindowStartupLocation="CenterScreen" WindowStyle="None" Background="Transparent" AllowsTransparency="True" x:Name="WindowName" BorderBrush="#FFEE1515" BorderThickness="1,1,1,1">
<DockPanel x:Name="PanelMain">
<Border Width="Auto" Height="Auto" CornerRadius="10,10,10,10" Canvas.Left="8" Canvas.Top="8" Background="Azure" x:Name="MainBorder"/>
</DockPanel>
</Window>
public
partial class Window1 : System.Windows.
Window
{
public
Window1()
{
this .SourceInitialized += new EventHandler
(Window1_SourceInitialized);
InitializeComponent();
}
void Window1_SourceInitialized( object sender, EventArgs
e)
{
HwndSource hwndSource = PresentationSource .FromVisual(( Visual )sender) as HwndSource
;
hwndSource.AddHook(
new HwndSourceHook
(WndProc));
}
private const int
WM_NCHITTEST = 0x0084;
private IntPtr WndProc( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool
handled)
{
if
(msg == WM_NCHITTEST)
{
int
xPos = GET_X_LPARAM(lParam.ToInt32());
int
yPos = GET_Y_LPARAM(lParam.ToInt32());
double xIn = xPos - this
.Left;
double yIn = yPos - this
.Top;
System.Diagnostics.
Debug .WriteLine( "x:" + xIn.ToString() + " y:"
+ yIn.ToString());
if
(xIn < 2)
{
handled =
true
;
return new IntPtr (( int ) HitTest
.HTLEFT);
}
}
return IntPtr
.Zero;
}
public static Int32 GET_X_LPARAM( int
lParam)
{
return
(lParam & 0xffff);
}
public static Int32 GET_Y_LPARAM( int
lParam)
{
return
(lParam >> 16);
}
public enum
HitTest
{
HTERROR = -2,
HTTRANSPARENT = -1,
HTNOWHERE = 0,
HTCLIENT = 1,
HTCAPTION = 2,
HTSYSMENU = 3,
HTGROWBOX = 4,
HTSIZE = HTGROWBOX,
HTMENU = 5,
HTHSCROLL = 6,
HTVSCROLL = 7,
HTMINBUTTON = 8,
HTMAXBUTTON = 9,
HTLEFT = 10,
HTRIGHT = 11,
HTTOP = 12,
HTTOPLEFT = 13,
HTTOPRIGHT = 14,
HTBOTTOM = 15,
HTBOTTOMLEFT = 16,
HTBOTTOMRIGHT = 17,
HTBORDER = 18,
HTREDUCE = HTMINBUTTON,
HTZOOM = HTMAXBUTTON,
HTSIZEFIRST = HTLEFT,
HTSIZELAST = HTBOTTOMRIGHT,
HTOBJECT = 19,
HTCLOSE = 20,
HTHELP = 21,
}
}
当我把resizemode设置成 none 的时候是不行的。。。。。所以要实现五矿窗体只能用
WindowStyle="None" AllowsTransparency="True" 来实现
至于WM_NCHITTEST 网上和msdn有详细资料