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

MDI 子視窗Show( )一問

答題得分者是:jessechan
BGman
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-19 18:31:00 IP:211.22.xxx.xxx 未訂閱
我有一個 MDI 程式,當我的 MDIChilden 被拉到很遠,拉到連 MainForm 的 ScrollBar 都出現。 當我呼叫 MDIChilden->Show() Focus 是成功轉移到MDIChilden,畫面沒有跟著移過去我那遙遠的 MDIChilden 請問一下,我該如何解決比較恰當? 謝謝!
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-19 21:46:59 IP:61.59.xxx.xxx 未訂閱
Show() 之前,一併指定Top / Left    
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-20 02:39:06 IP:61.228.xxx.xxx 未訂閱
我想到兩種方法, 1. 如果你想要把遙遠的視窗拉回來的話請用, MDIChild->Position = poDefault; 保證不管捲軸在什麼位置, 視窗一定出現在可見的位置, 請去查一下 Help, 將不同的值設定給這個 property 將可得到不同的效果, 如顯示在視窗中央等... 2. 如果你想要讓程式自動拉捲軸到那個很遠的視窗請用, ScrollWindowEx(MDIForm->ClientHandle,MDIChild->Left * (-1),MDIChild->Top * (-1),NULL,NULL,NULL,NULL,SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE); 用這個函數要留意幾件事, 第一用完後要呼叫 UpdateWindow(MDIForm->Handle); 來重畫畫面, 第二重畫畫面的動作不會重設捲軸, 所以你還要宣告一個 SCROLLINFO si; 然後在重畫視窗之後, si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = Form1->ClientOrigin.x; SetScrollInfo(Form1->ClientHandle, SB_HORZ, &si, TRUE); si.nPos = Form1->ClientOrigin.y; SetScrollInfo(Form1->ClientHandle, SB_VERT, &si, TRUE); 如此才算大功告成, 我是懶人, 一定會毫不考慮的用第一種方法. Jesse Chan
------
Jesse Chan
BGman
初階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-20 15:25:37 IP:211.22.xxx.xxx 未訂閱
感謝兩位高手的解答,看來第二種方法比較符合程式需求!但小弟還有疑問...
ScrollWindowEx( Form1->ClientHandle,
                Form3->Left * (-1),
                Form3->Top * (-1),
                NULL,
                NULL,
                NULL,
                NULL,
                SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
如果我有一個Form1 是 MDIForm 而Form2、Form3 是 MDIChild 請問一下 問題一 Form1->ClientHandle 與 Form3->Handle 有什麼不一樣? 為何用Form3->Handle 達不到我要的效果? 問題二 我查了 Help ClientHandle 是指向Clildren 的指標,可是本例來說 我有兩個Clildren 請問,是只到哪一個? 問題三 如果當焦點移至 Form3 ,我想要移到 Form1 的中間位置,而非左上角 我做了以下調整,可是卻沒有作用!可以告訴我哪裡錯了嗎?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ScrollWindowEx( Form1->ClientHandle,
                  Form3->Left * (-1),
                  Form3->Top * (-1),
                  NULL,
                  NULL,
                  NULL,
                  NULL,
                  SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
  Form3->Show();
  UpdateWindow(Form1->Handle);      SCROLLINFO si;      si.cbSize = sizeof(si);
  si.fMask = SIF_POS;
  si.nPos = Form1->ClientOrigin.x   (Form1->Width - Form3->Width)/2;
  SetScrollInfo(Form1->ClientHandle, SB_HORZ, &si, TRUE);
  si.nPos = Form1->ClientOrigin.y   (Form1->Height - Form3->Height)/2;
  SetScrollInfo(Form1->ClientHandle, SB_VERT, &si, TRUE);
}
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-20 16:22:12 IP:203.75.xxx.xxx 未訂閱
第 1,2 個問題是你的觀念錯誤, ClientHandle 是 MDIForm 的 client window handle 而不是 child window handle, 請注意其中差別. 第 3 個問題我沒實際去測, 但是至少我看到一個錯誤, 在 scrolling window 時, 你的 dx, dy 沒有除以 1/2 所以一定不會在中間. Jesse Chan
------
Jesse Chan
BGman
初階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-20 17:00:44 IP:211.22.xxx.xxx 未訂閱
設定MDIChild 的位置是在 ScrollWindowEx( ) 函式 是我搞錯,以為是 SetScrollInfo( ) 函式 現在全部都搞定了! 感謝jessechan兄耐心的解答!
系統時間:2024-04-28 2:59:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!