注册 登录
编程论坛 VB6论坛

求助,关于msgbox 的功能实现

hmj0745 发布于 2021-12-08 19:46, 3124 次点击
提问原因: VB 本身的 Msgbox 存在两点限止,1. 每次都显示在中心位置,位置不好指定。 2.样式的确太单调了些。
我的想法: 1.自制对话框,实现Msgbox 的类似功能, 不行的话就  2. 指定Msgbox 显示坐标
我已尝试: 用窗体做了一个对话框,单独确认是可以的,但需要通过窗体,返回“是”,“否”而确定下一步指令时,不能实现。 因为窗体打开后,程序不能挂起,代码还在往后执行。不能像msgbox 本身哪样要确认后,会根据返回的值后再往下执行。  我偿试了DoEvents,Stop 都没有成功。
哪位朋友有这方面的思路或代码的话,帮指点一下。 谢谢了!
14 回复
#2
hmj07452021-12-10 13:05
经过反复偿试,问题解决了,我自己结贴吧,效果还行,思路为:当消息框出来后,让代码停在一个循环中,当点击消息框时,打破这个循环往下执行(同时产生一个变量值指导下一步执行),网络上查到的代码资料全是大篇大篇的还涉及到很多API,不实用。
Msgfrm.Show ' 显示自制的消息框,里面有是否,相当于原msgbox 的VBYS 和 VBNO,点击后会改变全局变量 IsExit
IsExit = False '全局变量
Do While DoEvents '// 设置一个循环直到交出控制权
If IsExit = True Then Exit Do '// 当全局变量为 True 时跳出循环
Loop
If MsgYN = True Then '来自于自制消息框的反馈变量,根据此变量来定义下一步动作
MsgBox "执行"
Else
MsgBox "停止"
#3
apull2021-12-10 13:43
Form1中:
程序代码:

Private Sub Command1_Click()
    Dim str As String
    str = "123456"
    frmDlg.Show 1, Me    '模态窗口
    If (frmDlg.Dlgbtn = vbOK) Then
        str = frmDlg.strDlg
    End If
    Text2.Text = str
   
End Sub


frmDlg中:
程序代码:

Public strDlg As String
Public Dlgbtn As VbMsgBoxResult

Private Sub cmdCancel_Click()
    Dlgbtn = vbCancel
    Me.Hide
End Sub

Private Sub cmdOK_Click()
    strDlg = txtDlg.Text
    Dlgbtn = vbOK
    Me.Hide
End Sub

Private Sub Form_Activate()
    strDlg = ""
    txtDlg.Text = ""
End Sub



[此贴子已经被作者于2021-12-10 14:08编辑过]

#4
hmj07452021-12-10 15:27
回复 3楼 apull
非常感谢! 原来这么简单。
show 1 模态窗口,能够让系统挂起,就这一点点就完全解决了我的问题。
这两天还绕了这么久,自学还是会走很多弯路!!要多向大神请教啊!
感谢!



[此贴子已经被作者于2021-12-10 16:26编辑过]

#5
apull2021-12-10 19:58
学VB6要多查MSDN,搞清楚使用的函数和参数的意思,积累多了就好了。
#6
风吹过b2021-12-10 22:13
自己写 msgbox 窗口,建议增加一个功能,定时自动关闭功能。
这个功能使用可选。
#7
hmj07452021-12-11 16:09
回复 6楼 风吹过b
好建议,我准备写几种模式的,根据传递的参数来改变设置。
#8
hmj07452021-12-11 16:36
回复 5楼 apull
是的,这的确是一个积累的过程,刚开始这一个月搞得很慢,MSDN 安装时没装上。 看来要重装一下。
    现在觉得轻松一些了,大约的语句写法,数组,数据库结构,SQL语句这些都有了一些概念。欠缺积累,各类函数,和一些控件的属性。一些功能的实现,基本上能够写得出来。就是方法和代码都不是最优化的。所以代码的 稳定性,速度,简约,是下一步主要学习的过程。
    当然还有站在使用者的位置来考虑, 操作的便捷性,使用者学习的简易性,数据结构的统一性,还有防止误操作的逻辑设置。我以前在工作中长期和工作流程和数据打交道,知道这个过程会出现的各种各样奇怪的可能。所以现在自己编,往往在这方面考虑和花费的时间最多! 往往开始觉得写的很好的一个模块,后来发现一些极端的情况下,会产生数据误差。就需要推倒重写。
    在工业术语里叫“防呆”,按大白话的说法是,要通过一种方法,防止呆子一样的人,做出呆子一样的操作带来不好的结果。我们要有一种机制来防止其发生。编写应用软件,也用得上这个理念 .....哈哈
#9
风吹过b2021-12-12 10:42
回复 7楼 hmj0745
按你这个思路,我也想了一下框架,前几个参数可以照抄 msgbox 的,
那些常量组合,使用AND运算后再比较来确定是否包含某个常量。我发现并不是所有的常量都是一位来表示,也许我没仔细研究。

其中 不传任何值时,也就是 0 时,只存在确定按钮,说明这个按钮是默认的,只有传了其他按钮组合时,才不显示这个按钮。
----------------------
我想到的框架是
1、窗体大小固定。
2、窗体位置不自动居中
3、窗体上按钮,分五组: 1、确定,2、确定+取消,3、yes+no,4、终止+重试+忽略,5、重试+取消。按钮在每组内使用控件数组,其中第1组是默认显示,其他组是默认不显示。
4、图标, 使用 image控件,直接放4个,分别存着4种图标。
5、根据传入的参数,确定是否显示图标,如果显示图标,标签框位置需要移动。
6、根据传入的参数,是否隐藏默认组,显示其他组。同时根据是否设置默认按钮,设置默认按钮。
7、对窗体点击右上角叉进行编程,让用户点击时变成隐藏状态,又要有方法调可以卸载窗体。如设置一个窗体全局过程,带参数调用。未带参数时,隐藏,带参数时,卸载。
8、封装,在模块中定义全局函数,负责有模式显示窗体,在窗体隐藏后读取结果并卸载窗体。

没时间去写代码了,自己只完成了1+2+3(前二组)+4、5(只放了第1个框)+8 ,还差得远。没时间去完成了,所以只发一个自己的思路。
对hlp格式的帮助文件一向不感冒,所以没想到如何去完全这个帮助,忽略掉了。
另外,对于 vbSystemModal ,也忽略掉吧!

#10
hmj07452021-12-12 12:48
回复 9楼 风吹过b
    你的思路很有系统性,如有时间去完成,从个性化和适应性方面会比Msgbox 好很多。
我想的还有一点就是提示框显示的位置,如何取得程序中某一个控件的绝对坐标(这个最好做成一个全局函数需要时随时调用)
然后提示框显示位置,就可以指定控件的坐标为参考。显示在合适的位置。我还试过用鼠标勾子获取当时点击位的坐标,以此做为参照来指定显示位置,但没有做成,偏差太远。
     在大屏上操作多款软件时,如果本软件处于边界位置,没有处于最大化时,点击提示框却显示在别的软件界面上。就很别扭了。
所以我这几天也一直在想,多层frame 里的控件,相对MID窗的坐标如何获取。不知道有没有表达“上层容器”的语句。如果有的话。就可以写一个函数,从指定控件本身起,查找其在上层容器的Left 和 TOP 值。 这样加起来最终能得到指定控件相对于,MID 窗体的坐标。
#11
风吹过b2021-12-12 17:25
    Command1.Parent.Caption = "测试"                '所在窗体
    Command1.Container.Caption = "测试2"            '所在容器,直接在窗体上时,窗口为容器

-------测试代码--------
程序代码:
Dim x As Long, y As Long, obj As Object

x = Command1.Left                   '自己的坐标
y = Command1.Top
Set obj = Command1.Container        '上一层容器
Do
    If obj Is Me Then Exit Do       '如果为放控件的窗体本身退出循环
    x = x + obj.Left
    y = y + obj.Top
    Set obj = obj.Container         '继续取上一层容器
Loop
If Me.MDIChild Then        '如果是mdi子窗体再加上窗口坐标
    x = x + Me.Top
    y = y + Me.Left
End If

Debug.Print x, y
Debug.Print Command1.Left, Command1.Top
Debug.Print Frame1.Left, Frame1.Top
Debug.Print Picture1.Left, Picture1.Top




#12
hmj07452021-12-12 18:25
完美,加上风版的这段代码,可以打造出比较个性化的定制Msgbox 消息框了!
感谢!
#13
kings123332021-12-12 22:04
回复 11楼 风吹过b
风版,能给个事例的文件吗?
#14
yuma2022-01-03 16:35
frmDlg  是什么窗体?
#15
风吹过b2022-01-03 19:14
Msgfrm  窗体的名字而以, 相当于一个 From1 ,只是手动改了一下名字而以。
一般情况下,建议按照标识符命名原则来命名标识符
标识符命名原则一般用来:增加规范性、可读性而做的一种约定,标识符在定义的时候最好见名知意,提高代码阅读性
frm 开头,表示这个标识符用于命名一个窗体(from)
Dlg ,标识符的用途,这里代表一个对话框(dialog)


我们平时定义变量例如
dim i as integer
这里面这个 i ,按命名原则,只用于 循环变量 或 中间临时变量 ,而不能用于代表具体含义的某个变量。
1