关于 无边框 程序 的二个问题

itakeblue 2009-12-21 02:15:44
当 FormBorderStyle 设置为 none 后:

1。因为去掉了边框,则最小化图标也被去除了。请问怎样设置可以在任务栏的当前程序栏(不是通知栏图标)上鼠标右键,能出现 关闭程序 的字样;

2。因为没有顶栏,所以要拖动程序的话,要自己写代码,一般做法实现的就是拖动程序,整个框体被拖动,在拖动过程中会不断重绘。这样视觉效果不是很好(即使用了双缓冲)。请问能不能做到向普通程序那样,拖动窗体出现的是一个框体大小的虚框,然后鼠标释放后,框体移动的目标位置。就象 msn 那样;

先谢了!
...全文
408 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leclilys 2012-09-07
  • 打赏
  • 举报
回复
这个我搞出来了,我项目就用的无边框窗体,移动的话最简单的方法就是在需要移动的窗体上面拖一个panel,然后写一个移动窗体panel的类,废话不多说,直接贴代码了:
using System;
using System.Collections.Generic;
using System.Text;

namespace CodeFile
{
using System.Windows.Forms;
internal class FormMove
{
private bool isMouseDown = false;
private System.Drawing.Point FormLocation; //form的location
private System.Drawing.Point mouseOffset; //鼠标的按下位置
private Form movedForm = null;
private Control conObj = null;

private FormMove()
{ }

/// <summary>
///
/// </summary>
/// <param name="movedForm">要移动的窗体</param>
/// <param name="conObj">控制窗体移动的控件,为null,则是窗体本身</param>
public FormMove(Form movedForm, Control conObj)
{
this.movedForm = movedForm;
this.conObj = (conObj == null) ? movedForm : conObj;
this.conObj.MouseDown += new MouseEventHandler(ConObj_MouseDown);
this.conObj.MouseMove += new MouseEventHandler(ConObj_MouseMove);
this.conObj.MouseUp += new MouseEventHandler(ConObj_MouseUp);
}


private void ConObj_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = true;
FormLocation = movedForm.Location;
mouseOffset = Control.MousePosition;
this.conObj.Cursor = System.Windows.Forms.Cursors.SizeAll;
}
}

private void ConObj_MouseUp(object sender, MouseEventArgs e)
{
this.conObj.Cursor = System.Windows.Forms.Cursors.Default;
isMouseDown = false;
}

private void ConObj_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
int _x = 0;
int _y = 0;
System.Drawing.Point pt = Control.MousePosition;
_x = mouseOffset.X - pt.X;
_y = mouseOffset.Y - pt.Y;

movedForm.Location = new System.Drawing.Point(FormLocation.X - _x, FormLocation.Y - _y);
}
}
}
}


两步操作:1,你建一个类,名字:FormMove.cs ,把代码全部复制粘贴进去,换掉引用。
2,在主窗体弄一个panel, 引用FromMove类,

在这句话 InitializeComponent(); 后面加上 new CodeFile.FormMove(this, this.panel);


保证ok啦 。。。不行给我说,QQ:347825064 随时欢迎咨询。
wujiliaang 2012-05-26
  • 打赏
  • 举报
回复
但是任务栏中找不到任务按钮,这点最可悲,最小化后连程序都找不到,这个不好解决。
古今多少事 2010-03-11
  • 打赏
  • 举报
回复
楼上,辛苦了!
pjagz 2010-02-18
  • 打赏
  • 举报
回复


'本示例模拟 最小化,最大化,关闭 按钮 (要用4个按钮图片)如要生动则要更多的图片
'使用3个(Label) 标签控件

Public Class Form1
Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click
Me.Close()
End Sub

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
Me.WindowState = FormWindowState.Minimized
End Sub

Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

If Me.WindowState = FormWindowState.Maximized Then
Me.WindowState = FormWindowState.Normal
Label2.Image = Image.FromFile("C:\Documents and Settings\Administrator\My Documents\ky2.bmp")
Else
Me.WindowState = FormWindowState.Maximized
Label2.Image = Image.FromFile("C:\Documents and Settings\Administrator\My Documents\ky4.bmp")
End If

End Sub
End Class
古今多少事 2010-02-10
  • 打赏
  • 举报
回复
继续顶!
回复内容太短了!
古今多少事 2010-01-14
  • 打赏
  • 举报
回复
……
ck11926375 2010-01-12
  • 打赏
  • 举报
回复

private void fmLogin_MouseDown(object sender, MouseEventArgs e)
{
int xOffset;
int yOffset;

if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight -
SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
}

private void fmLogin_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X+5, mouseOffset.Y+30);
Location = mousePos;
}
}

private void fmLogin_MouseUp(object sender, MouseEventArgs e)
{
// 修改鼠标状态isMouseDown的值
// 确保只有鼠标左键按下并移动时,才移动窗体
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
解释多余的 2010-01-12
  • 打赏
  • 举报
回复
mark
XTIAQGNUI 2010-01-11
  • 打赏
  • 举报
回复
我也来顶顶...
古今多少事 2010-01-10
  • 打赏
  • 举报
回复
第一个问题6L可以啊,第二个问题似乎受系统设置控制……不知道能不能针对单个窗体实现。UP!
cnzdgs 2009-12-24
  • 打赏
  • 举报
回复
1、按6楼的方法,这样改一下试试:
lStyle = (lStyle Or WS_SYSMENU) And Not WS_CAPTION
2、估计是你实现拖动的方法不对。重写WndProc,判断WM_NCHITTEST消息时,判断鼠标位置(LParam)在可拖动位置上时,返回HICAPTION。
itakeblue 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kuhura 的回复:]
第一个问题可以这样,用API解决
Private Declare Function SetWindowLong
....
[/Quote]

我试下来不行。。
appleller 2009-12-22
  • 打赏
  • 举报
回复
.............
kuhura 2009-12-22
  • 打赏
  • 举报
回复
第一个问题可以这样,用API解决
声明部分:
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer
Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000 '带标题栏的窗口
Private Const WS_SYSMENU = &H80000 '带系统菜单的窗口

初始化部分
Dim lStyle As Long = GetWindowLong(Me.Handle, GWL_STYLE)
lStyle = (lStyle Or WS_SYSMENU) And Not WS_CAPTION
SetWindowLong(Me.Handle, GWL_STYLE, lStyle)

测试过,没问题

第二个还没想好,考虑在鼠标按下并拖动时禁止重绘,在mouseup事件后恢复
itakeblue 2009-12-21
  • 打赏
  • 举报
回复
itakeblue 2009-12-21
  • 打赏
  • 举报
回复
顶啊
itakeblue 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 silentwins 的回复:]
1.自己另外添加按钮,实现最大小化、关闭按钮是可以的
[/Quote]
请问怎样在任务栏上的程序栏右键菜单上添加命令?
[Quote=引用 2 楼 的回复:]
1、在任务栏不用写什么吧,无论是文本文件,或者是文件夹,或者是其他执行程序,右键都会有关闭程序吧。
2、MouseDown事件记录鼠标坐标,MouseUp事件记录鼠标坐标,然后设置窗体位置
[/Quote]
1。你可以试下,FormBorderStyle 设置为 none 后,任务栏上右键什么都没的。。
2。这个做法就是我前面说的重绘,怎样能实现拖动的是一个虚框能?
it_gz_xi 2009-12-21
  • 打赏
  • 举报
回复
1、在任务栏不用写什么吧,无论是文本文件,或者是文件夹,或者是其他执行程序,右键都会有关闭程序吧。
2、MouseDown事件记录鼠标坐标,MouseUp事件记录鼠标坐标,然后设置窗体位置。
silentwins 2009-12-21
  • 打赏
  • 举报
回复
1.自己另外添加按钮,实现最大小化、关闭按钮是可以的

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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