  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		nelsonchuang
 
 
  註冊時間: 2003-09-04 文章: 564 來自: 臺灣
  第 1 樓
  | 
		
			
				 發表於: 星期四 五月 07, 2009 10:41 am    文章主題: 工具條的顏色 | 
				     | 
			 
			
				
  | 
			 
			
				請問一下,有那一位知道?要如何纔能改變工具條的顏色?
 
工具條=自訂的工具列停靠時,會有 一條帶狀的地方,讓工具列停靠.
 
我指的就是那一條的地方.
 
麻煩各位指點一下,謝謝~ _________________ 大家好,請多指教 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		thornbird313
 
 
  註冊時間: 2004-12-14 文章: 23
 
  第 2 樓
  | 
		
			
				 發表於: 星期三 五月 20, 2009 4:56 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				| 可以利用API函数FindWindowEx遍历_VFP的所有子窗口,然后将不是工具栏停靠区的窗口排除。接下来绑定工具栏停靠区的WM_NCPAINT及WM_PAINT消息,每当这类消息触发时都用PatBlt函数填充一下工具栏停靠区背景。并绑定各工具栏的WM_NCPAINT及WM_PAINT消息,工具栏接收到这两个消息时同样也进行填充工具栏停靠区背景的操作。 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		thornbird313
 
 
  註冊時間: 2004-12-14 文章: 23
 
  第 3 樓
  | 
		
			
				 發表於: 星期三 五月 20, 2009 4:57 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				下面是我的示例代码:
 
 
 
 
 
PUBLIC goDrawToolBarContainer, goToolBar1, goToolBar2
 
goDrawToolBarContainer = CREATEOBJECT("DrawToolBarContainer")
 
goToolBar1 = CREATEOBJECT("MyToolBar")
 
goToolBar1.AddObject("Command1", "CommandButton")
 
goToolBar1.AddObject("Command2", "CommandButton")
 
goToolBar1.AddObject("Command3", "CommandButton")
 
goToolBar1.Command1.Visible = .T.
 
goToolBar1.Command2.Visible = .T.
 
goToolBar1.Command3.Visible = .T.
 
goToolBar1.Dock(0)
 
goToolBar1.Show()
 
goToolBar2 = CREATEOBJECT("MyToolBar")
 
goToolBar2.AddObject("Command1", "CommandButton")
 
goToolBar2.Command1.Visible = .T.
 
goToolBar2.Dock(1)
 
goToolBar2.Show()
 
 
 
 
DEFINE CLASS MyToolBar AS Toolbar
 
    
 
    #DEFINE WM_NCPAINT 0x0085
 
    #DEFINE WM_PAINT 0x000F
 
    #DEFINE GWL_WNDPROC -4
 
    
 
    ADD OBJECT cmdClear AS CommandButton WITH ;
 
            Width = 50, ;
 
            Height = 24, ;
 
            Caption = "Clear", ;
 
            BackColor = RGB(255, 0, 0)
 
 
    PROCEDURE Init
 
        = BINDEVENT(THIS.HWnd, WM_NCPAINT, THIS, "HandleWinMsg", 4)
 
        = BINDEVENT(THIS.HWnd, WM_PAINT, THIS, "HandleWinMsg", 4)
 
    ENDPROC
 
    
 
    PROCEDURE Destroy
 
        = UNBINDEVENTS(THIS.HWnd, WM_NCPAINT)
 
        = UNBINDEVENTS(THIS.HWnd, WM_PAINT)
 
    ENDPROC
 
    
 
    PROCEDURE AfterDock
 
        LOCAL lnParentHWnd
 
        IF TYPE("goDrawToolBarContainer.Name") <> "C"
 
            RETURN
 
        ENDIF
 
        lnParentHWnd = goDrawToolBarContainer.GetParent(THIS.HWnd)
 
        IF lnParentHWnd <> 0
 
            goDrawToolBarContainer.BindEventToToolBarContainer(lnParentHWnd, .T.)
 
        ENDIF
 
    ENDPROC
 
    
 
    PROCEDURE HandleWinMsg
 
        LPARAMETERS hWnd, Msg, wParam, lParam
 
        LOCAL lnReturnValue
 
        lnReturnValue = 0
 
        IF TYPE("goDrawToolBarContainer.Name") <> "C"
 
            RETURN lnReturnValue
 
        ENDIF
 
        lnReturnValue = WIN32_CallWindowProc(WIN32_GetWindowLong(THIS.HWnd, GWL_WNDPROC), ;
 
                hWnd, Msg, wParam, lParam)
 
        goDrawToolBarContainer.DrawToolBarContainer()
 
        RETURN lnReturnValue
 
    ENDPROC
 
    
 
    PROCEDURE cmdClear.Click
 
        goDrawToolBarContainer = NULL
 
        THIS.Parent.Release()
 
    ENDPROC
 
    
 
ENDDEFINE
 
 
 
 
DEFINE CLASS DrawToolBarContainer AS Custom
 
 
    #DEFINE WM_NCPAINT 0x0085
 
    #DEFINE WM_PAINT 0x000F
 
    #DEFINE GWL_WNDPROC -4
 
    #DEFINE GWL_EXSTYLE -20
 
    #DEFINE WS_EX_LEFTSCROLLBAR 0x4000
 
    #DEFINE SYSTEM_STATUSBAR_HEIGHT 24
 
    #DEFINE PATCOPY 0x00F00021
 
    
 
    HIDDEN ToolBarContainers
 
 
    PROCEDURE Init
 
        LOCAL lnCount, laHandles[1], i
 
        THIS.DeclareDlls()        
 
        lnCount = THIS.GetToolBarContainerHandleList(@laHandles)
 
        FOR i = 1 TO lnCount
 
            THIS.BindEventToToolBarContainer(laHandles[i], .T.)
 
        ENDFOR
 
        THIS.DrawToolBarContainer()
 
    ENDPROC
 
    
 
    PROCEDURE Destroy
 
        LOCAL i
 
        THIS.ClearToolBarContainerBindings()
 
        FOR i = 1 TO _SCREEN.FormCount
 
            IF UPPER(_SCREEN.Forms[i].BaseClass) == "TOOLBAR"
 
                _SCREEN.Forms[i].Dock(-1)
 
            ENDIF
 
        ENDFOR
 
    ENDPROC
 
 
    HIDDEN PROCEDURE DeclareDlls
 
        DECLARE INTEGER GetParent IN USER32 AS WIN32_GetParent ;
 
                INTEGER hWnd
 
        DECLARE INTEGER GetClassName IN USER32 AS WIN32_GetClassName ;
 
                INTEGER hWnd, STRING @lpClassName, INTEGER nMaxCount
 
        DECLARE INTEGER FindWindowEx IN USER32 AS WIN32_FindWindowEx ;
 
                INTEGER hwndParent, INTEGER hwndChildAfter, ;
 
                STRING lpClassName, STRING lpWindowName
 
        DECLARE INTEGER GetWindowRect IN USER32 AS WIN32_GetWindowRect ;
 
                INTEGER hWnd, STRING @cRect
 
        DECLARE INTEGER GetClientRect IN USER32 AS WIN32_GetClientRect ;
 
                INTEGER hWnd, STRING @cRect
 
        DECLARE INTEGER GetWindowLong IN USER32 AS WIN32_GetWindowLong ;
 
                INTEGER hWnd, INTEGER nIndex
 
        DECLARE INTEGER SetWindowLong IN USER32 AS WIN32_SetWindowLong ;
 
                INTEGER hWnd, INTEGER nIndex, INTEGER dwNewLong
 
        DECLARE INTEGER GetDC IN USER32 AS WIN32_GetDC ;
 
                INTEGER hWnd
 
        DECLARE INTEGER ReleaseDC IN USER32 AS WIN32_ReleaseDC ;
 
                INTEGER hWnd, INTEGER hDC                
 
        DECLARE INTEGER SelectObject IN GDI32 AS WIN32_SelectObject ;
 
                INTEGER hDC, INTEGER hObject
 
        DECLARE INTEGER DeleteObject IN GDI32 AS WIN32_DeleteObject ;
 
                INTEGER hObject
 
        DECLARE INTEGER CreateSolidBrush IN GDI32 AS WIN32_CreateSolidBrush ;
 
                INTEGER crColor
 
        DECLARE INTEGER PatBlt IN GDI32 AS WIN32_PatBlt ;
 
                INTEGER hDC, INTEGER x, INTEGER y, INTEGER nWidth, INTEGER nHeight, ;
 
                INTEGER dwRop
 
        DECLARE INTEGER CallWindowProc IN USER32 AS WIN32_CallWindowProc ;
 
                INTEGER lpPrevWndFunc, INTEGER hWnd, INTEGER Msg, ;
 
                INTEGER wParam, INTEGER lParam
 
        DECLARE INTEGER SendMessage IN USER32 AS WIN32_SendMessage ;
 
                INTEGER hWnd, INTEGER wMsg, INTEGER wParam, INTEGER lParam
 
    ENDPROC
 
    
 
    PROCEDURE GetParent
 
        LPARAMETERS tnHWnd
 
        LOCAL lnParentHWnd
 
        lnParentHWnd = WIN32_GetParent(tnHWnd)
 
        RETURN lnParentHWnd
 
    ENDPROC
 
    
 
    PROCEDURE BindEventToToolBarContainer
 
        LPARAMETERS tnHWnd, tlBind
 
        LOCAL lcKey, lcRect
 
        lcKey = ALLTRIM(STR(tnHWnd))
 
        IF TYPE("THIS.ToolBarContainers.Count") <> "N"
 
            THIS.ToolBarContainers = CREATEOBJECT("Collection")
 
        ENDIF
 
        IF tlBind = .T. AND THIS.ToolBarContainers.GetKey(lcKey) > 0
 
            RETURN
 
        ENDIF
 
        IF tlBind = .F. AND THIS.ToolBarContainers.GetKey(lcKey) = 0
 
            RETURN
 
        ENDIF
 
        IF tlBind = .T.
 
            = BINDEVENT(tnHWnd, WM_NCPAINT, THIS, "HandleToolBarContainerWinMsg", 4)
 
            = BINDEVENT(tnHWnd, WM_PAINT, THIS, "HandleToolBarContainerWinMsg", 4)
 
            THIS.ToolBarContainers.Add(tnHWnd, lcKey)
 
        ELSE
 
            THIS.ToolBarContainers.Remove(lcKey)
 
            = UNBINDEVENTS(tnHWnd, WM_NCPAINT)
 
            = UNBINDEVENTS(tnHWnd, WM_PAINT)
 
        ENDIF
 
    ENDPROC
 
    
 
    PROCEDURE ClearToolBarContainerBindings
 
        LOCAL i
 
        IF TYPE("THIS.ToolBarContainers.Count") <> "N"
 
            RETURN
 
        ENDIF
 
        DO WHILE THIS.ToolBarContainers.Count > 1
 
            THIS.BindEventToToolBarContainer(THIS.ToolBarContainers.Item(1), .F.)
 
        ENDDO
 
        THIS.ToolBarContainers = NULL
 
    ENDPROC
 
    
 
    HIDDEN PROCEDURE HandleToolBarContainerWinMsg
 
        LPARAMETERS hWnd, Msg, wParam, lParam
 
        LOCAL lnReturnValue, lnAddress
 
        lnAddress = WIN32_GetWindowLong(hWnd, GWL_WNDPROC)
 
        lnReturnValue = WIN32_CallWindowProc(lnAddress, hWnd, Msg, wParam, lParam)
 
        THIS.DrawToolBarContainer(hWnd)
 
        RETURN lnReturnValue
 
    ENDPROC
 
    
 
    PROCEDURE DrawToolBarContainer
 
        LPARAMETERS tnHWnd
 
        LOCAL laHandles[1], lnCount, i, lcRect, lnLeft, lnTop, lnRight, lnBottom, ;
 
                lnDC, lnBrush, lnOldBrush
 
        IF TYPE("tnHWnd") = "N"
 
            laHandles[1] = tnHWnd
 
            lnCount = 1
 
        ELSE
 
            lnCount = THIS.GetToolBarContainerHandleList(@laHandles)
 
        ENDIF
 
        FOR i = 1 TO lnCount
 
            lcRect = REPLICATE(CHR(0), 16)
 
            = WIN32_GetWindowRect(laHandles[i], @lcRect)
 
            lnLeft = CTOBIN(SUBSTR(lcRect, 1, 4), "4RS")
 
            lnTop = CTOBIN(SUBSTR(lcRect, 5, 4), "4RS")
 
            lnRight = CTOBIN(SUBSTR(lcRect, 9, 4), "4RS")
 
            lnBottom = CTOBIN(SUBSTR(lcRect, 13, 4), "4RS")
 
            lnDC = WIN32_GetDC(laHandles[i])
 
            lnBrush = WIN32_CreateSolidBrush(0x888800)
 
            lnOldBrush = WIN32_SelectObject(lnDC, lnBrush)
 
            = WIN32_PatBlt(lnDC, 0, 0, lnRight - lnLeft, lnBottom - lnTop, PATCOPY)
 
            lnBrush = WIN32_SelectObject(lnDC, lnOldBrush)
 
            = WIN32_DeleteObject(lnBrush)
 
            = WIN32_ReleaseDC(laHandles[i], lnDC)
 
        ENDFOR
 
    ENDPROC
 
 
    HIDDEN PROCEDURE GetToolBarContainerHandleList
 
        LPARAMETERS taArray
 
        LOCAL lnReturnValue, lcClassName, lnHandle, lnCount, i, lcRect, lnTop, lnHeight, lnExStyle
 
        lnReturnValue = 0
 
        lcClassName = SPACE(100)
 
        = WIN32_GetClassName(_VFP.hWnd, @lcClassName, LEN(lcClassName))
 
        lcClassName = ALLTRIM(lcClassName)
 
        lcClassName = IIF(RIGHT(lcClassName, 1) == CHR(0), ;
 
                LEFT(lcClassName, LEN(lcClassName) - 1), ;
 
                lcClassName)
 
        lnHandle = WIN32_FindWindowEx(_VFP.hWnd, 0, lcClassName, NULL)
 
        IF lnHandle = 0
 
            RETURN lnReturnValue
 
        ENDIF
 
        lnCount = 1
 
        DIMENSION laHandles[1]
 
        laHandles[1] = lnHandle
 
        DO WHILE .T.
 
            lnHandle = WIN32_FindWindowEx(_VFP.hWnd, lnHandle, lcClassName, NULL)
 
            IF lnHandle = 0
 
                EXIT
 
            ENDIF
 
            IF lnHandle <> _SCREEN.HWnd
 
                lnCount = lnCount + 1
 
                DIMENSION laHandles[lnCount]
 
                laHandles[lnCount] = lnHandle
 
            ENDIF
 
        ENDDO
 
        lnHandle = 0
 
        FOR i = 1 TO lnCount
 
            lcRect = REPLICATE(CHR(0), 16)
 
            = WIN32_GetWindowRect(laHandles[i], @lcRect)
 
            lnTop = CTOBIN(SUBSTR(lcRect, 5, 4), "4RS")
 
            lnHeight = CTOBIN(SUBSTR(lcRect, 13, 4), "4RS") - lnTop
 
            lnExStyle = WIN32_GetWindowLong(laHandles[i], GWL_EXSTYLE)
 
            IF lnExStyle <> BITAND(lnExStyle, BITNOT(WS_EX_LEFTSCROLLBAR))
 
                laHandles[i] = 0
 
                EXIT
 
            ENDIF
 
            IF lnHeight = SYSTEM_STATUSBAR_HEIGHT
 
                = WIN32_GetWindowRect(_VFP.hWnd, @lcRect)
 
                IF lnTop = CTOBIN(SUBSTR(lcRect, 13, 4), "4RS") - ;
 
                        CTOBIN(SUBSTR(lcRect, 5, 4), "4RS") - ;
 
                        SYSTEM_STATUSBAR_HEIGHT - ;
 
                        THIS.GetWindowBorderSize(_VFP.hWnd) * 2
 
                    lnExStyle = BITOR(BITAND(lnExStyle, ;
 
                            BITNOT(WS_EX_LEFTSCROLLBAR)), ;
 
                            WS_EX_LEFTSCROLLBAR)
 
                    = WIN32_SetWindowLong(laHandles[i], GWL_EXSTYLE, lnExStyle)
 
                    laHandles[i] = 0
 
                    EXIT
 
                ENDIF
 
            ENDIF
 
        ENDFOR
 
        FOR i = 1 TO lnCount
 
            IF laHandles[i] <> 0
 
                lnReturnValue = lnReturnValue + 1
 
                DIMENSION taArray[lnReturnValue]
 
                taArray[lnReturnValue] = laHandles[i]
 
            ENDIF
 
        ENDFOR
 
        RETURN lnReturnValue
 
    ENDPROC
 
    
 
    HIDDEN PROCEDURE GetWindowBorderSize
 
        LPARAMETERS tnHWnd
 
        LOCAL lnBorderSize, lcRect1, lcRect2, lnWidth1, lnWidth2
 
        lnBorderSize = 0
 
        lcRect1 = REPLICATE(CHR(0), 16)
 
        lcRect2 = REPLICATE(CHR(0), 16)
 
        = WIN32_GetWindowRect(tnHWnd, @lcRect1)
 
        = WIN32_GetClientRect(tnHWnd, @lcRect2)
 
        lnWidth1 = CTOBIN(SUBSTR(lcRect1, 9, 4), "4RS") - CTOBIN(SUBSTR(lcRect1, 1, 4), "4RS") + 1
 
        lnWidth2 = CTOBIN(SUBSTR(lcRect2, 9, 4), "4RS") - CTOBIN(SUBSTR(lcRect2, 1, 4), "4RS") + 1
 
        lnBorderSize = (lnWidth1 - lnWidth2) / 2
 
        RETURN lnBorderSize
 
    ENDPROC
 
 
ENDDEFINE | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		nelsonchuang
 
 
  註冊時間: 2003-09-04 文章: 564 來自: 臺灣
  第 4 樓
  | 
		
			
				 發表於: 星期三 五月 20, 2009 5:11 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				@@||
 
好長的程式碼,我這幾天,試試,先在此感謝~ _________________ 大家好,請多指教 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |