关于 vbRichClient 接收鼠标消息的问题

menghaiid 2016-05-11 03:49:11
关于这个库的使用简单看了下 做了个例子

现在问题是 Panel 收不到 鼠标左右键消息离开消息 也收不到滚轮消息 查了好久 发现给的例子也不能。怎办?
其中 这句 Set Panel = Cairo.WidgetForms.CreateChild(fHwnd) 是创建一个子窗口在主窗口上,我本来觉得这样很好,可以在主窗口上分不同绘制区绘制什么的。结果鼠标事件成了问题 而且子窗口Panel 没有滚轮事件

后来发现 Set Panel = Cairo.WidgetForms.Create() 创建主窗口方式 就有滚轮事件了 也有鼠标离开事件等等,但是左右键单击事件还是收不到,应该说同时乱敲2个键 到是偶尔能收到。 问题这是创建主窗口

vbRichClient 使用例子类

这个框架类有2个接口
Public Sub FrmPanel(x1 As Single, y1 As Single, Width As Single, Height As Single, fHwnd As Long)
Set Panel = Cairo.WidgetForms.CreateChild(fHwnd)
Panel.Move x1, y1, Width, Height
End Sub

Public Sub MovePanel(x1 As Single, y1 As Single, Width As Single, Height As Single)
Panel.Move x1, y1, Width, Height
End Sub

一个是在 Form_Load里 如
类名.FrmPanel 0,0,100,100,Me.Hwnd
作用是在这个类里建立一个面板,这个面板将会覆盖窗口上你设置的面积。想想是不是很有用,比如窗口上可以用不同面板分成绘制区,按钮区等等,另外支持滚轮,省的另找

一个是放在窗口大小改变里
类名.MovePanel 0,0,100,100
作用窗口大小改变,自然绘图区也要重定义不是

最后一个是执行
ReDrawUsing()
你可以在里面写上你想绘制的任何东西,窗口,控件,动画。。。。。

貌似就这样了。。。下面简单写了个东西 作用是当鼠标在面板区上移动时,随机在 “”面板“ ”上绘制出100根2头带圆点的反锯齿线,

'==============基于vbRC5BaseDlls,所以别忘了引用===============
Private New_C As New cConstructor
'背景缓存
Private UsingBacks As cCairoSurface
'绘制对象
Private Dr As cCairoContext
'一个独立板面
Private WithEvents Panel As cWidgetForm
'输出事件
Public Event PanelClick(Name As String)
'============================================================

Public Function ReDrawUsing() As cCairoSurface
Dim I&, Back As cCairoContext

If UsingBacks Is Nothing Then
Set UsingBacks = Cairo.CreateSurface(Panel.Width, Panel.Height)
Set Back = UsingBacks.CreateContext

'the following two lines ensure a complete Surface-Fill
Back.SetSourceColor 0
Back.Paint

'在这里绘制其他需要缓冲的种种其他元素
'
'.Draw BackCC
'
End If

Set Dr = Cairo.CreateSurface(Panel.Width, Panel.Height, ImageSurface).CreateContext

'在这里,可以把缓冲区内容快速贴入绘制区
Dr.RenderSurfaceContent UsingBacks, 0, 0

'下面这里要做你的全部绘制工作
Dr.TranslateDrawings 0, 0 '设置开始绘制区域
'设置线颜色,透明反锯齿等内容
Dr.SetSourceColor vbGreen, 0.5, 1
'设置线头帽子
Dr.SetLineCap CAIRO_LINE_CAP_ROUND
'设置线宽
Dr.SetLineWidth 1

'将设置好的绘制对象送进下面绘制过程中
DrawLineOn Dr

'这里可以将绘制好的图片随该函数结束返回
Set ReDrawUsing = Dr.Surface
End Function

Private Sub DrawLineOn(Dr As cCairoContext)
Dim x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer, I As Integer

For I = 1 To 100
x1 = NextNumber(Panel.Width)
y1 = NextNumber(Panel.Height)
x2 = NextNumber(Panel.Width)
y2 = NextNumber(Panel.Height)

Dr.SetSourceColor vbRed, 0.8
Dr.Drawline x1, y1, x2, y2 'again, also this is only a Path
Dr.Stroke

Dr.SetSourceColor vbGreen, 0.8
Dr.ARC x1, y1, 3
Dr.Fill
Dr.ARC x2, y2, 3
Dr.Fill
Next

Dr.Stroke
End Sub

Private Sub Panel_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Cairo.ImageList.AddSurface "Plot", ReDrawUsing
’显示到面板上
Panel.WidgetRoot.ImageKey = "Plot"
End Sub

Private Sub Panel_Resize()
Set UsingBacks = Nothing
End Sub

Private Sub Class_Terminate()
New_C.CleanupRichClientDll
End Sub

Public Sub FrmPanel(x1 As Single, y1 As Single, Width As Single, Height As Single, fHwnd As Long)
Set Panel = Cairo.WidgetForms.CreateChild(fHwnd)
Panel.Move x1, y1, Width, Height
End Sub

Public Sub MovePanel(x1 As Single, y1 As Single, Width As Single, Height As Single)
Panel.Move x1, y1, Width, Height
End Sub

'随机数生成
Private Function NextNumber(Optional ByVal ceiling As Integer = 0) As Integer
Randomize (Timer)
NextNumber = Int(Rnd() * (CDbl(ceiling) + 1)) '生成 0 - ceiling 之间的随机数
End Function
...全文
209 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
menghaiid 2016-05-13
  • 打赏
  • 举报
回复
找到了解决方式 Panel (子窗体) 不支持鼠标左右键,但是支持滚轮,所以在 Panel上在覆盖一个 cWidgetBase 就可以了 这个相当于一个控件
说明: 1此程序由ecz00程序优化而来 地址 http://download.csdn.net/download/ecz00/9403630 因此程序可以说是网上唯一的tcpclient使用的中文案例,提供了我思路,在此感谢 ;为什么用这个插件,vb自带的插件winsock 这么有用的插件 居然不是微软自带的插件, 最要命的是 直接注册ocx控件 win7 win10上可能因为序列号无法注册,那么vb下如何开发ip客户端,变得很麻烦,尝试过APi方法的,但是过于复杂,程序量太大,比较麻烦,因此用 此方案比较可行,在原版的基础上花了5天时间摸索和优化, 此版本使用方法 1 把vbRichClient5.dll放进C:\Windows\SysWOW64 (64位系统) 2 在vb6中点击 工程->引用 把上面的dll引用进来就可以额,不需要注册 3:使用sscom5.12.1 或其他tcp调试软件软件启动tcpserver 地址是127,0,0,1 5676 4:直接运行本软件即可使用。点击连接,显示成功,说明连接成功,可以相互发送数据了 服务端的程序在原版上未做修改,请自行优化 此软件改进了原版 1:无法显示连接状态和错误信息 2:只能发送不能接收 3:使用主机名的连接方式,无法直接使用,一开始 4:无法显示byte值 5:界面修改 6:连接的时候,不断开以前的连接,造成重复连接 提示 vbRichClient5的手册找遍了都找不到,估计作者都没写,更别想有中文版了,所以只能 在vb6中点击视图-》对象窗口,可显示vbRichClient5.dll 所有的类和方法 QQ175891641 2018-2-15优化
发现网上关于vbrichclient的教程比较少,但这个实在是好东西,实用性,稳定性都比VB自带的winsock好的多,多客户端不用winsock控件数组。 也不用在各窗体上放winsock,直接在模块中就能实现收发 下面直接上代码,窗体和文本钮、按钮大家自行拖放。要用到VB自带隐藏函数varptr()取内存指针(VbMsdn中没有这个函数,实际上很简单^^)。 VbRichClient5.0.38中包含sqlite3.9支持 上面共享中也包含VbRichClient5.0.38支持库 VbRichClient代替winsock 主要使用 cTCPServer cTCPClient cUDP '--------------------------------------------------------------------- '服务器端,代码最简化,要实现多客户端只要用数组存hsocket就可以 Option Explicit Dim WithEvents sv As cTCPServer Dim WithEvents udp1 As cUDP Dim cHsocket& Private Sub Form_Load() Set sv = New cTCPServer sv.Listen sv.GetHost("127.0.0.1"), 35912 Debug.Print sv.GetHost("") Set udp1 = New cUDP udp1.Bind "127.0.0.1", 5616 End Sub Private Sub sv_DataArrival(ByVal hSocket As Long, ByVal BytesTotal As Long, ByVal FirstBufferAfterOverflow As Boolean) Dim d() As Byte, s$ ReDim d(BytesTotal - 1) sv.GetData hSocket, VarPtr(d(0)), BytesTotal '★★关键代码 s = d Text2.Text = Text2.Text & s & vbCrLf Debug.Print "收到:" & BytesTotal End Sub Private Sub sv_TCPAccepted(ByVal hSocket As Long) cHsocket = hSocket Text1.Text = Text1.Text & sv.GetPeerHostIPAndPort(hSocket) & vbCrLf End Sub Private Sub sv_TCPDisConnect(ByVal hSocket As Long) Text3.Text = Text3.Text & sv.GetPeerHostIPAndPort(hSocket) & vbCrLf End Sub Private Sub udp1_NewDatagram(ByVal BytesTotal As Long, ByVal FirstBufferAfterOverflow As Boolean) Dim d() As Byte, s$ ReDim d(BytesTotal - 1) udp1.GetData VarPtr(d(0)), BytesTotal s = d Text2.Text = Text2.Text & s & vbCrLf End Sub '------------------------------------------------------- '客户端 Option Explicit Dim WithEvents cl As cTCPClient Dim WithEvents udp1 As cUDP Dim cid& Private Sub Command1_Click() cid = cl.Connect("QgB1", 35912) End Sub Private Sub Command2_Click() cl.Disconnect cid End Sub Private Sub Command3_Click() Dim b() As Byte b = Text1.Text cl.SendData cid, VarPtr(b(0)), UBound(b) + 1 End Sub Private Sub Command4_Click() Dim d() As Byte, s$ s = "yessss" d = s udp1.RemoteIP = "127.0.0.1" udp1.RemotePort = 5616 u

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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