在VB下如何使用CreateStruct结构
我想要在WM_CREATE消息中修改CreateStruct结构的属性

解决方案 »

  1.   

    Public Type CREATESTRUCT
            lpCreateParams As Long
            hInstance As Long
            hMenu As Long
            hWndParent As Long
            cy As Long
            cx As Long
            y As Long
            x As Long
            style As Long
            lpszName As String
            lpszClass As String
            ExStyle As Long
    End Type
      

  2.   

    结构我知道,
    在WM_CREATE消息中捕捉到之后
    C中好像是这样使用:
    (CreatStruct *)lParam->cx = 330但我要在VB中如何修改它
      

  3.   

    是这个意思吗?
    dim mSturce as  CREATESTRUCTmSturce.cx=330
      

  4.   

    WM_CREATE消息的lParam参数就是一个指向CREATESTRUCT结构的指针,你可以通过CopyMemory把它取出放在自己的CREATESTRUCT类型的变量中。用法:
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
         dim mSturce as  CREATESTRUCT
         Select Case uMsg
    '...
            Case WM_CREATE
             If lParam <> 0 Then 
                CopyMemory mSturce, ByVal lParam, Len(cr)
                Debug.Print mSturce.cx
             End If
    '...
         End Select
    '...
    End Function这里要注意一点:CREATESTRUCT结构中的lpszName与lpszClass是两个指向变长字符串的指针,而VB不能像C一样识别以null结尾的字符串,我试过若串中含有中文时,会引起非法操作。
    所以建议将lpszName与lpszClass声明改为Long 就没事了。
      

  5.   

    lpszName与lpszClass声明改为Long ??
    不是很理解,请详细给我解释一下,谢谢
      

  6.   

    VB与API间传递字符串,历来是件让人头痛的事件,尤其是在结构中的变长串!变长串变量不管VB还是API都是一个Long型指针,由于VB使用BSTR字符串,它有一个包含串长信息的头部,所以不能像C一样识别以一个null结尾的字符串,大多数情况下调用API,采用Byval String声明的参数,VB会自动完成LPSTR到BSTR的转换,但在结构中就会遇到麻烦,因为结构只能Byref传递,没有了VB自动转换BSTR的长度信息将得不到可靠维护,越址访问就难免会发生,极端的例子就是:String中含有中文时。
    声明成Long,我们就是告诉VB:“对字符串别自已乱处理了,把地址给我,我自己转换!”按址取出LPSTR字符串,并不难,方法很多,lstrcpy就可以,接上面例子我再说一种方法:lpszName与lpszClass声明改为LongPrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long     Dim a() As Byte,s As String
         ReDim a(lstrlen(cr.lpszName) - 1)
         CopyMemory a(0), ByVal cr.lpszName, lstrlen(cr.lpszName)
         s = StrConv(a, vbUnicode)
         Debug.Print s