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

兩個 ScrollBar 同步問題

尚未結案
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-25 10:08:48 IP:211.22.xxx.xxx 未訂閱
小弟有一個需求,我的MainForm 有一個 ScrollBar1 是用來處理TMemo 的 ScrollBar 同步捲動,我已經在ScrollBar1_OnScroll 事件中成功的實做它, 可是目前只能單向同步,還未達到雙向同步。 也就是說在MainForm 移動ScrollBar 可以成功控制TMemo 的 ScrollBar 捲動, 可是當我觸發TMemo 的 ScrollBar 捲動,無法令MainForm 的 ScrollBar捲動 請問該如何辦到雙向同步的機制? 小弟有想過,ScrollWindow( ) 這個API ,可是在 Memo 找不到事件可以切入 也想過攔截訊息,可是不知道在 MSDN 以及 BCB5 各要打什麼關鍵字, 曾試著在BCB 搜尋 VCL_MESSAGE_HANDLER macro 但是只有5 筆 WM_XXX 煩請各位高手,指點迷津!小弟感激不盡!
okiss
一般會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-25 16:22:38 IP:140.127.xxx.xxx 未訂閱
//--------------------------------- 程式部分略過, 太佔篇幅 下面有更完整的 //--------------------------------- 這是從我程式中取出來的... 如果真的看不懂...告訴我.. 直接寄給你... 我寫的好了...^^ 發表人 - okiss 於 2003/03/27 09:15:04
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-26 11:00:03 IP:211.22.xxx.xxx 未訂閱
Hi okiss 兄,大致上看了一下你的做法,覺得你對 Window 機制很了解, 因為程式跑到這一行 PaintMemoOldWinProc( message )時,不認識這個函式 另外我是用 use unit ,不知道該如何與Form 結合, 所以可以麻煩你把程式寄給我嗎? 我的 E-mail 是 scott@copystar.com.tw 另外想請教你 不管 Memo 或是其他含有 ScrollBar 的元件, 都是當它的資料超過Memo 的範圍才開始出現。 在我還沒有看過你的程式碼以前, 我原先以為可以利用像RTTI 之類的技術,得到Memo 的 ScrollBar 指標 再判斷 if ( Memo->pScrollBar ) Memo->pScrollBar->Pos = Form1->ScrollBar1->Pos 所以為了達到兩個 ScrollBar 同步,是不是都要先繼承 VCL 元件, 然後再改寫 TWndMethod 機制才辦的到呢?
okiss
一般會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-26 11:30:14 IP:140.127.xxx.xxx 未訂閱
引言: Hi okiss 兄,大致上看了一下你的做法,覺得你對 Window 機制很了解, 因為程式跑到這一行 PaintMemoOldWinProc( message )時,不認識這個函式 喔喔...這是沒改到.. 應該是MyMemoOldWinProc 另外我是用 use unit ,不知道該如何與Form 結合, 所以可以麻煩你把程式寄給我嗎? 我的 E-mail 是 scott@copystar.com.tw 另外想請教你 不管 Memo 或是其他含有 ScrollBar 的元件, 都是當它的資料超過Memo 的範圍才開始出現。 在我還沒有看過你的程式碼以前, 我原先以為可以利用像RTTI 之類的技術,得到Memo 的 ScrollBar 指標 再判斷 if ( Memo->pScrollBar ) Memo->pScrollBar->Pos = Form1->ScrollBar1->Pos 所以為了達到兩個 ScrollBar 同步,是不是都要先繼承 VCL 元件, 然後再改寫 TWndMethod 機制才辦的到呢?
不好意思...我對window也不了解..@@ 因為我怎樣也抓不到TMemo的*ScrollBar 所以,才用win32 API的作法的..^^ 而且我覺的我的程式中好像作了很多廢事..@@ 我已經寄了..^^ 多多指教...^^
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-26 13:48:00 IP:203.73.xxx.xxx 未訂閱
引言: 不管 Memo 或是其他含有 ScrollBar 的元件, 都是當它的資料超過Memo 的範圍才開始出現。 在我還沒有看過你的程式碼以前, 我原先以為可以利用像RTTI 之類的技術,得到Memo 的 ScrollBar 指標 再判斷 if ( Memo->pScrollBar ) Memo->pScrollBar->Pos = Form1->ScrollBar1->Pos 所以為了達到兩個 ScrollBar 同步,是不是都要先繼承 VCL 元件, 然後再改寫 TWndMethod 機制才辦的到呢?
BGman 你好: 在 Win32 API 中,有很多現成的 function 可以使用的,可以得到你想要的資 訊和結果 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/scrollbars/scrollbars.asp -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-26 14:09:31 IP:211.22.xxx.xxx 未訂閱
元件有: TPaintMemoBox : public TScrollBox {   TPaintPanel *PaintPanel; } TPaintPanel : public Tpanel {   TPaintBox *PaintBox;//左邊   TPaintMemo *PaintMemo;//右邊的memo } class TPaintMemo : public Tmemo {   TPaintBox  *PaintBox; } 目的: 做出一個可設斷點的memo元件.... ------------------------------------------------------------- 參考一下吧...^^ okiss 兄,拜讀了你的程式碼,我還是無法把你的程式碼和我個需求套在一起 方便幫我寫一個,一個含有Scrollbar 及 Memo 的 Form ,然後示範一下 如何達到雙向同步機制嗎?
okiss
一般會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-26 15:07:07 IP:140.127.xxx.xxx 未訂閱
我寄了..^^ 有一些小偏差..你調整一下吧...^^
okiss
一般會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-26 15:36:00 IP:140.127.xxx.xxx 未訂閱
把寄給你的程式作一些修正 //-------------------------------------------------------------------void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { int wParam = ScrollPos << 16; wParam = wParam (int)LOWORD(ScrollCode); SendMessage(Memo1->Handle, WM_VSCROLL, wParam,NULL); } //-------------------------------------------------------------------void __fastcall TForm1::ScrollBar2Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { int wParam = ScrollPos << 16; wParam = wParam (int)LOWORD(ScrollCode); SendMessage(Memo1->Handle, WM_HSCROLL, wParam,NULL); } 嗯..這樣應該大致完成了你要的東東了..^^
BGman
初階會員


發表:28
回覆:85
積分:42
註冊:2003-01-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-26 18:32:59 IP:211.22.xxx.xxx 未訂閱
帥喔! 搞定了!
okiss
一般會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-27 09:03:30 IP:140.127.xxx.xxx 未訂閱
板上仍無完整的範例程式.... 所以, po 一下, 大家參考一下吧....^^.. ***************************************************************** ************************** Unit1.h ****************************** *****************************************************************    //----------------------------------------------------------------- #ifndef Unit1H #define Unit1H //----------------------------------------------------------------- #include  #include #include #include <Forms.hpp> //----------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TMemo *Memo1; TScrollBar *ScrollBar1; //垂直的 TScrollBar *ScrollBar2; //水平的 void __fastcall ScrollBar1Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos); void __fastcall ScrollBar2Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); TWndMethod MemoOldWinProc; void __fastcall NewMemoWindowProc(TMessage & Message); }; //----------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //----------------------------------------------------------------- #endif ***************************************************************** ************************* Unit1.cpp ***************************** ***************************************************************** //---------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //------------------------------------------------------------------ #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //------------------------------------------------------------------ __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { MemoOldWinProc = Memo1->WindowProc; Memo1->WindowProc=NewMemoWindowProc; } //------------------------------------------------------------------ void __fastcall TForm1::NewMemoWindowProc(TMessage & Message) { MemoOldWinProc(Message); int max,min; switch (Message.Msg) { case WM_PAINT: //以下不能分到WM_VSCROLL 及 WM_HSCROLL中, 會有問題 ScrollBar1->Position = GetScrollPos(Memo1->Handle, SB_VERT); GetScrollRange(Memo1->Handle, SB_VERT, &min, &max); ScrollBar1->Min = min; ScrollBar1->Max = max; ScrollBar2->Position = GetScrollPos(Memo1->Handle, SB_HORZ); GetScrollRange(Memo1->Handle, SB_HORZ, &min, &max); ScrollBar2->Min = min; ScrollBar2->Max = max; break; } } //----------------------------------------------------------------- void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { int wParam = ScrollPos << 16; wParam = wParam (int)LOWORD(ScrollCode); SendMessage(Memo1->Handle, WM_VSCROLL, wParam,NULL); } //------------------------------------------------------------------- void __fastcall TForm1::ScrollBar2Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { int wParam = ScrollPos << 16; wParam = wParam (int)LOWORD(ScrollCode); SendMessage(Memo1->Handle, WM_HSCROLL, wParam,NULL); } //------------------------------------------------------------------
系統時間:2024-11-23 7:14:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!