回 帖 发 新 帖 刷新版面

主题:请教有关vb的一个简单的问题

各位大侠:
    请问如何自定义一个对话框,具有这样的功能:[color=FF00FF]当鼠标在对话框范围之内时,对话框被激活,当鼠标键移至对话框范围之外时,对话框闪亮[/color]。其实这个功能就像调用vb中的msgbox语句一样,有他的功能,但这个msgbox只能输入text,而不能另外添加控件。
    我试过新建一个form把所需空间加上去,但却不能实现“[color=FF0000]当鼠标在对话框范围之内时,对话框被激活,当鼠标键移至对话框范围之外时,对话框闪亮[/color]”的功能。
    请各位大侠帮帮忙!

回复列表 (共11个回复)

沙发

可利用API函数获取鼠标点的句柄来判断是否在对话框之内。
当鼠标在对话框范围之内时,对话框被激活,还可利用鼠标移动事件。
最好将你的有关核心代码发上来

板凳

你的“对话框”是指下面哪一种:
1、窗体上的一个可以输入的控件
2、系统提供CommonDialog控件
3、一个整个被隐藏的窗体
4、一个框架及框架上的内容

这个你说清了,大家好帮你。

3 楼

Private Sub Command1_Click()
    Dim f As New Form1
    f.Show vbModal
End Sub

4 楼

严格来说,也没什么核心代码。那个对话框是这样的特征:有点类似于“系统提供CommonDialog控件
”,但版面上的控件不是类似于打开文件,或关闭文件功能。这个是自定义的,无关紧要。关键还是我开始的那句话:“当鼠标在对话框体的范围之内时,点击对话框中任意控件都是可行的,当鼠标键移至对话框范围之外时,对话框闪亮,并会发出‘当。。。当。。。’的响声”。这个就像CommonDialog控件一样。不知道这样解释大家明白不。小弟在此谢谢了

5 楼


也就是要建立像CommonDialog控件一样,但面板上的内容确实自定义的。不知道这种功能能否实现。还请大侠指点啊

6 楼

Option Explicit

Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If  Timer1.Enabled = False Then If X Or Y Then Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim p As POINTAPI
GetCursorPos p
If WindowFromPoint(p.X, p.Y) <> hWnd Then Timer1.Enabled = False
End Sub


  Timer1_Timer 过程中调用了 API 函数 WindowFromPoint,这个函数的作用是返回指定点的窗口的
句柄,当鼠标移出窗体后,返回的就不是窗体的句柄了,程序据此判断鼠标已不位于窗体之上。设置Timer1.Interval = 50。
至于鼠标移出窗体后的声音和窗体标题闪烁,也比较简单,网上这类代码有很多。

7 楼

感谢一江秋水同志编写这段代码,但是[color=0000FF]我刚刚试过,好像没有什么作用[/color]。你[color=FF0000]的那段代码是这样的特征:鼠标移出对话框后,单击或双击对话框外的区域,对话框此时会隐藏。[/color][color=800080]而我是不要对话框隐藏的[/color]。不知道你能否帮我实现这个功能?小弟先行谢过了。。。

8 楼

二楼老大不是问你:
你的“对话框”是指下面哪一种:
1、窗体上的一个可以输入的控件
2、系统提供CommonDialog控件
3、一个整个被隐藏的窗体
4、一个框架及框架上的内容

可你没有加以说明,所以我就认为你的对话框是指窗体。
请将代码中的窗体句柄改为你所说“对话框”的句柄(窗体句柄是hWnd),将窗体的鼠标移动事件改为“对话框”的鼠标移动事件。
另外,我那段代码并不会使什么东东隐藏。

9 楼

[quote]当鼠标键移至对话框范围之外时,对话框闪亮[/quote]
FlashWindow

optione explicit
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
Const Invert = 1
Private Type POINTAPI
  X As Long
  Y As Long
End Type
Dim frm As frmDialog    '对话框窗体

Private Sub Command1_Click()
Set frm = New frmDialog   '调用对话框
frm.Show
Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Unload frm
    Timer1.Interval = 0
End Sub

Private Sub Timer1_Timer()
Dim p As POINTAPI
If frm Is Nothing Then Exit Sub

GetCursorPos p
If WindowFromPoint(p.X, p.Y) = frm.hwnd Then     '鼠标在对话框内,获得焦点,被激活
    frm.SetFocus
Else   
    FlashWindow frm.hwnd, Invert    '鼠标不在对话框内,窗体闪亮
End If
End Sub

10 楼

我对这种“提问内容不清而且对进一步说明不理睬、一味说代码不对”的帖子反正是越来越没有兴趣了

我来回复

您尚未登录,请登录后再回复。点此登录或注册