C#撰寫的winform程式,
在臺式機上可以正常顯示,沒有問題,界面如下:

但是在筆記本上就顯示不全,見下圖:

現在筆記本上顯示用的滾動條,但是很不方便,想問有沒有方法設定界面在不同尺寸的螢屏上自動按比例縮小或放大?謝謝。
uj5u.com熱心網友回復:
->1.用布局控制元件進行布局:TableLayoutPanel:把區域劃分成行和列,設定Anchor為Top|Bottom|Left|Right后,會隨著視窗的大小自動調整單元格大小。
FlowLayoutPanel:按照從左到右、從上到下的順序排列子控制元件,設定Anchor后,會隨著視窗大小變化重新布局。
->2.用控制元件的Anchor屬性確定控制元件的定位方式,使控制元件可以與視窗某邊界的位置固定或自動調整大小
->3.控制元件的Dock屬性可以讓子控制元件緊貼視窗邊界或充滿視窗。
設定界面在不同尺寸的螢屏上自動按比例縮小或放大
-》換成WPF去布局界面,ViewBox控制元件完全足矣。
uj5u.com熱心網友回復:
版主說的是慢的做法
還有個快的:
將本界面所有元素遍歷,將他們的寬高上左四個屬性 乘以 當前解析度/設計解析度 的結果即可,記得中間比值的結果要用double否則就看不見了。
uj5u.com熱心網友回復:
private void setfrom(Control.ControlCollection IControls)
{
foreach (Control item in IControls)
{
item.Top = (int)(item.Top * 0.8);
item.Left = (int)(item.Left * 0.8);
item.Width = (int)(item.Width * 0.8);
item.Height = (int)(item.Height * 0.8);
if (item.HasChildren)
{
setfrom(item.Controls);
}
}
}
這是個縮小到80%的方法,你自己寫引數做成縮小指定倍數的即可。
uj5u.com熱心網友回復:
你好,你這種方法是不是以每個控制元件的中心來縮放?
能不能設定將控制元件的左上角固定來縮放?
uj5u.com熱心網友回復:
能也不能。
你自己根據控制元件邏輯位置和間隔來制作left就可以左上角實作了。
但是我覺得你來問肯定就是不知道怎么制造這些控制元件的邏輯位置,
那就簡單點說吧:
控制元件1|控制元件2
例如他們的left分別是0,55。
這時候物理位置就是 0和55,邏輯位置是0,控制元件1的寬度+兩個控制元件的間距。
如果你縮放的時候使用的是物理位置,當然看起來就是以空間的中心縮放,但是當你使用邏輯位置你就會發現這是按照 頂點(左上角)縮放的了。
但是邏輯位置的制作這些還是需要一些時間的:
1、理順全部控制元件關系。
2、控制元件在視窗初始化的時候直接使用邏輯位置*比例的方式指定四個引數。
uj5u.com熱心網友回復:
private void setfrom(Control.ControlCollection IControls)
{
foreach (Control item in IControls)
{
item.Top = (int)(item.Top * 0.8);
item.Left = (int)(item.Left * 0.8);
item.Width = (int)(item.Width * 0.8);
item.Height = (int)(item.Height * 0.8);
if (item.HasChildren)
{
setfrom(item.Controls);
}
}
}
這是個縮小到80%的方法,你自己寫引數做成縮小指定倍數的即可。
你好,你這種方法是不是以每個控制元件的中心來縮放?
能不能設定將控制元件的左上角固定來縮放?
能也不能。
你自己根據控制元件邏輯位置和間隔來制作left就可以左上角實作了。
但是我覺得你來問肯定就是不知道怎么制造這些控制元件的邏輯位置,
那就簡單點說吧:
控制元件1|控制元件2
例如他們的left分別是0,55。
這時候物理位置就是 0和55,邏輯位置是0,控制元件1的寬度+兩個控制元件的間距。
如果你縮放的時候使用的是物理位置,當然看起來就是以空間的中心縮放,但是當你使用邏輯位置你就會發現這是按照 頂點(左上角)縮放的了。
但是邏輯位置的制作這些還是需要一些時間的:
1、理順全部控制元件關系。
2、控制元件在視窗初始化的時候直接使用邏輯位置*比例的方式指定四個引數。
位置好像只能重新指定了, 我是用基準的方法來做的. 如取左上角控制元件位置一定, 然后后面的控制元件位置 = ctrler_base.x+控制元件間間隔(*系數). 當然間隔也可以指定
uj5u.com熱心網友回復:
private void setfrom(Control.ControlCollection IControls)
{
foreach (Control item in IControls)
{
item.Top = (int)(item.Top * 0.8);
item.Left = (int)(item.Left * 0.8);
item.Width = (int)(item.Width * 0.8);
item.Height = (int)(item.Height * 0.8);
if (item.HasChildren)
{
setfrom(item.Controls);
}
}
}
這是個縮小到80%的方法,你自己寫引數做成縮小指定倍數的即可。
你好,你這種方法是不是以每個控制元件的中心來縮放?
能不能設定將控制元件的左上角固定來縮放?
能也不能。
你自己根據控制元件邏輯位置和間隔來制作left就可以左上角實作了。
但是我覺得你來問肯定就是不知道怎么制造這些控制元件的邏輯位置,
那就簡單點說吧:
控制元件1|控制元件2
例如他們的left分別是0,55。
這時候物理位置就是 0和55,邏輯位置是0,控制元件1的寬度+兩個控制元件的間距。
如果你縮放的時候使用的是物理位置,當然看起來就是以空間的中心縮放,但是當你使用邏輯位置你就會發現這是按照 頂點(左上角)縮放的了。
但是邏輯位置的制作這些還是需要一些時間的:
1、理順全部控制元件關系。
2、控制元件在視窗初始化的時候直接使用邏輯位置*比例的方式指定四個引數。
位置好像只能重新指定了, 我是用基準的方法來做的. 如取左上角控制元件位置一定, 然后后面的控制元件位置 = ctrler_base.x+控制元件間間隔(*系數). 當然間隔也可以指定
實際上你只要兼容幾個解析度就好了,就像游戲一樣做幾個解析度的布局,然后用戶設定解析度這樣開發速度要快一些。
uj5u.com熱心網友回復:
按百分比進行設定uj5u.com熱心網友回復:
這個界面就分左右2部份,你只需要縮放左邊的“坐標軸”就可以了吧。。。
uj5u.com熱心網友回復:
先通過 Screen.FromControl(this) 獲取螢屏大小再根據預置的尺寸做適當調整
大多數情況下都是不需要調整到每個控制元件的,比如你示例的畫面是并列的兩個容器,你只要改變容器的寬度和右控制元件的起點就可以了,沒必要改變容器內的控制元件的尺寸。
雖然理論上并沒有錯誤,但改變控制元件尺寸也要相應改變字體大小,弄不好會很難看的
uj5u.com熱心網友回復:
應該是在你的筆記本上,控制元件發生了自動縮放。建議將自動縮放關閉.
uj5u.com熱心網友回復:
直接設定成百分比就好了uj5u.com熱心網友回復:
解析度不一樣,你在畫坐標軸的時候,XY軸上每個刻度長度如果固定,那解析度不同,你繪制出來的XY軸刻度個數應該也不一樣,不然你怎么調整都是顯示不全的右邊的是dock anchor的問題,改一下就好了
uj5u.com熱心網友回復:
這個問題我之前也遇到過,你得知道一個問題,解析度 DPI 等等,你看那個QQ 你如果調整了解析度 或者是 DPI 他都會提示你是否也把QQ 設定成同樣的DPI 。我覺得如果做的好的話,你也得這么考慮,就是通過DPI 去設計或者是去加載不同的布局和字體大小 。確實挺麻煩的 。希望能幫助到你 。uj5u.com熱心網友回復:
看下屬性里有沒有同比縮放uj5u.com熱心網友回復:
WinForm開發的話,Form的屬性里面有一個borderStyle 好像是叫這個,改成Sizeable就好了吧 然后最大化視窗uj5u.com熱心網友回復:
右邊的控制元件不用管,左側座標在繪制時就得考慮視窗的大小,每小格的大小不能固定,要動態算出來才行uj5u.com熱心網友回復:
我之前也是筆記本顯示不全,但在臺式機上顯示全了。我是把AutoScaleMode設定成None就可以了,我原來設定成DPI形式了,問題應該就是解析度的事兒轉載請註明出處,本文鏈接:https://www.uj5u.com/net/29690.html
標籤:C#
上一篇:byte型別求解
