有VB高手吗,真令我失望

sunjiujiu 2002-09-09 06:16:32
http://www.csdn.net/expert/topic/1002/1002335.xml?temp=.9981958
上面的问题我一共给了400分,再加上这次的100分,一共500分,看看到底有没有真正的高手在这里啊
为什么会这样,令我失望
...全文
102 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
fq1 2002-09-12
  • 打赏
  • 举报
回复
不太稳定应该是你在UserControl中还放入了其他有hwnd的控件(对吧?),这样靠这些代码可能无法正确find到DHtmlEdit的hwnd:
ATLHwnd = FindWindowEx(UserControl.hwnd, 0, vbNullString, vbNullString)
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)

我已经预留了代码来处理这种情况:
If DHEHwnd <> 0 Then

你只要加入else,然后重新找FindWindowEx(UserControl.hwnd, ATLHwnd, vbNullString, vbNullString),直到找到为止就可以了!
fq1 2002-09-12
  • 打赏
  • 举报
回复
消息是一个一个来的,所以左键按下并托动只需把左键(WM_lbuttondown)屏蔽就OK了!
if msg= (WM_lbuttondown and wm_mouseMove)的写法不对,应该这样:
if msg= WM_lbuttondown and msg= wm_mouseMove then
注意以上不可能出现因为消息是一个一个来的


控件中加入了模块生成控件会自动将这些模块编译,可以正常使用!
sunjiujiu 2002-09-12
  • 打赏
  • 举报
回复
fq1:快去签到阿,我等着给你分数呢
还有个问题:如果在控件中加入了模块,那么在生成控件.ocx的时候用作其他的处理吗,会自动将这些模块也编译进去是吗
sunjiujiu 2002-09-12
  • 打赏
  • 举报
回复
还有个问题:为什么好像是不太稳定阿,有时候居然又可以输入东西,另外如果判断消息是否为“左键按下并托动”应该采取什么方式,我用:if msg= (WM_lbuttondown and wm_mouseMove)结果是仅仅当鼠标移动的时候就会捕获,应该怎么作呢
sunjiujiu 2002-09-12
  • 打赏
  • 举报
回复
谢谢了,请到下面的帖子中签到,马上给分。中午给分(因为我们上网是有时间限制的)

http://www.csdn.net/expert/topic/1006/1006150.xml?temp=1.034182E-02

http://www.csdn.net/expert/topic/1002/1002335.xml?temp=.9041864


fq1 2002-09-12
  • 打赏
  • 举报
回复
Ver1.04修正版!


'以下在UserControl中,你自己把代码中UserControl1改成你的控件的名字
Option Explicit

Private Sub DHTMLEdit1_DocumentComplete()
Dim ATLHwnd As Long
If Not DHEFirstDC Then
DHEFirstDC = True
ATLHwnd = FindWindowEx(UserControl.hwnd, 0, vbNullString, vbNullString)
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)

Do While DHEHwnd = 0
ATLHwnd = FindWindowEx(UserControl.hwnd, ATLHwnd, vbNullString, vbNullString)
If ATLHwnd = 0 Then Exit Do
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)
Loop

If DHEHwnd <> 0 Then
prevWndProc = GetWindowLong(DHEHwnd, GWL_WNDPROC)
SetWindowLong DHEHwnd, GWL_WNDPROC, AddressOf WndProc
End If
End If
End Sub

'Witten by FQ!
'Ver1.04

Private Sub UserControl_Terminate()
DHEFirstDC = False
If prevWndProc <> 0 Then
SetWindowLong DHEHwnd, GWL_WNDPROC, prevWndProc
prevWndProc = 0
End If
End Sub


'以下在.bas中
Option Explicit

Public Const GWL_WNDPROC = (-4)
Private Const WM_CHAR = &H102
Private Const WM_COMMAND = &H111
Private Const WM_MOUSEMOVE = &H200

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public DHEFirstDC As Boolean
Public DHEHwnd As Long
Public prevWndProc As Long

'Witten by FQ!
'Ver1.04

Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_CHAR Or Msg = WM_COMMAND Or Msg = WM_MOUSEMOVE Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function


通过屏蔽WM_MOUSEMOVE来禁止鼠标托拽,比屏蔽WM_LBUTTONDOWN和WM_RBUTTONDOWN要好!
fq1 2002-09-12
  • 打赏
  • 举报
回复
再次再次修正!^_#

'以下在UserControl中,你自己把代码中UserControl1改成你的控件的名字
Option Explicit

Private Sub DHTMLEdit1_DocumentComplete()
Dim ATLHwnd As Long
If Not DHEFirstDC Then
DHEFirstDC = True
ATLHwnd = FindWindowEx(UserControl.hwnd, 0, vbNullString, vbNullString)
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)

Do While DHEHwnd = 0
ATLHwnd = FindWindowEx(UserControl.hwnd, ATLHwnd, vbNullString, vbNullString)
If ATLHwnd = 0 Then Exit Do
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)
Loop

If DHEHwnd <> 0 Then
prevWndProc = GetWindowLong(DHEHwnd, GWL_WNDPROC)
SetWindowLong DHEHwnd, GWL_WNDPROC, AddressOf WndProc
End If
End If
End Sub

'Witten by FQ!
'Ver1.03

Private Sub UserControl_Terminate()
DHEFirstDC = False
If prevWndProc <> 0 Then
SetWindowLong DHEHwnd, GWL_WNDPROC, prevWndProc
prevWndProc = 0
End If
End Sub


'以下在.bas中
Option Explicit

Public Const GWL_WNDPROC = (-4)
Private Const WM_CHAR = &H102
Private Const WM_COMMAND = &H111
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public DHEFirstDC As Boolean
Public DHEHwnd As Long
Public prevWndProc As Long

'Witten by FQ!
'Ver1.03

Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_CHAR Or Msg = WM_COMMAND _
Or Msg = WM_LBUTTONDOWN Or Msg = WM_RBUTTONDOWN Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function


只是一个小的代码错误,会导致屏蔽鼠标托拽失效。
gmlwx 2002-09-12
  • 打赏
  • 举报
回复
用Webbrowser显示你所想显示的内容不成吗?
fq1 2002-09-12
  • 打赏
  • 举报
回复
本着认真负责的态度,再次修正!

'以下在UserControl中,你自己把代码中UserControl1改成你的控件的名字
Option Explicit

Private Sub DHTMLEdit1_DocumentComplete()
Dim ATLHwnd As Long
If Not DHEFirstDC Then
DHEFirstDC = True
ATLHwnd = FindWindowEx(UserControl.hwnd, 0, vbNullString, vbNullString)
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)

Do While DHEHwnd = 0
ATLHwnd = FindWindowEx(UserControl.hwnd, ATLHwnd, vbNullString, vbNullString)
If ATLHwnd = 0 Then Exit Do
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)
Loop

If DHEHwnd <> 0 Then
prevWndProc = GetWindowLong(DHEHwnd, GWL_WNDPROC)
SetWindowLong DHEHwnd, GWL_WNDPROC, AddressOf WndProc
End If
End If
End Sub

'Witten by FQ!
'Ver1.02

Private Sub UserControl_Terminate()
DHEFirstDC = False
If prevWndProc <> 0 Then
SetWindowLong DHEHwnd, GWL_WNDPROC, prevWndProc
prevWndProc = 0
End If
End Sub


'以下在.bas中
Option Explicit

Public Const GWL_WNDPROC = (-4)
Private Const WM_CHAR = &H102
Private Const WM_COMMAND = &H111
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public DHEFirstDC As Boolean
Public DHEHwnd As Long
Public prevWndProc As Long

'Witten by FQ!
'Ver1.02

Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_CHAR Or Msg = WM_COMMAND _
Or Msg = WM_LBUTTONDOWN = &H201 Or Msg = WM_RBUTTONDOWN = &H204 Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function


彻底解决找hwnd的问题,UserControl中还有其他有hwnd的控件也没事了。
修正DHEFirstDC变量不能自动重置的问题。
fq1 2002-09-11
  • 打赏
  • 举报
回复
修正!


'以下在UserControl中,你自己把代码中UserControl1改成你的控件的名字
Option Explicit

Private Sub DHTMLEdit1_DocumentComplete()
Dim ATLHwnd As Long
If Not DHEFirstDC Then
DHEFirstDC = True
ATLHwnd = FindWindowEx(UserControl.hwnd, 0, vbNullString, vbNullString)
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)
If DHEHwnd <> 0 Then
prevWndProc = GetWindowLong(DHEHwnd, GWL_WNDPROC)
SetWindowLong DHEHwnd, GWL_WNDPROC, AddressOf WndProc
End If
End If
End Sub

'Witten by FQ!
'Ver1.01

Private Sub UserControl_Terminate()
If prevWndProc <> 0 Then
SetWindowLong DHEHwnd, GWL_WNDPROC, prevWndProc
prevWndProc = 0
End If
End Sub


'以下在.bas中
Option Explicit

Public Const GWL_WNDPROC = (-4)
Private Const WM_CHAR = &H102
Private Const WM_COMMAND = &H111
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public DHEFirstDC As Boolean
Public DHEHwnd As Long
Public prevWndProc As Long

'Witten by FQ!
'Ver1.01

Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_CHAR Or Msg = WM_COMMAND _
Or Msg = WM_LBUTTONDOWN = &H201 Or Msg = WM_RBUTTONDOWN = &H204 Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function


DHTMLEdit1_DocumentComplete会多次触发,用了一个变量来判断以免多次SetWindowLong!
sunjiujiu 2002-09-11
  • 打赏
  • 举报
回复
我正在试试,请稍等,成功之后马上给分
fq1 2002-09-11
  • 打赏
  • 举报
回复
搞定!!!
代码如下!

'以下在UserControl中,你自己把代码中UserControl1改成你的控件的名字
Option Explicit

Private Sub DHTMLEdit1_DocumentComplete()
Dim ATLHwnd As Long
ATLHwnd = FindWindowEx(UserControl.hwnd, 0, vbNullString, vbNullString)
DHEHwnd = FindWindowEx(ATLHwnd, 0, "Internet Explorer_Server", vbNullString)
If DHEHwnd <> 0 Then
prevWndProc = GetWindowLong(DHEHwnd, GWL_WNDPROC)
SetWindowLong DHEHwnd, GWL_WNDPROC, AddressOf WndProc
End If
End Sub

Private Sub UserControl_Terminate()
'取消限制时用如下代码:
If prevWndProc <> 0 Then
SetWindowLong DHEHwnd, GWL_WNDPROC, prevWndProc
prevWndProc = 0
End If
End Sub


'以下在.bas中
'以下在.bas
Option Explicit

Public Const GWL_WNDPROC = (-4)
Private Const WM_CHAR = &H102
Private Const WM_COMMAND = &H111
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public prevWndProc As Long
Public DHEHwnd As Long

Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_CHAR Or Msg = WM_COMMAND _
Or Msg = WM_LBUTTONDOWN = &H201 Or Msg = WM_RBUTTONDOWN = &H204 Then
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End Function


以上完美解决所有你的要求,在控件中自己就屏蔽掉了,不用人为干预!
你用以上代码赚钱,我用以上代码得500分!!!
sunjiujiu 2002-09-11
  • 打赏
  • 举报
回复
真实太谢谢你了
fq1 2002-09-11
  • 打赏
  • 举报
回复
放在自己开发的控件中的问题已经解决了,现在可以用findwindow来找hwnd了,不用获取坐标!

你等着我正在解决鼠标托拽的问题,今晚给你代码!
sunjiujiu 2002-09-11
  • 打赏
  • 举报
回复
是把dhtml edit放在自己开发的控件中,现在如何获取坐标呢。
对于鼠标的托拽是:如果所打开的页面中有图片,可以选中图片之后将图片托动,现在不想让用户可以托动图片。你能帮着看看吗
fq1 2002-09-11
  • 打赏
  • 举报
回复
我不太清楚你的某些话的意思!

"另外如何屏蔽这个控件的鼠标托拽事件呢"
什么是这个控件的鼠标托拽事件?说清楚一些!

"因为在控件(自己开发的)中是没有坐标的属性的"
这是什么意思???你把DHTMLEdit放到了自己开发的控件中?详细说清楚一些!
sunjiujiu 2002-09-11
  • 打赏
  • 举报
回复
那你说如果在控件中直接屏蔽掉呢,因为在控件(自己开发的)中是没有坐标的属性的。我不想在外部调用的时候在屏蔽
fq1 2002-09-11
  • 打赏
  • 举报
回复
DHTMLEdit1很讨厌的一点就是没有hwnd,所以我用WindowFromPoint来找它的hwnd,因为非常奇怪的是findwindow or enumwindows都找不到它的hwnd!
因为WindowFromPoint的缘故,所以如果你把它放到了控件中,要加上这个控件的偏移才能正确WindowFromPoint到:
x = (Me.Left + 你的控件.Left + 你的控件的控件(如果还有的话).Left ...... + DHTMLEdit1.Left) / Screen.TwipsPerPixelX + 4
y = (Me.Top + 你的控件.Top + 你的控件的控件(如果还有的话).Top ...... + DHTMLEdit1.Top) / Screen.TwipsPerPixelY + 23


鼠标托拽事件正在想办法,因为它不是靠消息引发的,而是DDE所以屏蔽不了,等我想想吧!
sunjiujiu 2002-09-11
  • 打赏
  • 举报
回复
我发现在窗体中是可以的,但是放到我的控件中就不行了,不知道是为什么,希望你也能帮我看看,
明天给分.另外如何屏蔽这个控件的鼠标托拽事件呢,能帮我看看吗
sunjiujiu 2002-09-11
  • 打赏
  • 举报
回复
我试验了一下怎么不行啊,你确定可以吗?怎么我这里不行
500分肯定会给你的,否则你可以发信到jiuchensun@263.net中天天骂我
加载更多回复(21)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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