用listbox吧,一行一行的,或者用Lable也可以啊,就是背景色改一下也样子和textbox差不多

解决方案 »

  1.   

    Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
    Private Sub Form_Load()
    EnableWindow Text1.hwnd, False
    End Sub
      

  2.   

    TO:dbcontrols(泰山__帮助你使我感到快乐.)
    那样滚动条不也是不能动吗?
      

  3.   

    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 2 Then
       MsgBox ("不准复制")
    End If
    End Sub
      

  4.   

    不好不好,和ENBALBED=FALSE没两样
      

  5.   


      1、设 text1.Locked=True
      2、在Text得到初值时 text1.tag=text1.text
      3、在 Text1_Change 事件中: text1.text=text1.tag
      

  6.   

    >>1、设 text1.Locked=True
      2、在Text得到初值时 text1.tag=text1.text
      3、在 Text1_Change 事件中: text1.text=text1.tag
    +++这个也不好阿,你会看到屏幕闪烁一下才消失。我想是如何把系统给得快捷菜单去了那才是最棒的啦
      

  7.   

    用了locked后不能够实现paste的功能
      

  8.   

    >>那的用API. 
    ++我需要的就是这个API啦!!!!!!!!!!!!!!
      

  9.   

    可以用自己的菜单替换text的,这样可以吗?还不需要Api,几句代码搞定.
      

  10.   

    关闭右键菜单
    Private Sub Command1_Click()
        prevWndProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
        'GWL_WNDPROC:该窗口的窗口函数的地址
        SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf WndProc
        'dwNewLong:Long,由nIndex指定的窗口信息的新值
        Command1.Enabled = False
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        If prevWndProc <> 0 Then
            SetWindowLong Text1.hWnd, GWL_WNDPROC, prevWndProc
            prevWndProc = 0
        End If
    End Sub
      

  11.   

    呵呵,自己做一个菜单。
    在TEXT的MOUSEDOWN事件中加入:
    TEXT1.enable=false
    text1.enable=true
    popupmenu "自己的菜单"
      

  12.   

    回复人: uguess(uguess) (2002-1-25 11:38:47)  得0分 
    去掉快捷菜单也不行,直接用快捷键同样可以!所以我提供的方法是最简单又最好的!  只要去掉菜单就可以,快捷键已无效了
      

  13.   

    >>只要去掉菜单就可以,快捷键已无效了
    ++俺就是不要他!!!反正要让他完全只读
      

  14.   

    To fuxc(Michael):
    很多变量为定义错误 比如GWL_WNDPROC
      

  15.   

    sendmessage(text.hwnd.WM_READONLY,0&)
      

  16.   

    Private Sub Timer1_Timer()
    If Clipboard.GetText() = Text1.Text Then Clipboard.Clear
    End Sub
    timer空间时间短些100ms
      

  17.   

    先用上面fuxc(Michael)大虾给的关闭右键菜单的基础上,对于键盘的一些补充:Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
        If Shift = 2 And KeyCode = 67 Then
            If Clipboard.GetText() = Text1.Text Then Clipboard.Clear
        End If
    End Sub
      

  18.   

    sorry!模块中的代码没贴!!Option Explicit
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_RBUTTONDOWN = &H204Declare 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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
          (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
          (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) _
            As LongPublic prevWndProc As Long      '以前的windows过程Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, _
                    ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_RBUTTONDOWN Then
        Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        End If
    End Function
      

  19.   

    ''窗体代码(一个textbox:text1,一个buttom:command1)
    Option Explicit
    Private Sub Command1_Click()
        prevWndProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
        'GWL_WNDPROC:该窗口的窗口函数的地址
        SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf WndProc
        'dwNewLong:Long,由nIndex指定的窗口信息的新值
        Command1.Enabled = False
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        If prevWndProc <> 0 Then
            SetWindowLong Text1.hWnd, GWL_WNDPROC, prevWndProc
            prevWndProc = 0
        End If
    End Sub
    ''模块代码
    Option Explicit
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_RBUTTONDOWN = &H204Declare 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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
          (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
          (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) _
            As LongPublic prevWndProc As Long      '以前的windows过程Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, _
                    ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_RBUTTONDOWN Then
        Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        End If
    End Function
      

  20.   

    小弟再问你一个低级问题:
    你是怎么知道这些常量的值?
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_RBUTTONDOWN = &H204
      

  21.   

    fuxc(Michael):
    你的方法果真惯用
      

  22.   

    用API VIEWER可以查到
    或者在MSDN中查
      

  23.   


      尽是胡扯!!!
      “关于text的只读问题”—— 用上面那种方法,谁说是只读的???用Ctrl+V就可以复制!  : Random(随便) 你试过没有,就说“无效”?? 试试先!
      : Polo(Polo)   你自己都搞不清自己的问题么???
      

  24.   

    >>“关于text的只读问题”—— 用上面那种方法,谁说是只读的???用Ctrl+V就可以复制++真的吗? 那我该怎么办
      

  25.   

    uguess(uguess):
    你不要骗我了!!!我已经试验过了Ctrl+C, Ctrl+V都不管用了
      

  26.   


      我说的Ctrl+V是这样做: 1、先在其他地方选一段文字,Ctrl+C;
                            2、再在你的Text中选中一段文字,然后Ctrl+V;
            如何??
      

  27.   

    >>说的Ctrl+V是这样做
    ++你的这种我也是过了不会的!!!
    我怀疑你有没有试过
      

  28.   


      抱歉,刚刚发现,我同事把那个Text改称Locked=True了,所以才会....  对不起,我错了!   
      

  29.   

    上面的方法虽好,但有一个缺点,就是只能对一个text起做用,当要锁定的多时怎么办.
    写几个wndproc吗?呵呵,那可不好办.
    我用的也是上面的方法,另加了一点小改动,做成控件,想要的留个email.
      

  30.   

    it's quit easy.
    set text.autoverbmenu=false
      

  31.   

    我给你们写到这里吧,功能没写完,你们可以补充.
    是一个控件,有一个模块和一个control********************************
    mDefine(bas)
    ********************************
    Option ExplicitPublic Declare Sub CopyMemory _
       Lib "kernel32" Alias "RtlMoveMemory" _
          (pDest As Any, _
          pSrc As Any, _
          ByVal ByteLen As Long)Public Declare Function SetWindowLong _
       Lib "user32" Alias "SetWindowLongA" _
          (ByVal hWnd As Long, _
          ByVal nIndex As Long, _
          ByVal dwNewLong As Long) As LongPublic Declare Function GetWindowLong _
       Lib "user32" Alias "GetWindowLongA" _
          (ByVal hWnd As Long, _
          ByVal nIndex As Long) As LongPublic 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 LongPublic Const GWL_WNDPROC = (-4)
    Public Const GWL_USERDATA = (-21)Dim ctlShadowControl As TextEx
    Dim ptrObject As LongPublic Function SubWndProc(ByVal hWnd As Long, _
                               ByVal Msg As Long, _
                               ByVal wParam As Long, _
                               ByVal lParam As Long) As Long   On Error Resume Next   ptrObject = GetWindowLong(hWnd, GWL_USERDATA)
       CopyMemory ctlShadowControl, ptrObject, 4
       SubWndProc = ctlShadowControl.WindowProc(hWnd, Msg, wParam, lParam)
       CopyMemory ctlShadowControl, 0&, 4
       Set ctlShadowControl = Nothing
    End Function
    *************************
    TextEx(usercontrol)
    *************************
    Option ExplicitPrivate mWndProcOrg As LongPrivate mHWndSubClassed As LongPrivate Const WM_MOUSEACTIVATE = &H21Const m_def_CanPopup = 0
    Dim m_CanPopup As BooleanPrivate Sub SubClass()
        If mWndProcOrg Then Exit Sub
       
        mWndProcOrg = SetWindowLong(txtEx.hWnd, GWL_WNDPROC, AddressOf SubWndProc)
        mHWndSubClassed = txtEx.hWnd
        Call SetWindowLong(mHWndSubClassed, GWL_USERDATA, ObjPtr(Me))
    End SubPrivate Sub UnSubClass()
        If mWndProcOrg = 0 Then Exit Sub
        
        SetWindowLong mHWndSubClassed, GWL_WNDPROC, mWndProcOrg
        mWndProcOrg = 0
    End SubFriend Function WindowProc(ByVal hWnd As Long, _
                               ByVal uMsg As Long, _
                               ByVal wParam As Long, _
                               ByVal lParam As Long) As Long
        If (Not (uMsg = 516)) Or (m_CanPopup) Then
            WindowProc = CallWindowProc(mWndProcOrg, hWnd, uMsg, wParam, ByVal lParam)
        End If
    End FunctionPrivate Sub UserControl_Initialize()
        txtEx.Top = 0
        txtEx.Left = 0
        SubClass
    End SubPrivate Sub UserControl_Resize()
        txtEx.Width = UserControl.Width
        txtEx.Height = UserControl.Height
    End SubPrivate Sub UserControl_Terminate()
        UnSubClass
    End SubPublic Property Get CanPopup() As Boolean
        CanPopup = m_CanPopup
    End PropertyPublic Property Let CanPopup(ByVal New_CanPopup As Boolean)
        m_CanPopup = New_CanPopup
        PropertyChanged "CanPopup"
    End PropertyPrivate Sub UserControl_InitProperties()
        m_CanPopup = m_def_CanPopup
    End SubPrivate Sub UserControl_ReadProperties(PropBag As PropertyBag)    m_CanPopup = PropBag.ReadProperty("CanPopup", m_def_CanPopup)
        txtEx.Locked = PropBag.ReadProperty("Locked", False)
    End SubPrivate Sub UserControl_WriteProperties(PropBag As PropertyBag)    Call PropBag.WriteProperty("CanPopup", m_CanPopup, m_def_CanPopup)
        Call PropBag.WriteProperty("Locked", txtEx.Locked, False)
    End SubPublic Property Get Locked() As Boolean
        Locked = txtEx.Locked
    End PropertyPublic Property Let Locked(ByVal New_Locked As Boolean)
        txtEx.Locked() = New_Locked
        PropertyChanged "Locked"
    End Property
      

  32.   

    上面的最大的不同点是把没个usercontrol的地址写到了它的text控件的userdata里面了,
    并把text控件子类化,在wndproc中把想应的地址读出来,并调用这个usercotrol的一个过程,
    在这个过程中把消息拦截,这个就可以一一对应,而且不用写多个过程.
    有兴趣的看看吧.