線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2078
推到 Plurk!
推到 Facebook!

TScrollBox...

缺席
小貓
一般會員


發表:14
回覆:23
積分:12
註冊:2002-07-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-03 17:59:39 IP:211.74.xxx.xxx 未訂閱
如何使 TScrollBox 在捲動時其裡面的子元件不會一起捲動? 本來我是改寫 TWinControl::CustomAlignPosition 函式, 可是當這個函式被執行時子視窗已經發生捲動了, 如果再設定子視窗的位置會感覺抖動了一下.
okiss
一般會員


發表:11
回覆:55
積分:13
註冊:2002-11-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-04 08:17:13 IP:163.28.xxx.xxx 未訂閱
我是把一個Panel永遠固定在ScrollBox的最左邊... 寫法如下.. void __fastcall TMemoBox::ScrollBoxCanResize(TObject *Sender, int &NewWidth,int &NewHeight, bool &Resize) { //當重繪ScrollBox時固定ImagePanel於最左方 if(Panel->Left) Panel->Left=0; } 改寫CanResize囉..^^.. 不知這是不是你要的...
小貓
一般會員


發表:14
回覆:23
積分:12
註冊:2002-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-04 09:20:36 IP:211.74.xxx.xxx 未訂閱
這個辦法行不通, 因為還是會產生抖動, 我覺得關鍵在於 TWinControl.ScrollBy 這個函式, 因為它呼叫了 Win32 API 的 ScrollWindow 函式, 這使得 TScrollBox 底下的子元件會先移動(偏移), 如果再次修正子元件的座標只會讓子元件看起來會抖動罷了(先移動之後再回到原來的位置).如下的程式碼:    procedure TWinControl.ScrollBy(DeltaX, DeltaY: Integer); begin   ...   ...    IsVisible := (FHandle <> 0) and IsWindowVisible(FHandle);   if IsVisible then ScrollWindow(FHandle, DeltaX, DeltaY, nil, nil);   ...   ... end;    
小貓
一般會員


發表:14
回覆:23
積分:12
註冊:2002-07-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-04 09:42:03 IP:211.74.xxx.xxx 未訂閱
procedure TWinControl.ScrollBy(DeltaX, DeltaY: Integer); begin ... ... IsVisible := (FHandle <> 0) and IsWindowVisible(FHandle); if IsVisible then ScrollWindow(FHandle, DeltaX, DeltaY, nil, nil); // 難道視窗一定要不可見嗎? // IsWindowVisible 會檢查 WS_VISIBLE 是否被設定(包括視窗的父視窗) // 所以我目前的解決方式如下: ... ... end; procedure TFrame2.WMHScroll(var Message: TWMHScroll); var Style: Integer; begin //取消 WS_VISIBLE, 不要使用 ShowWindow(Handle,SW_HIDE); Style := GetWindowLong(Handle,GWL_STYLE); Style := Style and not WS_VISIBLE; SetWindowLong(Handle,GWL_STYLE,Style); //呼叫原來的 WMHScroll 處理方式 inherited; //需要使用 ShowWindow(Handle,SW_SHOW); //SetWindowLong(Handle,GWL_STYLE,Style or WS_VISIBLE); ShowWindow(Handle,SW_SHOW); end; PS: 我所試出的結果在 BCB 與 Delphi 會不同, 不過都可達到相同的目的.
小貓
一般會員


發表:14
回覆:23
積分:12
註冊:2002-07-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-05 09:17:05 IP:211.74.xxx.xxx 未訂閱
我的問題終於解決了, 如下: procedure TControlScrollBar.SetPosition(Value: Integer); var Code: Word; Form: TCustomForm; OldPos: Integer; begin if csReading in FControl.ComponentState then FPosition := Value else begin if Value > FCalcRange then Value := FCalcRange else if Value < 0 then Value := 0; if Kind = sbHorizontal then Code := SB_HORZ else Code := SB_VERT; if Value <> FPosition then begin OldPos := FPosition; FPosition := Value; { //拿掉這些程式碼 if Kind = sbHorizontal then FControl.ScrollBy(OldPos - Value, 0) else FControl.ScrollBy(0, OldPos - Value); } if csDesigning in FControl.ComponentState then begin Form := GetParentForm(FControl); if (Form <> nil) and (Form.Designer <> nil) then Form.Designer.Modified; end; end; if FlatSB_GetScrollPos(FControl.Handle, Code) <> FPosition then FlatSB_SetScrollPos(FControl.Handle, Code, FPosition, True); end; end; 主要是自訂一個 TMyControlScrollBar 及 TMyScrollingWinControl 程式碼完全"拷貝 貼上", 但是須哪掉上述程式碼及修正一些碼, 我這麼做的目的是希望當 TScrollingWinControl 類的視窗捲動時其所屬的子元件不會更著一起捲動.
系統時間:2024-04-26 16:10:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!