TScrollBox... |
缺席
|
小貓
一般會員 發表:14 回覆:23 積分:12 註冊:2002-07-04 發送簡訊給我 |
|
okiss
一般會員 發表:11 回覆:55 積分:13 註冊:2002-11-27 發送簡訊給我 |
我是把一個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 發送簡訊給我 |
這個辦法行不通, 因為還是會產生抖動, 我覺得關鍵在於 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 發送簡訊給我 |
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 發送簡訊給我 |
我的問題終於解決了, 如下: 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 類的視窗捲動時其所屬的子元件不會更著一起捲動.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |