請問如何讓兩個ListView的Scrollbar作同步化 |
尚未結案
|
u8702656
一般會員 ![]() ![]() 發表:2 回覆:5 積分:1 註冊:2003-07-10 發送簡訊給我 |
請教各位前輩
小弟目前在作資料夾中所有檔案的synchronization功能,因此必須使用兩個ListView用vsReport的ViewStyle作比對的列表,讓user方便對照
因為ListView中的ScrollBar為動態產生的所以沒有OnScroll這個Event,所以我是把Scroll的動作寫在OnCustomDrawItem中,並且在程式中判斷滑鼠所在的位置決定由哪一個ListView的OnCustomDrawItem事件來更新Scrollbar的位置,
但是這會造成當我再拖拉時滑鼠不在原本按下的那個ListView時,無法執行更新動作,以下是我的程式碼..
//---------------------------------------------------------------------------
void __fastcall TForm4::ListView2CustomDrawItem(TCustomListView *Sender,TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
RECT r;
::GetWindowRect(ListView2->Handle,&r);
//取得滑鼠位置
POINT pd;
GetCursorPos(&pd);
if(::PtInRect(&r,pd))
{
SCROLLINFO scroll; //宣告(ScrollBar)結構
memset(&scroll,0,sizeof(SCROLLINFO));//結構初始化
scroll.fMask = SIF_ALL; //取得ScrollBar全部資料的旗標
scroll.cbSize = sizeof(SCROLLINFO); //配置足夠記憶體
if(GetScrollInfo(ListView3->Handle,SB_VERT,&scroll))//取得垂直
//ScrollBar的資訊
//返回值如果是真的將得到以下各種資訊,否則代表ScrollBar沒有出現
{
if(ListView2->TopItem->Index > ListView3->TopItem->Index)
{
//令垂直ScrollBar向下翻頁 //SB_LINEUP
for(int i = ListView3->TopItem->Index;i
|
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
u8702656你好:
以下的Code是我用的方式,在bcb6可以運作正常,不知道能否解決你的問題?
//--------------------------------------------------------------------------- void __fastcall TForm1::ListView2CustomDrawItem(TCustomListView *Sender, TListItem *Item, TCustomDrawState State, bool &DefaultDraw) { if(ListView2->VisibleRowCount > ListView2->Items->Count) return; while(ListView2->TopItem->Index != ListView3->TopItem->Index) SendMessage(ListView3->Handle, WM_VSCROLL, (ListView2->TopItem->Index > ListView3->TopItem->Index)? SB_LINEDOWN:SB_LINEUP, 0); } //--------------------------------------------------------------------------- void __fastcall TForm1::ListView3CustomDrawItem(TCustomListView *Sender, TListItem *Item, TCustomDrawState State, bool &DefaultDraw) { if(ListView3->VisibleRowCount > ListView3->Items->Count) return; while(ListView2->TopItem->Index != ListView3->TopItem->Index) SendMessage(ListView2->Handle, WM_VSCROLL, (ListView3->TopItem->Index > ListView2->TopItem->Index)? SB_LINEDOWN:SB_LINEUP, 0); } //--------------------------------------------------------------------------- |
u8702656
一般會員 ![]() ![]() 發表:2 回覆:5 積分:1 註冊:2003-07-10 發送簡訊給我 |
|
m8815010
版主 ![]() ![]() ![]() ![]() ![]() 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 謝謝pwipwi前輩的幫忙 真的很抱歉先前沒有講清楚,誤導了大家 因為我要避開兩個ListView在OnCustomDrawItem時,互相SendMessage會造成畫面混亂的問題,必須再拖拉時只能由一方發訊息,所以我才用抓滑鼠位置的方式來作分辨,因此造成滑鼠未在ListView中會不work 所以我的問題應該是:如何再拖拉時正確分辨現在到底拖拉的是哪一個ListView 麻煩各位前輩再一次的指導 |
u8702656
一般會員 ![]() ![]() 發表:2 回覆:5 積分:1 註冊:2003-07-10 發送簡訊給我 |
|
m8815010
版主 ![]() ![]() ![]() ![]() ![]() 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 謝謝m8815010前輩提供的方法 |
u8702656
一般會員 ![]() ![]() 發表:2 回覆:5 積分:1 註冊:2003-07-10 發送簡訊給我 |
拍謝拍謝拖了這麼久才又上來.
對於這3種操作狀況
1.用左鍵點選scroll bar的長條,並一直壓者左鍵,同時拖拽長條,達成捲動
2.用滑鼠scroll bar的上、下箭頭
3.直接滾動滑鼠的滾輪 以一個例子來說明,比如說我有兩個ListView,分別為ListView1和ListView2,想做到ScrollBar同步;
則在原本的程式中,有這個問題,當我在操作狀況1時,拖拉ListView1的ScrollBar,在拖拉時只要我滑鼠的游標一超出ListView1元件的範圍,就會造成不同步;
而在操作狀況2時,因為滑鼠游標都會在LisView1中,所以不會有問題;
但在操作狀況3中,當Focus在ListView1時,滑鼠游標在ListView1時滾動滑鼠滾輪,一切正常,當滑鼠游標不在ListView1時,就無法做到同步了
以上這些其實也是因為程式中會去判斷滑鼠所在位置,如果不在其範圍內就不發送捲動訊息給另一個ListView的關係 而我會這樣寫的原因有三個
1.主要原因:ListView沒有提供OnScroll的Event,所以我將發送要求同步捲動的Message寫在CustomDrawItem的Event中
2.而CustomDrawItem這個Event是只要你有重繪ListView的動作都會觸發,因此必須加入判斷到底是捲動哪一個ListView的判斷,來避免重複發送Scroll訊息的狀況
3.要判斷現在的focus在哪一個ListView,本來以為只要用
ListView->Focused()來判斷,但是發現
"滑鼠點scroll bar,並不會讓ListView被set focus,只有點選ListView(非scroll bar)處,才可以讓它被focus"的這個問題
所以只好判斷滑鼠游標了;因此我只要找出:
如何在拖拉時正確分辨現在到底拖拉的是哪一個ListView就可以解決我的問題
|
m8815010
版主 ![]() ![]() ![]() ![]() ![]() 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 拍謝拍謝拖了這麼久才又上來. 對於這3種操作狀況 1.用左鍵點選scroll bar的長條,並一直壓者左鍵,同時拖拽長條,達成捲動 2.用滑鼠scroll bar的上、下箭頭 3.直接滾動滑鼠的滾輪 以一個例子來說明,比如說我有兩個ListView,分別為ListView1和ListView2,想做到ScrollBar同步; 則在原本的程式中,有這個問題,當我在操作狀況1時,拖拉ListView1的ScrollBar,在拖拉時只要我滑鼠的游標一超出ListView1元件的範圍,就會造成不同步; 而在操作狀況2時,因為滑鼠游標都會在LisView1中,所以不會有問題; 但在操作狀況3中,當Focus在ListView1時,滑鼠游標在ListView1時滾動滑鼠滾輪,一切正常,當滑鼠游標不在ListView1時,就無法做到同步了 以上這些其實也是因為程式中會去判斷滑鼠所在位置,如果不在其範圍內就不發送捲動訊息給另一個ListView的關係 而我會這樣寫的原因有三個 1.主要原因:ListView沒有提供OnScroll的Event,所以我將發送要求同步捲動的Message寫在CustomDrawItem的Event中 2.而CustomDrawItem這個Event是只要你有重繪ListView的動作都會觸發,因此必須加入判斷到底是捲動哪一個ListView的判斷,來避免重複發送Scroll訊息的狀況 3.要判斷現在的focus在哪一個ListView,本來以為只要用 ListView->Focused()來判斷,但是發現 "滑鼠點scroll bar,並不會讓ListView被set focus,只有點選ListView(非scroll bar)處,才可以讓它被focus"的這個問題 所以只好判斷滑鼠游標了;因此我只要找出: 如何在拖拉時正確分辨現在到底拖拉的是哪一個ListView就可以解決我的問題u8702656你好 |
u8702656
一般會員 ![]() ![]() 發表:2 回覆:5 積分:1 註冊:2003-07-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |