 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
nelsonchuang
註冊時間: 2003-09-04 文章: 563 來自: 臺灣
第 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 文章: 563 來自: 臺灣
第 4 樓
|
發表於: 星期三 五月 20, 2009 5:11 pm 文章主題: |
|
|
@@||
好長的程式碼,我這幾天,試試,先在此感謝~ _________________ 大家好,請多指教 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|