如何在同一程式中的某視窗保持在主視窗的下面 |
尚未結案
|
ivanxyz
一般會員 發表:7 回覆:10 積分:3 註冊:2004-03-03 發送簡訊給我 |
請教如何讓Form2保持在Form1的下面,有試過用BringWindowToTop()來做
如下
//Form1和Form2都是多邊型視窗
void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
BringWindowToTop(Form1->Handle);
} 雖然可以在mouse選到Form2時讓Form2保持在Form1下方可是會閃一下
不知道有沒有方法可以改善
P.S.如果不用FormStyle=fsStayOnTop
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 請教如何讓Form2保持在Form1的下面,有試過用BringWindowToTop()來做 如下 //Form1和Form2都是多邊型視窗 void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y) { BringWindowToTop(Form1->Handle); } 雖然可以在mouse選到Form2時讓Form2保持在Form1下方可是會閃一下 不知道有沒有方法可以改善 P.S.如果不用FormStyle=fsStayOnTopivanxyz你好: 其實我覺得<>用>這招還>會閃一下>"的問題,其實那應該是合理的,因為在滑鼠點到>>> 把視窗設下去! 所以目前而言,照整個流程看來,這類的做法,造成閃一下的效果應是合理的,這篇有一些些相關的討論: < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44828">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44828 而這篇的功用是把某視窗永遠設在最下層,如果你不介意把Form2永遠設為最下層的話,可試用這範例!當然這篇也會有"閃一下"的問題,不過我記得比BringWindowToTop(Form1->Handle)這招好很多, 也就是閃的不太明顯! 另外本篇的一個重點是研究要攔多少的訊息才夠,像你的例子只有在FormMouseDown事件中做對應當然是不夠的! 最後,我初想了一個不是這類的作法,即今天滑鼠先只要點下去,我們再做對應的話,這樣的做法都會歸類到上面的做法,也就是應該會閃一下! 所以唯有直接先把滑鼠 class="code"> ~~~ TForm1 *Form1; HHOOK HookID; LRESULT CALLBACK MouseProc(int iCode,WPARAM wParam,LPARAM lParam); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Form2=new TForm2(Application); Form2->Show(); Form1->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { HookID=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,0,GetCurrentThreadId()); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (HookID!=0) UnhookWindowsHookEx(HookID); } //--------------------------------------------------------------------------- LRESULT CALLBACK MouseProc(int iCode,WPARAM wParam,LPARAM lParam) { if (iCode<0) { return CallNextHookEx(HookID,iCode,wParam,lParam); } else if (wParam==WM_LBUTTONDOWN || wParam==WM_LBUTTONUP || wParam==WM_NCLBUTTONDOWN || wParam==WM_NCLBUTTONUP) { MOUSEHOOKSTRUCT* ms; ms=(MOUSEHOOKSTRUCT*)lParam; if (ms->hwnd==Form2->Handle) { return HC_SKIP; } } return CallNextHookEx(HookID,iCode,wParam,lParam); } 這個例子可以把click在Form2的所有滑鼠事件擋掉,也就是滑鼠永遠點不到Form2,所以當然Form2會永遠在最下層了! 當然這是個不太有用的例子,是不是有用要端看你的Form2是做什麼用以及Form2上有那些元件才能再做應用的! 以上是我之前的一些心得,不見得有用,但加減參考看看吧! |
ivanxyz
一般會員 發表:7 回覆:10 積分:3 註冊:2004-03-03 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: m8815010版主你好: 我想要的效果就是版主列的這討論,但其中的方法好像也還是會閃.. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44828 再請問如果我將Form2->FormStyle=fsStayOnTop Form2便會保持在自己AP的最上方,而不會擋到其它AP,有辦法使Form1也如此嗎?ivanxyz你好< >: 我再強調一下< >: 1. 只要是 "在Form2彈上來後,再硬把它設下去" 這類的做法都會閃(目前我的認知) 2. 那篇範例也是這類的做法,所以會閃< >! >! >!另外閃的嚴重與否好像會跟自端的>好像啦>)! > 另外~~ <>再請問如果我將>> 不太懂你在說什麼< >,設 |
ivanxyz
一般會員 發表:7 回覆:10 積分:3 註冊:2004-03-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |