本文介绍操作无边框窗体的其他几个方面的技巧。

设置浮动菜单

通常情况下,在无边框窗体中不能设置菜单。如果在无边框窗体中设置了菜单,运行时窗体上就会出现标题栏。那么,是否在无边框窗体中就不能使用菜单了呢?答案是否定的。下面我们介绍用“借鸡下蛋”的方法在窗体中设置浮动菜单。

首先借“鸡”——再添加一个窗体,然后用这个“鸡”来下“蛋”——设置菜单。具体操作步骤如下:

1.在默认名为Form1的窗体的属性窗口中设置BorderStyle值为0-vbBSNone(没有边框或与边框相关的元素)。

2.从菜单“工程/添加窗体”中添加一个窗体Form2。

3.在Form2中,单击工具栏中的“菜单编辑器”。在弹出的“菜单编辑器”窗口中,按需要设置一个顶级菜单,下设若干个菜单项(至少一个),并设置好顶级菜单及各菜单项的标题(菜单中显示的文字)和名称(程序调用所需的名称)。注意:此时其顶级菜单的“可见性”可任意设置,因为本文程序中并不需要把这个窗体显示出来(而在一般的浮动菜单中其“可见性”必须设为False)。

4.在Form1的Form_MouseUp过程中添加以下代码:

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

’如果用户按的是鼠标右键

If Button = 2 Then

注释:激活Form2的浮动菜单,mnuMain为顶级菜单名称

PopupMenu Form2.mnuMain

End If

End Sub

5.在Form2的各菜单项的单击事件过程中输入有关代码。

编译并运行后,在Form1上点击右键就会弹出设定的菜单。在利用这种方法时,有两点需要注意:一是这种方法虽然多添加了一个窗体,资源略显“浪费”,但实现了编程愿望,也不枉然。而且如果程序中除主窗体外,还需要一个有标题栏的窗体(如“关于”对话框),则可以把菜单建在该窗体中(设计时,使顶级菜单不可见,当然其BorderStyle值不能为0)。这样,不但系统资源得到了充分利用,而且设想的功能也全部实现。二是在Form1窗体中,每次调用Form2的浮动菜单时,会先在窗体Form2中产生Initialize事件,再产生Load事件,然后显示浮动菜单。因此编程时,如果在Form2中含有涉及到上述两过程的代码调用,一定要加以注意。

在任务栏中显示图标与系统菜单

默认情况下,无边框窗体不在任务栏中显示图标。一般情况下,要使它能在任务栏中显示,只要将其ShowInTaskbar属性设为True。但此时只有标题没有图标,而且,通常情况下的任务栏中鼠标右键的系统菜单也没有。

实际上,我们可以用API函数来解决此问题。首先将下面的代码放入窗体的声明段中:

注释:为指定窗体设置信息

Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_STYLE = (-16)

Private Const WS_SYSMENU = &H80000

Private Const WS_SIZEBOX = &H40000

Private Const WS_MAXIMIZEBOX = &H10000

Private Const WS_MINIMIZEBOX = &H20000

然后在窗体的Load事件过程中添加如下代码:

Private Sub Form_Load()

Dim lStyle As Long

’为任务栏添加图标和系统菜单(仅关闭和移动两个菜单项有效)

lStyle = WS_SYSMENU

’使“大小”有效

lStyle = lStyle Or WS_SIZEBOX

’使“最大化”有效

lStyle = lStyle Or WS_MAXIMIZEBOX

’使“最小化”有效

lStyle = lStyle Or WS_MINIMIZEBOX

’确定以上设置

SetWindowLong hWnd, GWL_STYLE, lStyle

End Sub

运行后就会发现,在任务栏中标题和图标都有了,点击右键也出现了系统菜单,并且其效果与常规的基本一致。与常规窗口不同的有两个地方:一是窗口处于活动状态时,单击不能将其最小化,但用标题栏中的菜单最小化时单击任务栏能恢复。二是“关闭”功能失效,并且当改变了窗体大小时,窗体的效果由原来的平面变为3D,这时可用鼠标调整窗体大小。

窗体式样的变化

由于Form的BorderStyle属性在运行时是只读的,所以一般情况下在运行时不能改变窗体式样。但我们可以通过API函数并结合上节的相关内容来实现无边框窗体与普通窗体之间的转换,实际上是在保持BorderStyle属性不变的情况下,对标题栏进行了显示与隐藏的操作。

首先新建一个工程,在代码窗口添加以下声明和过程代码:

’设置窗体结构信息函数

Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

’获取窗体结构信息函数

Private Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA”(ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)

Private Const WS_SYSMENU = &H80000

Private Const WS_CAPTION = &HC00000

Private Const WS_SIZEBOX = &H40000

Private Const WS_MAXIMIZEBOX = &H10000

Private Const WS_MINIMIZEBOX = &H20000

’为窗体指定一个新位置和状态函数

Private Declare Function SetWindowPos Lib “user32”(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const SWP_NOZORDER = &H4

Private Const SWP_FRAMECHANGED = &H20

Private Const SWP_NOREPOSITION = &H200

’获得整个窗体的大小和位置

Private Declare Function GetWindowRect Lib “user32”(ByVal hwnd As Long, lpRect As RECT) As Long

Private Type RECT

Left As Long

Top As Long

Right As Long

Bottom As Long

End Type

Private Sub Form_Click()

Dim lStyle As Long

Dim MyRect As RECT

Dim Change As Boolean

’获取窗体的大小和位置

GetWindowRect Me.hwnd, MyRect

’取得当前窗体信息

lStyle=GetWindowLong(Me.hwnd, GWL_STYLE)

If Change Then

’分别使系统菜单(包括图标)、标题、大小、最大化、最小化显示/有效

lStyle = lStyle Or WS_SYSMENU

lStyle = lStyle Or WS_CAPTION

lStyle = lStyle Or WS_SIZEBOX

lStyle = lStyle Or WS_MAXIMIZEBOX

lStyle = lStyle Or WS_MINIMIZEBOX

Else

’分别使系统菜单(包括图标)、标题、大小、最大化、最小化隐藏/无效

lStyle = lStyle And Not WS_SYSMENU

lStyle = lStyle And Not WS_CAPTION

lStyle = lStyle And Not WS_SIZEBOX

lStyle = lStyle And Not WS_MAXIMIZEBOX

lStyle = lStyle And Not WS_MINIMIZEBOX

End If

’按lStyle的值设置窗体信息

SetWindowLong Me.hwnd, GWL_STYLE, lStyle

’保持窗体的大小与位置不变

SetWindowPos Me.hwnd, 0, MyRect.Left, MyRect.Top,MyRect.Right - MyRect.Left,

MyRect.Bottom - MyRect.Top,SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED

’改变显示/隐藏状态

Change = Not Change

End Sub

这样,每次单击窗体,标题栏就会在显示和隐藏之间进行切换。

转载于:https://www.cnblogs.com/tanghuawei/archive/2007/01/12/618837.html

再谈无边框窗体的操作相关推荐

  1. 拖动无边框窗体(VB6代码)

    简单代码片段,记录一下备用. Option Explicit Dim mX As Long, mY As Long Private Sub Form_MouseDown(Button As Integ ...

  2. 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)

    首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完 ...

  3. Qt无边框窗体(Windows)

    Qt无边框窗体Windows篇 去掉标题栏和边框 实现拖拽功能 还原窗体功能 注意点 我们可以做的更好 添加阴影 亚克力面板效果 结语 去掉标题栏和边框 首先第一步我们要通过设置系统绘制的边框消失 s ...

  4. WPF 调用API修改窗体风格实现真正的无边框窗体

    原文:WPF 调用API修改窗体风格实现真正的无边框窗体 WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm ...

  5. 无边框窗体和用户控件以及权限

    无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [Dl ...

  6. 无边框窗体移动的方法

    文章目录 1 无边框窗体移动的方法 1.1 无边框窗体移动的方法 1 无边框窗体移动的方法 1.1 无边框窗体移动的方法 当我们把窗体设置为无边框后,会发现用鼠标拖动窗体时是没有反应的,我们需要在窗体 ...

  7. 通过调用API函数实现的无边框窗体的拖拽,比判断坐标更快捷

    在winform程序中,有时会选择边框设计会none,但是这样就不能拖拽窗体移动 解决方案有二: 1,判断坐标控制拖拽 2.利用API函数, 下面介绍利用API函数,方便,快捷 #region 移动无 ...

  8. 01.WPF中制作无边框窗体

    [引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBor ...

  9. 【C#】使用DWM实现无边框窗体阴影或全透窗体

    1.无边框窗体阴影,win7(需要开启Aero效果)及以上系统 public class LdwmForm : Form{public LdwmForm(){Initialize();}/// < ...

最新文章

  1. Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
  2. 合并html文件工具,整合 DevTools 和 Chrome
  3. 计算机网络期中考试总结反思,期中考试总结反思作文(通用6篇)
  4. esp8266驱动oled屏幕_为什么“更好的OLED电视”在海信?
  5. ES6基础4(数据结构)-学习笔记
  6. 树形结构递归初始化(父节点,统计字段等)
  7. sublime3 常用功能总结
  8. Centos/Linux下如何查看网关地址/Gateway地址
  9. gdb调试daemon程序
  10. 智慧城市网络安全建设框架及实践
  11. 如何加密PDF?使用福昕PDF编辑器加密PDF文件实操
  12. PDF怎么快速统计文档字数?这两种方法很简单
  13. 多省市房屋交易平台引入电子签章推动住房交易合同网签备案
  14. 修改人人商城支付后报错“服务器暂时无法处理您的请求,请稍后重试“
  15. 《王者荣耀游戏服务器架构演进(完整版)》读后感
  16. uni-app 中如何使用谷歌地图 !?
  17. 2022年最新前端面试题、高频面试题、面试题总结
  18. 强一致性、弱一致性、顺序一致性、最终一致性概述
  19. android+jiaozi播放器,android视频播放-饺子播放器
  20. 全网最全最新最细的MYSQL5.7下载安装图文教程

热门文章

  1. [ActiveMQ]初识ActiveMQ
  2. Android学习--09-广播
  3. android file.createnewfile ioexception
  4. Kafka项目实战-用户日志上报实时统计之编码实践
  5. HDU-1051 Wooden Sticks
  6. 15种网站最差的用户体验
  7. The user does not exist or is not unique错误
  8. 【备忘录】使用mongodb,报db.collection is not a function
  9. pyplot绘图标题错误处理
  10. 社会主义基本经济规律是经济效益规律