WPF 無框視窗改變大小
過載WndProc函式 捕獲WM_NCHITTEST訊息,網上有很多wpf五礦窗體改變大小的程式碼。。。而且都是一樣的。。。。
我也是看了一個帖子之後才明白的
其中的一段程式碼可以借鑑:
<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
partialclassWindow1 : System.Windows.Window
{
publicWindow1()
{
this.SourceInitialized += newEventHandler(Window1_SourceInitialized);
InitializeComponent();
}
void Window1_SourceInitialized(object sender, EventArgse)
{
HwndSource hwndSource = PresentationSource.FromVisual((;
hwndSource.AddHook(
newHwndSourceHook(WndProc));
}
privateconstintWM_NCHITTEST = 0x0084;
privateIntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, refboolhandled)
{
if(msg == WM_NCHITTEST)
{
intxPos = GET_X_LPARAM(lParam.ToInt32());
intyPos = GET_Y_LPARAM(lParam.ToInt32());
.Left;
double yIn = yPos - this.Top;
System.Diagnostics.
Debug.WriteLine("x:" + xIn.ToString() + " y:"+ yIn.ToString());
if(xIn < 2)
{
handled =
true;
returnnewIntPtr((int)HitTest.HTLEFT);
}
}
returnIntPtr.Zero;
}
publicstaticInt32 GET_X_LPARAM(intlParam)
{
return(lParam & 0xffff);
}
publicstaticInt32 GET_Y_LPARAM(intlParam)
{
return(lParam >> 16);
}
publicenumHitTest
{
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有詳細資料