全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5998
推到 Plurk!
推到 Facebook!

子視窗如何置於最上層顯示

答題得分者是:RaynorPao
turbo
一般會員


發表:2
回覆:1
積分:0
註冊:2003-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-12 20:33:06 IP:218.175.xxx.xxx 訂閱
請教各位高手
我有兩個form,分別為form1與form2
form1是主視窗,form2是由form1按下一個button後,動態產生
我想讓使用者自行選擇是否要讓form2設為最上層顯示(Always on top)
該如何做?
試過用 formStyle=fsStayOnTop,但有資料顯示,此屬性應於設計時使用
不適合執行時使用
也試過 SetWindowPos ,但似乎只適用主視窗,也就是form1,不適用form2
也試過用TImer ,然後定時呼叫SetWindowPos,是可以做到,但顯得笨拙
是否有可方便的方法可以完成?
RaynorPao
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-12 21:58:46 IP:61.60.xxx.xxx 訂閱
(1)在 BCB 開發環境中,按「Project/Options/Forms」,確定「Form1」是「Main form」,「Form1」在「Auto create forms」欄位,「Form2」在「Available forms」欄位
(2)有關「Form1」的程式碼如下

[code cpp]
#include "Unit2.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *f2=new TForm2(Application);
f2->FormStyle=fsStayOnTop;
f2->Show();
}
[/code]

(3)如果你想限制使用者在 Form2 裡面的操作行為未完成之前,不可以對 Form1 操作的話,可以把上面的程式碼改成以下這個樣子

[code cpp]
#include "Unit2.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *f2=new TForm2(Application);
f2->ShowModal();
delete f2;
}
[/code]
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
turbo
一般會員


發表:2
回覆:1
積分:0
註冊:2003-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-13 09:59:35 IP:218.175.xxx.xxx 訂閱
感謝RaynorPao版主的回覆,關於(1)小弟一開始就已如是設定。
關於(2),小弟一開始就已經試過行不通,不過我試的是
TForm2 *f2=new TForm2(Form1);
也試過將Owner 改為null,都不行。
看到版主將Owner設為Application時,以為可以了,可惜試過之後,還是不行。
關於(3),因為不是如此設計,故不用。

也許我應該將我的應用說的更清楚,我在Form1裡加了TrayIcon1, 希望他能一開始就縮在右下角的時間那裡。而不要在工作列上佔一個位置。但我的form2要能顯示出來,也能夠讓使用者隨時自行設定是否要最上層顯示。
project 1的程式碼節錄
[code cpp]
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->ShowMainForm=false; //不要顯示form1
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
[/code]
Form1的程式碼節錄
[code cpp]
TForm2 *Form2;
void __fastcall TForm1::FormCreate(TObject *Sender) //建立form2並顯示
{
Form2=new TForm2(Application);
Form2->FormStyle=fsStayOnTop;
Form2->Show();
}

void __fastcall TForm1::TrayIcon1Restore(TObject *Sender) //右下角小圖示快按兩下時顯示form1
{
Form1->Show();
TrayIcon1->Visible=false;
}
[/code]
TrayIcon1 一開始的屬性設定為 Visible=true, Hide=true, RestoreOn=imDoubleClick
Form2的程式碼節錄
[code cpp]
void __fastcall TForm2::OnTopClick(TObject *Sender) //PopUp menu的一個選項,用來設定是否要在最上層顯示
{
OnTop->Checked=!OnTop->Checked;
if (OnTop->Checked)
SetWindowPos(this->Handle,HWND_TOPMOST,-1,-1,-1,-1,SWP_NOMOVE | SWP_NOSIZE);
// this->FormStyle=fsStayOnTop; //上一下跟這行這兩種方法都不行
else
SetWindowPos(this->Handle,HWND_NOTOPMOST,-1,-1,-1,-1,SWP_NOMOVE | SWP_NOSIZE);
// this->FormStyle=fsNormal;
}
[/code]
系統時間:2024-04-19 16:29:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!