Function WndProc_DialogIBH(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim dRc As RECT, mRc As RECT
    
    Select Case Msg
        Case WM_INITDIALOG
            GetWindowRect hWnd, dRc
            GetClientRect GetParent(hWnd), mRc
            MoveWindow hWnd, _
                        0, 0, _
                        mRc.Right - mRc.Left, _
                        dRc.Bottom - dRc.Top, _
                        True
            ShowWindow hWnd, SW_SHOW
        Case WM_CTLCOLORSTATIC
            Debug.Print wParam, lParam, "Static"
            SetBkMode wParam, TRANSPARENT
            WndProc_DialogIBH = GetStockObject(NULL_BRUSH)
        Case WM_CTLCOLOREDIT
            Debug.Print wParam, lParam, "Edit"
        Case WM_DESTROY: PostQuitMessage 0
    End Select
End Function

解决方案 »

  1.   

    下面贴张图片
    我故意把对话框位置覆盖在工具栏上面,来表现Static的透明
    可以看到,Edit控件全变黑了!
      

  2.   

    说明一下,对话框附带有WS_CHILD,我把它当子窗体放在了VB的一个MDI子窗体上了
      

  3.   

    我把图片修改了一下,用了Rebar来做背景,把对话框移回原来的位置了
      

  4.   

    嘿嘿,经过我艰苦的研究,终于搞好了!
    Function WndProc_DialogIBH(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim dRc As RECT, mRc As RECT    Select Case Msg
            Case WM_INITDIALOG
                GetWindowRect hWnd, dRc
                GetClientRect GetParent(hWnd), mRc
                MoveWindow hWnd, _
                            0, 60, _
                            mRc.Right - mRc.Left, _
                            dRc.Bottom - dRc.Top, _
                            True
                ShowWindow hWnd, SW_SHOW
                SendMessage GetDlgItem(hWnd, ID_IBH_CRUSER), WM_SETTEXT, 0, ByVal "Test"
            Case WM_CTLCOLORDLG
                SetBkMode wParam, TRANSPARENT
                WndProc_DialogIBH = GetStockObject(NULL_BRUSH)
            Case WM_CTLCOLORSTATIC
                Select Case GetWindowLong(lParam, GWL_ID)
                    Case ID_IBH_STATIC1, ID_IBH_STATIC2, ID_IBH_STATIC3, ID_IBH_STATIC4, _
                        ID_IBH_STATIC5, ID_IBH_STATIC6, ID_IBH_SPLIT
                        SetBkMode wParam, TRANSPARENT
                        WndProc_DialogIBH = GetStockObject(NULL_BRUSH)
                End Select
            Case WM_DESTROY: PostQuitMessage 0
        End Select
    End Function根据上面的代码和图片效果判断,其实Edit控件里面也包含有Static控件,所以在处理WM_CTLCOLORSTATIC消息的时候,也把Edit控件里面的Static也处理了~深层的原因我不了解,反正有我要的效果就行了!!!!!!
      

  5.   

    附带提一下,如果Edit控件不是Disabled或ReadOnly的话,是不会有这问题的
      

  6.   

    是因为你触发了 edit 控件的
            Case WM_CTLCOLORDLG
     
           Case WM_CTLCOLORSTATIC消息,而消息内也没有对Static和edit进行分析的问题吧?从你两次代码来看,和你提到的edit属性问题,好像是哦?setbkmode TRANSPARENT 还可以让控件背景透明? 试试去...
    我一直用它来输出无背景的字符,难道他还有这功能.....还有这句  WndProc_DialogIBH = GetStockObject(NULL_BRUSH) 
    是有他用呢? 还是没用到呢?
      

  7.   

    WM_CTLCOLOREDIT消息才是对Edit控件的背景操作
    我上面代码中的那两个不是!至于为什么我处理Static背景的时候,连Edit也处理掉,原因应该是因为Edit控件里面也包含有Static
    因为我在回调函数中的WM_CTLCOLORSTATIC消息中,把wParam(控件ID)和lParam(控件句柄)打印出来,发现这个wParam并不是我对话框上已知(就是我自己设置的)的Static的ID,所以我估计这个ID应该是Edit上面的Static的ID至于GetStockObject(NULL_BRUSH)的作用,是一定要的。
    传递一个空刷子给对话框,让它不画任何东西在控件背景中如果只要SetBKMode而不要刷子,是没用的。
      

  8.   

    对 WM_CTLCOLOR* 这个消息不熟悉,请楼主见谅
    我是想知道 这个消息是初始化时被调用一次吗?
    如果不是 GetStockObject(NULL_BRUSH) 后为什么不 selectobject ?
    否则刷子怎么被选如场景?
      

  9.   

    对 WM_CTLCOLOR* 这个消息不熟悉,请楼主见谅
    我是想知道 这个消息是初始化时被调用一次吗?
    如果不是 GetStockObject(NULL_BRUSH) 后为什么不 selectobject ?
    否则刷子怎么被选如场景?