各位应该用过 MSN Messenger 和网易泡泡这些即时通讯软件吧。
不知道用 VB 怎么可以做到像他们一样的聊天消息窗体(参照 WIN32 API 的说
法,我们把任何一个控件姑且都称为窗体):1. 窗体内显示聊天双方的聊天文字,是动态增加的。并且显示的字体是由消息
   发送者自己定义的。
2. 窗体内除了能显示文字外,还能显示 URL 链接。链接除了能跳转到普通的网址
   外,还能是执行自己内部的程序,如:当甲给乙发送文件时,乙首先收到的是
   一条消息:甲给您发送文件,您是[接收]还是[取消],这里的[接收]和[取消]
   就是两个链接,点击会执行不同的动作。如果是我们自己的 VB 文本框/富文本
   框,如何才能做到类似的效果呢?目前想到的就是这些,希望大家能给出一些思路。如果是类似 QQ 的界面,我想
实现起来可能会容易一点。但我个人比较偏向于 MSN 的界面。在此请各位高手
指点。

解决方案 »

  1.   

    窗体可以用BACKGROUND和API实现不规则窗体或带SKIN的窗体。
    至于动态显示TEXT,WINSOCK可以胜任
      

  2.   

    1. 窗体内消息要动态显示,并且当前用户看到的是最新增加的消息。并且显示的字体是由消息发送者自己定义的。
    上面网友回复的 Winsock 是如何获取动态消息的问题,这不是讨论的范围。2. 窗体内除了能显示文字外,还能显示 URL 链接。链接除了能跳转到普通的网址外,还能是执行自己内部的程序。
    如:当甲给乙发送文件时,乙首先收到的是一条消息:甲给您发送文件,您是[接收]还是[取消],这里的[接收]和[取消]就是两个链接,点击会执行不同的动作。如果是我们自己的 VB 文本框/富文本框,如何才能做到类似的效果呢?
      

  3.   

    我最近刚做过
    和MSN的一模一样
      

  4.   

    那把你的思路来出来 Share 一下可否。
      

  5.   

    你那个用winsock和富文本框就能实现了
      

  6.   

    To danielinbiti
    富文本框能显示链接并能响应用户的点击操作吗?
      

  7.   

    富文本框能显示链接并能响应用户的点击操作
    Private Sub txtReceived_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Me.ImgFont.BorderStyle = 0
        hyperlink = getHyperlink(txtReceived, X, Y)
    End Sub
    Public Function getHyperlink(rtf As RichTextBox, X As Single, Y As Single) As String
    'Some Tips that is Safe to Change/Edit f
    '     or Beginers:
    '=======================================
    '     =========================
    ' rtf.MousePointer = rtfCustom
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ' What MousePointer to Use ? if its rtfC
    '     ustom
    ' Then you need to add a Icon to the Ric
    '     hTextBox
    '=======================================
    '     =========================
    '=======================================
    '     =========================
    'rtf.SelUnderline = True
    ' Do you want the URl to UnderLine ?
    '=======================================
    '     =========================
    '=======================================
    '     =========================
    'rtf.SelColor = vbBlue
    ' What Color would you like the URL to b
    '     e ?
    '=======================================
    '     =========================
    On Error Resume Next
    Dim Point As PointAPI
    Dim charpos As Long
    Dim pos_start As Long
    Dim pos_end As Long
    Dim char As String
    Dim word As String
    Point.X = X \ Screen.TwipsPerPixelX
    Point.Y = Y \ Screen.TwipsPerPixelY    charpos = SendMessageA(rtf.hwnd, EM_CHARFROMPOS, 0&, Point)
        
        If charpos <= 0 Or charpos = Len(rtf.Text) Then
           rtf.MousePointer = rtfDefault
           getHyperlink = vbNullString
           Exit Function
        End If
        
        For pos_start = charpos To 1 Step -1
        
        If Mid$(rtf.Text, pos_start + 1, 1) = Chr$(13) Then
        rtf.MousePointer = rtfDefault
        getHyperlink = vbNullString
        Exit Function
        End If
        char = Mid$(rtf.Text, pos_start, 1)
        If char = Chr$(32) Or char = Chr$(10) Or char = Chr$(13) Then Exit For
        Next pos_start
        pos_start = pos_start + 1
        
        For pos_end = charpos To Len(rtf.Text)
        char = Mid$(rtf.Text, pos_end, 1)
        If char = Chr$(32) Or char = Chr$(10) Or char = Chr$(13) Then Exit For
        Next pos_end
        pos_end = pos_end - 1
        If pos_start <= pos_end Then word = LCase$(Mid$(rtf.Text, pos_start, _
        pos_end - pos_start + 1))
        If Left$(word, 7) = "http://" Or Left$(word, 4) = "www." Or Left$(word, 6) = _
        "ftp://" Or Left$(word, 7) = "mailto:" Then
        char = Right$(word, 1)
        
        Do While char = "." Or char = "," Or char = "!" Or char = "?"
        If Len(char) = 0 Then Exit Do
        word = Left$(word, Len(word) - 1)
        char = Right$(word, 1)
        Loop
        
        If Len(word) < 4 Then
        rtf.MousePointer = rtfCustom
        getHyperlink = vbNullString
        Else
        rtf.MousePointer = rtfCustom
        getHyperlink = word
        End If
        Else
        rtf.MousePointer = rtfDefault
        End If
    End Function