关于 vbRichClient 接收鼠标消息的问题
关于这个库的使用简单看了下 做了个例子
现在问题是 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