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

請問一下 Application->Handle 的意義是?

尚未結案
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-31 16:55:58 IP:211.76.xxx.xxx 未訂閱
請問一下 Application->Handle 的意義是? 又與 Form->Handle 、 HINSTANCE 這兩者有何差異?
jessechan
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-31 17:43:08 IP:203.75.xxx.xxx 未訂閱
我就我所知道的回答, 還請大家指教. application 及 form 的 handle 及 HINSTANCE 都是指物件的代碼 (ID), 就好像每個人都有一個身份証字號, 在理想狀況下, 某兩個人可能有相同的名字, 但是不會有重複的身份証字號, 所以用身份証字號來認定一個人會比用名字準確, 在 window 或其它作業系統中也有一大堆的物件, 就好像一個國家有很多人一樣, 如何去界定那個物件, 用的就是 handle, 至於 HINSTANCE, 則是特別指程式執行個體的物件代碼. Jesse Chan
------
Jesse Chan
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-31 18:43:22 IP:211.76.xxx.xxx 未訂閱
您說的我當然了解但.. 有些API(例如ShowWindow) 使用 Form1->Handle 與 Application->Handle 會獲得不同的反應,但有些API(例如SetForegroundWindow)使用兩者任何一 個反應都相同~ 這是為啥?
jessechan
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-31 22:24:35 IP:61.228.xxx.xxx 未訂閱
我相信會有你說的狀況, 但這是不同的兩個 handle, 可否請你舉例, 我再針對你的例子說明. Jesse Chan
------
Jesse Chan
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-31 22:58:55 IP:211.76.xxx.xxx 未訂閱
例如: 例子1 void __fastcall TForm1::Timer1Timer(TObject *Sender) { ShowWindow(Application->Handle,SW_RESTORE); //會還原視窗 // ShowWindow(Handle,SW_RESTORE); //不會還原視窗 } 例子2 void __fastcall TForm1::Timer1Timer(TObject *Sender) { SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,SPIF_SENDCHANGE); SetForegroundWindow(Handle); //用Handle或Application->Handle皆可 }
jessechan
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-01 01:44:13 IP:61.228.xxx.xxx 未訂閱
你的第一個問題, 我把它改寫了一下 void __fastcall TForm1::Button1Click(TObject *Sender) { ShowWindow(Handle,SW_MAXIMIZE); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { ShowWindow(Application->Handle,SW_MAXIMIZE); } //--------------------------------------------------------------------------- 可以發現只有 Button1 click 的時候, Form1 才真正最大化, 按下 Button2, 可以看到一個 "空的" window frame 被最大化, 可見兩者是不同的, 至於第二個例子, 我覺得結果也不相同, 因為你反向用 GetForegroundWindow 可知道傳回的是不同的 handle, 所以我不知道你所說的兩個 handle 皆可要如何解釋, 基本上 TApplication 封裝了一個 window application 中有關 訊息處理, 例外處理, 選單處理, on-line help 處理, 並管理如 WinMain, window class 等基本功能, 所以你可以把 TApplication 看成是一個 Application wide 的物件, 而 Form 則是某個特定視窗的物件, 而一個 Application 可以同時擁有多個 Form, 所以我認為 TApplication 的 handle 是代表一特定 process 的 ID, 而 Form 的 handle 則是針對某個視窗物件的 ID. 至於在第一個例子中為何會出現一個類似視窗的 frame 被最大化, 因為對於 TApplication 是如何被封裝的細節無法得知, 所以我無法回答, 不知有沒有高手針對這部份作回答. Jesse Chan
------
Jesse Chan
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-01 02:40:49 IP:211.76.xxx.xxx 未訂閱
恩~~ 假設我有個視窗Form1執行後立刻將它最小化之後~ 然後過一段時間後接受到一個 訊息(例如WM_TIMER)後,就要將Form1從最小化 變化成 最大化 (1)若是這樣寫變成"空"的視窗最大化(錯誤) void __fastcall TForm1::Timer1Timer(TObject *Sender) { ShowWindow(Application->Handle,SW_MAXIMIZE); } (2)這樣寫的話 Form1雖然被最大化但反應很怪(Form1不會跑到前景來且視窗右上角 最小化按鈕也變無效) void __fastcall TForm1::Timer1Timer(TObject *Sender) { ShowWindow(Handle,SW_MAXIMIZE); } (3)換成這樣,跟情況(2)一模一樣 void __fastcall TForm1::Timer1Timer(TObject *Sender) { SendMessage(Handle,WM_SYSCOMMAND,SC_MAXIMIZE,0); } (4)還是跟情況(2)一模一樣,這就怪了我還以為會跟情況(1)一樣 void __fastcall TForm1::Timer1Timer(TObject *Sender) { SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MAXIMIZE,0); } 怎麼寫都很怪~@@"~ 把我搞糊塗了~
jessechan
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-01 09:47:38 IP:203.75.xxx.xxx 未訂閱
很奇怪, 我用你說的測試方式作了一次, 結果和你不同, (1) 的部份你得到的結果和我所說一樣, 可見你在之前的測試可能有問題, (2) 的部份請注意 ShowWindow 只是改變 window state 而已, 從來就不會把視窗變成前景, 而且我直接 copy 你的 code 來測試, 也不會有所謂最小化按鈕無效的現象; 所以我的 (3) 是如同 (2) 和預期結果一樣, (4) 也如預料只有一個空的 window frame 被最大化, 一切都合於我之前的解釋, 請再檢查一下你的測試. 有問題的話只好整個傳上來.    Jesse Chan
------
Jesse Chan
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-01 16:01:12 IP:211.76.xxx.xxx 未訂閱
情況(4)我測試的確是一個空的 window frame 被最大化,可能是我之前的 測試有疏失ㄅ~~ 最奇怪的是最小化按鈕只能最小化一次 第二次就無效了,寫了個例子 一開始視窗就最小化 過2秒後收到WM_TIMER則還原RESTORE 然後我用滑鼠去點視窗右上角的最小化(點很多次)~卻無效~ 最大化 與 關閉鈕皆有效 就是最小化鈕無效 __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { SendMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); } void __fastcall TForm1::Timer1Timer(TObject *Sender) { ShowWindow(Handle,SW_RESTORE); }
jessechan
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-01 17:52:28 IP:203.75.xxx.xxx 未訂閱
你的測試結果是正確的, 因為 window 上 minimize 和 maximize 的行為是不一樣的, 當你按下最小化按鈕, 是要整個 application 都最小化, 你可以試著做一個包含兩個 form 的 AP, 按下 Main Form 的最小化按鈕, 結果兩個 form 都變小, 所以你的最小化按鈕會失效, 因為你只對 form1 send restore 的命令, 對 AP 來說, 它還是在最小化的狀態, 要問為什麼這樣設計, 其實沒有一定的對或錯, 只能說當初就是這樣設計的. 要解決最小化按鈕失效的問題, 只要改成 ShowWindow(Application->Handle,SW_RESTORE); 就可以.    Jesse Chan
------
Jesse Chan
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-01 21:20:30 IP:211.76.xxx.xxx 未訂閱
恩~~ 終於了解了 感謝jessechan 版主~^^~
系統時間:2024-05-03 3:28:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!