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

雙螢幕下,第二個Form的開啟位置與Form上Panel元件位置問題

答題得分者是:slowbird
vega_chun
一般會員


發表:5
回覆:7
積分:2
註冊:2006-12-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-22 16:22:10 IP:218.168.xxx.xxx 訂閱
各位大大你們好:
小弟目前遇到兩個問題
目前同一台PC上街著兩個螢幕(解析度皆為1280*1024)
目前小弟的程式有兩個Form(主Form與副Form)
當程式開啟時,主Form與副Form是同時開啟的
而副Form上有一個Panel元件是用來顯示CCD所擷取的即時畫面
副Form的預設BorderStyle為bsSingle
目前的問題是:
第一:
我將副Form的Left與Top設為1281與1
理論上他一開啟應該出現在第二個螢幕的左上角
但是實際執行確是出現在第一個螢幕的左上角
請問該如何解決?
第二:
我在主Form上設定一個CheckBox
當CheckBox->Checkde = true時~副Form的BorderStyle為bsSingle
當CheckBox->Checkde = false時~副Form的BorderStyle為bsNone
且也特地將副Form的Left與Top設為1281與1(Panel也是如此設定)
但是,程式執行結果卻是
當我改變CheckBox的Check屬性時
只有副Form的位置是在(1281,1)
顯示影像的Panel元件的位置卻始終在(1,1)
這樣奇怪的結果~請問有人可以幫忙解惑嗎?
謝謝
slowbird
一般會員


發表:4
回覆:6
積分:12
註冊:2008-03-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-22 21:05:11 IP:218.163.xxx.xxx 訂閱
關於雙螢幕呢    我之前的作法是 把兩個當作一個來用
所以 就用 Screen 的 Width 來放兩個 Form

LeftForm->Left = 0;
LeftForm->Top = 0;
LeftForm->Width = Screen->Width/2;
LeftForm->Height = Screen->Height;
LeftForm->Show();
RightForm->Left = Screen->Width/2;
RightForm->Top = 0;
RightForm->Width = Screen->Width/2;
RightForm->Height = Screen->Height;
RightForm->Show();

然後一切就如單螢幕的操作一樣


===================引 用 vega_chun 文 章===================
各位大大你們好:
小弟目前遇到兩個問題
目前同一台PC上街著兩個螢幕(解析度皆為1280*1024)
目前小弟的程式有兩個Form(主Form與副Form)
當程式開啟時,主Form與副Form是同時開啟的
而副Form上有一個Panel元件是用來顯示CCD所擷取的即時畫面
副Form的預設BorderStyle為bsSingle
目前的問題是:
第一:
我將副Form的Left與Top設為1281與1
理論上他一開啟應該出現在第二個螢幕的左上角
但是實際執行確是出現在第一個螢幕的左上角
請問該如何解決?
第二:
我在主Form上設定一個CheckBox
當CheckBox->Checkde = true時~副Form的BorderStyle為bsSingle
當CheckBox->Checkde = false時~副Form的BorderStyle為bsNone
且也特地將副Form的Left與Top設為1281與1(Panel也是如此設定)
但是,程式執行結果卻是
當我改變CheckBox的Check屬性時
只有副Form的位置是在(1281,1)
顯示影像的Panel元件的位置卻始終在(1,1)
這樣奇怪的結果~請問有人可以幫忙解惑嗎?
謝謝
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-22 21:39:08 IP:58.216.xxx.xxx 訂閱
实际上,你可以使用Windows内建的API检索Desktop或者Screen,这样来控制似乎比较彻底,就是有N多屏都没有关系。
------
====================
我为一切作努力!
Justin Shen

vega_chun
一般會員


發表:5
回覆:7
積分:2
註冊:2006-12-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-23 10:37:30 IP:218.168.xxx.xxx 訂閱
 你好:
我試過你說的方法
RightForm->Left = Screen->Width/2;
RightForm->Top = 0;
RightForm->Width = Screen->Width/2;
RightForm->Height = Screen->Height;

執行結果是
副Form的左上方位置在第一個螢幕的中間正上方(所以Screen->Width/2的值應為640)
而副Form上的Panel元件依然出現在第一個螢幕的左上方

===================引 用 slowbird 文 章===================
關於雙螢幕呢 我之前的作法是 把兩個當作一個來用
所以 就用 Screen 的 Width 來放兩個 Form

LeftForm->Left = 0;
LeftForm->Top = 0;
LeftForm->Width = Screen->Width/2;
LeftForm->Height = Screen->Height;
LeftForm->Show();
RightForm->Left = Screen->Width/2;
RightForm->Top = 0;
RightForm->Width = Screen->Width/2;
RightForm->Height = Screen->Height;
RightForm->Show();

然後一切就如單螢幕的操作一樣


編輯記錄
vega_chun 重新編輯於 2008-04-23 10:41:41, 註解 無‧
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-23 14:24:28 IP:61.219.xxx.xxx 未訂閱

[code cpp]
if(Screen->MonitorCount==1) //若單螢幕
{
Form1->Screen->Monitors[0]->Top; //Form1取得第一個螢幕的Top位置
Form1->Screen->Monitors[0]->Left; //Form1取得第一個螢幕的Left位置
Form1->Screen->Monitors[0]->Width; //Form1取得第一個螢幕的Width
Form1->Screen->Monitors[0]->Height; //Form1取得第一個螢幕的Height
//do anything you want
}
else if(Screen->MonitorCount==2) //若雙螢幕
{
Form1->Screen->Monitors[0]->Top; //Form1取得第一個螢幕的Top位置
Form1->Screen->Monitors[0]->Left; //Form1取得第一個螢幕的Left位置
Form1->Screen->Monitors[0]->Width; //Form1取得第一個螢幕的Width
Form1->Screen->Monitors[0]->Height; //Form1取得第一個螢幕的Height

Form2->Screen->Monitors[1]->Top; //Form2取得第二個螢幕的Top位置
Form2->Screen->Monitors[1]->Left; //Form2取得第二個螢幕的Left位置
Form2->Screen->Monitors[1]->Width; //Form2取得第二個螢幕的Width
Form2->Screen->Monitors[1]->Height; //Form2取得第二個螢幕的Height

//do anything you want
}

[/code]

若是三個螢幕,四個螢幕以此類推
vega_chun
一般會員


發表:5
回覆:7
積分:2
註冊:2006-12-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-04-24 15:15:56 IP:218.168.xxx.xxx 訂閱
你可以這樣做?
Form1->Screen

因為我這樣用,發現Screen並不是TForm的成員
===================引 用 daldal 文 章===================

[code cpp]
if(Screen->MonitorCount==1) //若單螢幕
{
Form1->Screen->Monitors[0]->Top; //Form1取得第一個螢幕的Top位置
Form1->Screen->Monitors[0]->Left; //Form1取得第一個螢幕的Left位置
Form1->Screen->Monitors[0]->Width; //Form1取得第一個螢幕的Width
Form1->Screen->Monitors[0]->Height; //Form1取得第一個螢幕的Height
//do anything you want
}
else if(Screen->MonitorCount==2) //若雙螢幕
{
Form1->Screen->Monitors[0]->Top; //Form1取得第一個螢幕的Top位置
Form1->Screen->Monitors[0]->Left; //Form1取得第一個螢幕的Left位置
Form1->Screen->Monitors[0]->Width; //Form1取得第一個螢幕的Width
Form1->Screen->Monitors[0]->Height; //Form1取得第一個螢幕的Height

Form2->Screen->Monitors[1]->Top; //Form2取得第二個螢幕的Top位置
Form2->Screen->Monitors[1]->Left; //Form2取得第二個螢幕的Left位置
Form2->Screen->Monitors[1]->Width; //Form2取得第二個螢幕的Width
Form2->Screen->Monitors[1]->Height; //Form2取得第二個螢幕的Height

//do anything you want
}

[/code]

若是三個螢幕,四個螢幕以此類推
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-04-25 09:22:16 IP:220.130.xxx.xxx 未訂閱
Screen是全域的成員,直接使用即可,
前面的程式碼是我手誤打錯的,原本是想打Form1->Top = Screen->Monitors[0]->Top...@@

[code cpp]
if(Screen->MonitorCount==1) //若單螢幕
{
Form1->Top = Screen->Monitors[0]->Top; //Form1取得第一個螢幕的Top位置
Form1->Left = Screen->Monitors[0]->Left; //Form1取得第一個螢幕的Left位置
Form1->Width = Screen->Monitors[0]->Width; //Form1取得第一個螢幕的Width
Form1->Height = Screen->Monitors[0]->Height; //Form1取得第一個螢幕的Height
//do anything you want
}
else if(Screen->MonitorCount==2) //若雙螢幕
{
Form1->Top = Screen->Monitors[0]->Top; //Form1取得第一個螢幕的Top位置
Form1->Left = Screen->Monitors[0]->Left; //Form1取得第一個螢幕的Left位置
Form1->Width = Screen->Monitors[0]->Width; //Form1取得第一個螢幕的Width
Form1->Height = Screen->Monitors[0]->Height; //Form1取得第一個螢幕的Height

Form2->Top = Screen->Monitors[1]->Top; //Form2取得第二個螢幕的Top位置
Form2->Left = Screen->Monitors[1]->Left; //Form2取得第二個螢幕的Left位置
Form2->Width = Screen->Monitors[1]->Width; //Form2取得第二個螢幕的Width
Form2->Height = Screen->Monitors[1]->Height; //Form2取得第二個螢幕的Height
//do anything you want
}
[/code]
編輯記錄
daldal 重新編輯於 2008-04-25 09:24:50, 註解 無‧
daldal 重新編輯於 2008-04-25 09:30:57, 註解 加上新Code‧
slowbird
一般會員


發表:4
回覆:6
積分:12
註冊:2008-03-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-04-27 19:35:30 IP:218.163.xxx.xxx 訂閱
喔   

我是利用 顯卡的驅動程式把螢幕設為 一個為主 另一個為延伸
這樣就可把兩個當成一個
兩個解析度必須要一樣


===================引 用 vega_chun 文 章===================
你好:
我試過你說的方法
RightForm->Left = Screen->Width/2;
RightForm->Top = 0;
RightForm->Width = Screen->Width/2;
RightForm->Height = Screen->Height;

執行結果是
副Form的左上方位置在第一個螢幕的中間正上方(所以Screen->Width/2的值應為640)
而副Form上的Panel元件依然出現在第一個螢幕的左上方

===================引 用 slowbird 文 章===================
關於雙螢幕呢 我之前的作法是 把兩個當作一個來用
所以 就用 Screen 的 Width 來放兩個 Form

LeftForm->Left = 0;
LeftForm->Top = 0;
LeftForm->Width = Screen->Width/2;
LeftForm->Height = Screen->Height;
LeftForm->Show();
RightForm->Left = Screen->Width/2;
RightForm->Top = 0;
RightForm->Width = Screen->Width/2;
RightForm->Height = Screen->Height;
RightForm->Show();

然後一切就如單螢幕的操作一樣


vega_chun
一般會員


發表:5
回覆:7
積分:2
註冊:2006-12-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-04-29 12:10:18 IP:218.168.xxx.xxx 訂閱
不好意思~這幾天都在忙其他案子~
所以沒時間回應
可能我一開始的問題沒說的很清楚
目前我也是利用顯卡將第二個螢幕當成第一個螢幕的延伸
也利用了各位提供如下的建議
  1. Form1->Top = Screen->Monitors[0]->Top;
  2. Form1->Left = Screen->Monitors[0]->Left;
  3. Form1->Width = Screen->Monitors[0]->Width;
  4. Form1->Height = Screen->Monitors[0]->Height;
不過執行結果如下:
上圖是一開始執行時的畫面,
右方是副Form,上頭的Panel元件負責顯示CCD畫面
然後我按個按鈕,將副Form的BoderStyle改變成bsNone時
就變成下圖的樣子,副Form的位置變成我想要的
但是副Form上的Panel元件的位置則變成主螢幕的左上角去了
而不在副Form上面,理論上Form上的任意元件應該都是跟著Form跑才對吧
怎會變成這樣???真的搞不懂

vega_chun
一般會員


發表:5
回覆:7
積分:2
註冊:2006-12-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-05-05 11:48:20 IP:218.168.xxx.xxx 訂閱
知道問題所在了
跟影像擷取卡的設定有關
之前在另一個機台上使用~並無這樣的問題出現
這兩個機台差別只在使用不同廠牌的影像擷取卡
所以應該是影像擷取的設定問題
感謝各位的幫忙~其實大家給的答案都差不多
所以我把最佳解答給予第一個回答的網友好了
謝謝各位
系統時間:2024-05-05 15:34:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!