全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3452
推到 Plurk!
推到 Facebook!

實現 StringGrid Flat ScrollBar 平滑捲軸風格(原創)

 
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-17 17:34:10 IP:61.222.xxx.xxx 訂閱
搞不清楚 Delphi 捲軸為什麼不統一支援Flat
原以為應該很簡單,花了半天找不到有完整並正確的程式碼。
大部分都畫面跟捲軸位置跟不上,或者移動一下就原形畢露。

只好自己寫。....
公佈出來給大家參考,有問題再聯絡。
[code delphi]
uses Commctrl;

type
TEvStrGrid = class(TStringGrid)
Private
Procedure UpdateScrollInfo(Code:Word);
protected
procedure CreateWnd; override;
procedure TopLeftChanged; override;
procedure SizeChanged(OldColCount, OldRowCount: Longint);override;
procedure WMVScroll(var Msg: TWMVScroll); message WM_VSCROLL;
procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
public
end;

procedure TEvStrGrid.SizeChanged(OldColCount, OldRowCount: Longint);
begin
inherited SizeChanged(OldColCount, OldRowCount);

if (OldRowCount<>RowCount) and (ScrollBars in [ssVertical, ssBoth]) then
begin
FlatSB_ShowScrollBar(Handle,SB_VERT,Pred(RowCount)>VisibleRowCount);
end;
if (OldColCount<>ColCount) and (ScrollBars in [ssHorizontal, ssBoth]) then
begin
FlatSB_ShowScrollBar(Handle,SB_HORZ,Pred(ColCount)>VisibleColCount);
end;
end;

procedure TEvStrGrid.CreateWnd;
begin
inherited CreateWnd;
InitializeFlatSB(Handle);
FlatSB_SetScrollProp(Handle, WSB_PROP_VSTYLE, FSB_ENCARTA_MODE, True);
FlatSB_SetScrollProp(Handle, WSB_PROP_HSTYLE, FSB_ENCARTA_MODE, True);
end;

Procedure TEvStrGrid.UpdateScrollInfo(Code:Word);
var
SI : TScrollInfo;
begin
SI.cbSize := SizeOf(TScrollInfo);
SI.fMask := SIF_ALL;
if GetScrollInfo(Handle, Code, SI) then FlatSB_SetScrollInfo(Handle, Code, SI, True);
end;

procedure TEvStrGrid.WMVScroll(var Msg: TWMVScroll);
begin
inherited;
UpdateScrollInfo(SB_VERT);
end;

procedure TEvStrGrid.WMHScroll(var Msg: TWMHScroll);
begin
inherited;
UpdateScrollInfo(SB_HORZ);
end;

procedure TEvStrGrid.TopLeftChanged;
var
Postion : Integer;
begin
inherited;
Postion := GetScrollPos(Handle,SB_VERT);
if Postion >= 0 then FlatSB_SetScrollPos(Handle, SB_VERT, Postion, True);
Postion := GetScrollPos(Handle,SB_HORZ);
if Postion >= 0 then FlatSB_SetScrollPos(Handle, SB_HORZ, Postion, True);
end;
[/code]
編輯記錄
yckuo 重新編輯於 2007-09-17 17:48:29, 註解 套用程式碼高亮顯示‧
系統時間:2024-04-23 19:08:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!