跪求高人解答wpf无样式窗口改变窗口大小问题

shabby1886 2012-05-24 04:56:28
我有一个窗口设置了无样式属性WindowStyle="None"。所以改变窗口大小的操作是有代码操作的
首先判断鼠标是否进入了窗口的特定范围,如果是,再判断鼠标左键是否按下,如果是,就调用
win32 api的SendMessage函数,这时,在按住鼠标左键的状态下,就可以拖动鼠标改变窗口大小。
现在出现的问题是,我设置的窗口的MinWidth和MinHeight,完全被SendMessage函数忽略了,请
教有什么办法可以在改变窗口大小的时候,当width和height等于minwidth和minheight时,就
停止拖小,只能拖大??不盛感激
...全文
329 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzybl 2013-12-24
  • 打赏
  • 举报
回复
撸主最后这个问题解决了么?我也碰到的是这个 贴一下解决办法啊
doerszetasoft 2013-07-26
  • 打赏
  • 举报
回复
//因为wpf事件路由为冒泡或者隧道,所以处理鼠标左键按下事件就可以了,判断ClickCount==2就知道是双击 private void TitleBar_MouseLeftDown(object sender,MouseButtonEventArgs e) { Window win = (Window)((FrameworkElement)sender).TemplatedParent; if (e.ClickCount == 2) { //win.Close(); //在这里调用最大化窗体或者还原! return; } win.DragMove(); }
doerszetasoft 2013-07-26
  • 打赏
  • 举报
回复
private void TitleBar_MouseLeftDown(object sender,MouseButtonEventArgs e) { Window win = (Window)((FrameworkElement)sender).TemplatedParent; if (e.ClickCount == 2) { //win.Close(); //在这里调用最大化窗体或者还原! return; } win.DragMove(); }
dipwater 2012-08-08
  • 打赏
  • 举报
回复
WPF下的窗口设置 ResizeMode="CanResizeWithGrip" 然后就可以直接设置窗口的 Width 和 Height 来改变窗口大小了,而且 MinWidth 和 MinHeight 是起作用的。
private void window_Resize(object sender, System.Windows.Input.MouseEventArgs e)
{
if (resizeType == ResizeType.Width)
{
double width = e.GetPosition(win).X + 5;
if (width > 0)
{
win.Width = width;
}
}
if (resizeType == ResizeType.Height)
{
double height = e.GetPosition(win).Y + 5;
if (height > 0)
{
win.Height = height;
}
}
}
shabby1886 2012-05-25
  • 打赏
  • 举报
回复
暂时不结贴,==看有木有高人再进来指点一二
shabby1886 2012-05-25
  • 打赏
  • 举报
回复
恩,我最想要的是有一个监听,在实时的窗口改变大小的过程中,判断窗口的宽高,不过现在只能试试其他的API了,3Q cnfixit
cnfixit 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:
我只能看出来你发的WM_SYSCOMMAND的消息,61444貌似是以右下角为基点改变Form.Width,Form.Height

你的这个事件选的不太合适,你要求的是拖动鼠标改变窗口的大小,那么就应该在MouseMove事件里面的处理

在那里应该可以判断
我的确是在MouseMove事件中改变窗口大小的,61444是改变左上角,我总共有8个方向的改变。……
[/Quote]

有句柄的话有没有试试MoveWindow,要不试试PostMessage?
shabby1886 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
加个SizeChanged 事件 可以吧
[/Quote]SizeChanged事件是在窗口改变大小的操作完成以后才触发的
shabby1886 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
我只能看出来你发的WM_SYSCOMMAND的消息,61444貌似是以右下角为基点改变Form.Width,Form.Height

你的这个事件选的不太合适,你要求的是拖动鼠标改变窗口的大小,那么就应该在MouseMove事件里面的处理

在那里应该可以判断
[/Quote]我的确是在MouseMove事件中改变窗口大小的,61444是改变左上角,我总共有8个方向的改变。问题就是只要使用了SendMessage这个API,一旦可以拖动开始改变大小的时候,就停不下来,可以一直拖到窗口只有一点点的大小,因为MouseMove事件也是需要等待SendMessage函数返回了,才结束,才会执行下一次的MouseMove,而在SendMessage函数返回前,窗口是可以任意改变大小,这让我很苦恼。。。
qingfeng5251 2012-05-24
  • 打赏
  • 举报
回复
加个SizeChanged 事件 可以吧
E次奥 2012-05-24
  • 打赏
  • 举报
回复
判断的时候直接和数字比较。
cnfixit 2012-05-24
  • 打赏
  • 举报
回复
我只能看出来你发的WM_SYSCOMMAND的消息,61444貌似是以右下角为基点改变Form.Width,Form.Height

你的这个事件选的不太合适,你要求的是拖动鼠标改变窗口的大小,那么就应该在MouseMove事件里面的处理

在那里应该可以判断
shabby1886 2012-05-24
  • 打赏
  • 举报
回复
有没有办法在拖动大小的时候,有一个监听功能去判断如果拖到最小宽的时候,就不允许继续减小宽度,而只能增大宽度??
shabby1886 2012-05-24
  • 打赏
  • 举报
回复
if (e.LeftButton == MouseButtonState.Pressed)
{
Win32.SendMessage(_HwndSource.Handle, 0x112, (IntPtr)(61444), IntPtr.Zero);
}
_HwndSource.Handle是窗口的句柄

判断了窗口大小也没用。比如
if(this.ActualWidth > this.MinWidth)
//执行SendMessage()
条件只是限制在窗口宽小于最小宽的时候,不执行
如果宽大于最小宽,就可以执行,只要一旦执行了SendMessage,就可以随意拖动了,而无视了最小宽和高
cnfixit 2012-05-24
  • 打赏
  • 举报
回复
你SendMessage发的是什么消息?拖动鼠标的时候可不可以先判断窗口大小再发消息?

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧