对话框最小化后单击右键的菜单功能问题

hys1022 2007-08-28 03:22:37
如何在对话框设置中不选“System menu”,然后在对话框最小化后添加菜单功能和自己想要的功能选项?
有个例子或代码就最好不过了。
先谢了!!!
...全文
481 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hys1022 2007-09-06
  • 打赏
  • 举报
回复
有谁能给段VC得代码看看?有关窗口最小化后点鼠标右键弹出菜单功能的实现(不要在窗口属性中选“System Menu”)?

Waiting......
hys1022 2007-08-29
  • 打赏
  • 举报
回复
很不好意思,因为这是别人写的代码,我不是很懂,请见谅!
至于自己手动写代码建的对话框这句话的意思是因为我没有看见工程里建有对话框,这是一个主对话框,
它应该是通过初始化来画出最小化,最大化按钮和设置一些其它参数(比如标题栏颜色等)。
leaf__leaf 2007-08-28
  • 打赏
  • 举报
回复
自己手动写代码建的对话框,运行程序后最小化窗口
这个是什么意思?而且看你写的,好像这个对话框是没有标题栏,然后自己画出来的对吗?
’分别使系统菜单(包括图标)、标题、大小、最大化、最小化显示/有效
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
’按lStyle的值设置窗体信息
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
上面的代码有的呀,这些,把它换成C++代码,写在那个对话框里应该就行了。
hys1022 2007-08-28
  • 打赏
  • 举报
回复
谢谢楼上那么详细的叙述!
我这里的工程是自己手动写代码建的对话框,运行程序后最小化窗口,然后单击右键没有菜单选项(如还

原,移动,最小化等等)。
给部分代码看看
CMainWindow::CMainWindow()
{
// 设置标题栏
SetTitleImages(IDB_ACTIVE_TITLE, IDB_INACTIVE_TITLE);
// 关闭按钮
AddCloseButton(...);
// 最大化按钮,最小化按钮等
AddMaxButton(...);
...

m_hNoSignalEvent = CreateEvent(NULL,TRUE,FALSE,NULL) ;
}

其中SetTitleImages(),AddCloseButton(),AddMaxButton()这些函数都是一个类的成员函数,
这个类是继承CMDIFrameWnd类的。
现在问题是如何实现将对话框最小化后单击右键显示菜单功能?在哪添加菜单的功能,又怎样加呢?
希望能明白我讲的意思。
leaf__leaf 2007-08-28
  • 打赏
  • 举报
回复
说来说去,其实就是一个SetWindowLong函数。看看里面都用了哪些常量就可以了。
leaf__leaf 2007-08-28
  • 打赏
  • 举报
回复
再谈无边框窗体的操作

段云辉 段岳辉


--------------------------------------------------------------------------------


设置浮动菜单
通常情况下,在无边框窗体中不能设置菜单。如果在无边框窗体中设置了菜单,运行时窗体上就会出现标题栏。那么,是否在无边框窗体中就不能使用菜单了呢?答案是否定的。下面我们介绍用“借鸡下蛋”的方法在窗体中设置浮动菜单。
首先借“鸡”——再添加一个窗体,然后用这个“鸡”来下“蛋”——设置菜单。具体操作步骤如下:
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
这样,每次单击窗体,标题栏就会在显示和隐藏之间进行切换。
leaf__leaf 2007-08-28
  • 打赏
  • 举报
回复
我记得这个是《电脑爱好者》很早的一期中拉来的,是VB代码,不过反正都是用WindowsAPI,应该差不多。LZ看看。
VC++经验技巧宝典配套代码06章 包括: 6.1窗体标题栏应用 0332闪烁标题栏的窗体 0333隐藏和显示标题栏 0334拖动没有标题栏的窗体 0335获取标题栏的内容 0336滚动的窗体标题栏 0337无标题对话框的拖动方法 6.2窗体的位置和大小控制 0339不可移动的窗体 0340始终在最上面的窗体 0341跟随鼠标移动的窗体 0342控制窗体的最大化最小化 0343判断窗体是否最小化在任务栏 0345限制窗体的大小 0346使用鼠标按键调整窗体大小 0347根据图片大小显示的窗体 0348获取当前鼠标点处的控件 6.3个性化窗体 0350半透明窗体 0351透明窗体 0352字型窗体 0353圆角窗体 0354以图片的形状显示窗体 0355应用程序背景与桌面融合 0356立体窗口阴影效果 6.4动画窗体界面 0357动画显示窗体 0358淡入淡出的窗体 0359如qq般隐藏的窗体 0360可横向伸展的对话框 0361可纵向伸展的对话框 0362调用office助手 0363屏幕滚动 0364在窗体中显示彩虹文字字幕 0365在窗体中实现文字横拉效果 0366在窗体中实现万花筒效果 0367在窗体中实现动画效果 6.5实用窗体技术 0368随即更换背景的窗体 0369显示欢迎窗体 0370显示关于窗体 0371不使用ESC键关闭窗体 0372关闭窗体前弹出确认对话框 0373在窗体显示前弹出登录对话框 0374设置对话框背景色 0375使用话刷绘制背景色 0376设置窗体颜色渐变 0377将对话框以位图形式保存到磁盘中 0378在对话框中显示HTML文件 0379在对话框中创建视图 0380如何共享对话框资源 0381如何实现窗体继承 0384在对话框中使用CDialogBar 6.6光标应用 0386十字光标定位 0387获得光标的位置坐标 0388限制光标的移动范围 6.7菜单应用 0392在系统菜单中添加菜单项 0393带历史信息的菜单 0394设置菜单是否可用 0395为菜单添加核对标记 0396浮动的菜单 0397单击右键弹出菜单 0398可以下拉的菜单 0399任务栏图盘弹出菜单 0400绘制渐变效果的菜单 0401将菜单项的字体设置为粗体 6.8工具栏和状态栏应用 0402带背景的工具栏 0403在工具栏中添加编辑框 0404具有提示功能的工具栏 0405工具栏按钮的热点效果 0406定义XP风格的工具栏 0407带进度条的状态栏 0408显示系统时间的状态栏 0409显示滚动字幕的状态栏 0410显示动画的状态栏 0411使状态栏随对话框的改变而改变 6.9文档视图结构应用 0412向视图中放置控件 0413分割窗口 0414视图窗口的任意分割 0417滚动视图CScrollView类应用 0418树形视图CTreeView类应用 0419列表视图CListView类应用 0420HTML视图CHtmlView类应用 共78个例子

15,977

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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