在picture的MouseMove里我有一段代码,是用来实现鼠标定位的。在程序使用过程中我使用controls.add来添加一个label到picture中,可label挡在picture前面,当鼠标移动到那个label中时触发不了mousemove里面的代码,其实我只是想在pucture上面动态地现示一些数字。

解决方案 »

  1.   

    别用Label,用Print方法绘制文字一定要坚持用Label,那也是有办法的,只不过需要用子类拦截鼠标消息,代码复杂多了
      

  2.   

    同上其实,Print方法也尽量不要用,原因就不说了,直接用api输出文字吧
      

  3.   

    或者用label,同时处理label的mousemove事件,当然,需要你进行一下坐标转换
      

  4.   

    赞同 用Print方法绘制文字
      

  5.   

    反正最简单办法是自己绘制问题,用Lable控件是人为制造障碍
    Print是语句
    与面向对象机制存在冲突
    平时VB编译器会作特殊处理避免冲突
    但有时避免不了会引起程序莫名其妙出错
    所以绘制文字时建议直接用api我先前说用Print,是怕楼主是那种坚决不用API的那种人,尽量使用VB自己的东西
      

  6.   

    为什么会有坚决不用API的人呢??其实我在写程序的过程中发现API的功能很强大的,不过我实在是技术有限,在书上好像没有很深入的说明。大家有什么好的电子书介绍呢?比如说 Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    里的 Declare是什么意思。
    楼上几位高手能教教我怎样使用API来绘制文字。用Print来输出我是基本上不会使用的,本人觉得在面向对象语言中有点多此一举。还有一点,我需要对文字进行坐标定位显示。能通过计算在特定的坐标里显示文字内容。
    其实在写这个程序时我发现了很多我不理解,和不会解决的问题是需要问的。以后还要请大家多多关照呢。
      

  7.   

    引用: zyl910(910:分儿,我又来了!)  只不过需要用子类拦截鼠标消息,代码复杂多了子类拦截鼠标消息是什么意思啊,我不明。还有VB里边有子类父类这概念的吗?我在使用的过程中发现好像很多都跟C里的类很相似,但VB里好像又没有特别指出过类。我算是搞糊涂了,类的认识我只在C++里边接触到,觉得类的使用很有他的优点
    本人有一段VB的代码感觉就像是对类的使用,以label为基类,派生出一个然后对他进行一些赋值这跟类的操作很相似。
    Set lab(0) = Controls.Add("vb.label", "lab0", Picture1)
                                  
                                  '设置label的初始化数据
                               With lab(0)
                                .Visible = True
                                .Caption = A_Line(0).Auth
                                .BackStyle = 0
                                .Width = 0
                                .Height = 0
                                .AutoSize = True
                                .FontSize = 16
                                .FontBold = True
                                .Left = A_Line(k).x0 + (A_Line(k).x1 - A_Line(k).x0) / 2 + 5
                                .Top = A_Line(k).y0 + (A_Line(k).y1 - A_Line(k).y0) / 2
                               End With
                  
     
     
      

  8.   

    Option ExplicitPrivate Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
    Private Sub Command1_Click()
        Picture1.ScaleMode = vbPixels
        TextOut Picture1.hdc, 10, 10, "你好中国", lstrlen("你好中国")
    End Sub
      

  9.   

    //还有一点,我需要对文字进行坐标定位显示。能通过计算在特定的坐标里显示文字内容。这么说的话,你还是用label吧(不过要把它藏起来,即在向picturebox输出文字的同时,同时初始话label),或者想办法用数组或集合保存指定区域的文本,总之,要读出数据就要先保存数据,否则的话,就涉及到文字识别,代码量就大上许多了
      

  10.   

    '若Picture1.AutoRedraw = Falseprivate sub picture1_paint()
        picture1.CurrentX = A_Line(k).x0 + (A_Line(k).x1 - A_Line(k).x0) / 2 + 5
        picture1.CurrentX = A_Line(k).y0 + (A_Line(k).y1 - A_Line(k).y0) / 2
        picture1.Print A_Line(0).Auth
    end sub你的数据好像放在A_Line中,在PictureBox的paint事件中写个循环画文字就行
      

  11.   

    这里所说的子类是指Windows编程中的SubClass技术
    专用来定制窗口功能
    相当于继承了一个子类
    设置CurrentX、CurrentY 属性可以控制用Print输出的文字的位置其实你创建Lable控件的时候就需要定位坐标,换成自己定坐标绘制文字还不是一样还有一点Print方法比API更方便:Print是使用VB坐标系,而不是DC坐标系,所以不需要写坐标转换代码
      

  12.   

    '作者:sakurako
    '设置Picture1的AutoRedraw = FlasePrivate Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End TypePrivate Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
    Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As LongPrivate Const DT_SINGLELINE = &H20Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim rectText As RECT
        Dim strPoint As String
        
        rectText.Left = 0
        rectText.Top = 0
        rectText.Right = 200
        rectText.Bottom = 50
        
        strPoint = "x = " & X & ", y = " & Y
        Picture1.Refresh
        DrawText Picture1.hdc, strPoint, -1, rectText, DT_SINGLELINE
    End Sub
      

  13.   

    谢谢了。这个问题解决了,迟些就会结贴了。多口问一句。为什么不提倡使用print而直接使用API呢?
    我那本书的API页数真是少的可怜,只有14页,看来还得去图书馆借书来看看才行了。
      

  14.   

    //为什么不提倡使用print而直接使用API呢?上面说过了Print是语句
    与面向对象机制存在冲突
    平时VB编译器会作特殊处理避免冲突
    但有时避免不了会引起程序莫名其妙出错
    所以绘制文字时建议直接用api