C
cemi
Unregistered / Unconfirmed
GUEST, unregistred user!
1,尝试用EnumChildWindows,ChildWindowFromPoint等函数获取ScrollBar的Handle,<br> 都失败。<br><br>2,继承TCustomerListView然后在OnCreate的事件创建一个TPanel,并用setwindowpos改变它的Z轴的位置<br> 但这个Panel始终被ScrollBar遮住,也失败。<br><br>3,在响应窗口的WM_HSCROLL或WM_VSCROLL时用以下的代码 <br> ...........<br> ..........<br> DC:=GetDC(0); <br> P:=Self.ClientToScreen(point(0,0));<br> R:=RECT(P.x+width-FSBWidth, P.y, P.x+width, P.y+height);<br> Fillrect(DC,R,Brush);<br> .............<br> ...........<br> 这样在鼠标拖动滑块时就会原形毕露,并且不知道怎样响应ScrollBar的OnMouseDown,OnMouseUp等的消息,<br> 所以也失败。<br><br>4, 跟着在MSDN中查到以下的一些函数<br> InitializeFlatSB ,FlatSB_SetScrollProp ,FlatSB_ShowScrollBar.... 等的一些函数<br> 写了下面的函数<br> function TCEMIListView.PaintVSB:boolean;<br> var<br> PE:TPaletteEntry;<br> LP:TLogPalette;<br> PL:HPALETTE;<br> begin<br> result:=false;<br> if not InitializeFlatSB(handle) then exit;<br> if not FlatSB_SetScrollProp(handle,WSB_PROP_VBKGCOLOR ,clBlue,true) then exit;<br> with PE do<br> begin<br> peRed:=$7F;<br> peBlue:=$4F;<br> peGreen:=$7F;<br> peFlags:=PC_EXPLICIT; //?<br> end;<br> with LP do<br> begin<br> palVersion:=1;<br> palNumEntries:=1;<br> palPalEntry[0]:=PE; //?<br> end;<br> PL:=CreatePalette(LP);<br> if not FlatSB_SetScrollProp(handle,WSB_PROP_PALETTE,PL,true) then exit;<br> result:=true;<br> end;<br> 调用这个函数返回的是True,并且可以把ScrollBar变成Flat的样式和把背景颜色改成蓝色,<br> 但用Palette填充的语句根部不起作用,不知道那里写错了。就算可以用Palette填充,还是<br> 跟我想达到的目的有很大的差距。<br> <br>最后我已经无计可施,恳请大家指点。