ivanxyz
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表: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
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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=fsStayOnTop
ivanxyz你好 : 其實我覺得<>用>這招還>會閃一下>"的問題,其實那應該是合理的,因為在滑鼠點到>>> 把視窗設下去! 所以目前而言,照整個流程看來,這類的做法,造成閃一下的效果應是合理的,這篇有一些些相關的討論: < 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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:7 回覆:10 積分:3 註冊:2004-03-03
發送簡訊給我
|
m8815010版主你好: 我想要的效果就是版主列的這討論,但其中的方法好像也還是會閃..
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44828 再請問如果我將Form2->FormStyle=fsStayOnTop
Form2便會保持在自己AP的最上方,而不會擋到其它AP,有辦法使Form1也如此嗎?
|
m8815010
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:7 回覆:10 積分:3 註冊:2004-03-03
發送簡訊給我
|
m8815010版主你好:
可能是我沒說清楚..
我的意思是我有Form1(mainform)和Form2,
1.當只把Form2->FormStyle=fsStayOnTop
可以讓Form1蓋不著Form2,但其它視窗如IE...等,還是可以蓋著Form2
2.反之當只把Form1->FormStyle=fsStayOnTop
就真的是所有的視窗都蓋不著Form1,
為什麼會有這樣的差別?
有方法可以讓mainForm有第1點效果嗎..謝謝
|