PDA

View Full Version : سوال: اندازه نمایش فرم ها در به نسبت سایز صفحه نمایش



Ship Storm
پنج شنبه 02 خرداد 1392, 21:23 عصر
سلام
من یک برنامه نوشتم با Vb.net تو مانیتور 24 اینچ الان میبرم تو مانیتورهای 14 اینچ اجرا میکنم خیلی براش بزرگه و همه جای فرمم رو نشون نمیده
چکار باید بکنم که اندازه فرم های من تو صفحه نمایش های مختلف به نسبت اون کوچک بشه و همه فرم نمایش داده بشه روی صفحه؟
ممنون

مهرداد صفا
جمعه 03 خرداد 1392, 10:58 صبح
با سلام.
با استفاده از Screen به ابعاد صفحه نمایش دسترسی دارید. مثلا:


me.Width=Screen.PrimaryScreen.Bounds.Width\2
me.Height =Screen.PrimaryScreen.Bounds.Height\2

Ship Storm
جمعه 03 خرداد 1392, 13:55 عصر
ممنون ولی چطور باید کاری کنم که همه فرم های من تو این نرم افزار اندازش نسبت به صفحه نمایش تغییر کنه ؟
تو خود فرم خاصیتی نداره برای اینکار ؟

hosein320
جمعه 03 خرداد 1392, 14:25 عصر
سلام
بهتره از خاصیت Anchor استفاده کنی

مهرداد صفا
جمعه 03 خرداد 1392, 14:44 عصر
ممنون ولی چطور باید کاری کنم که همه فرم های من تو این نرم افزار اندازش نسبت به صفحه نمایش تغییر کنه ؟
تو خود فرم خاصیتی نداره برای اینکار ؟

با سلام.
معمولا با قرار دادن Form.WindowState به مقدار maximized پنجره به صورت خودکار مطابق صفحه نمایش تنظیم می شود.

Ship Storm
جمعه 03 خرداد 1392, 19:02 عصر
ممنون ولی مشکل من حل نشد با این راهنمایی ها
خواهشا یکم دقیق تر و با جزئیات بیشتری راهنمایی کنید

مهرداد صفا
جمعه 03 خرداد 1392, 21:04 عصر
با سلام.
در حالت عادی برای تمام صفحه کردن فرم از خصوصیت WindowState آن استفاده می شود. در این حالت با مقدار FormWindowState.Maximized فرم مورد نظر به طور خودکار و بسته به صفحه نمایش به بزرگترین اندازه تغییر اندازه می دهد:

'in the name of god
'صل الله علی محمد و آله

Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.WindowState = FormWindowState.Maximized
End Sub
End Class


ولی اگر حساسیت زیادی دارید و اگر تمام فرمها را در حالت تمام صفحه نمایش می دهید میتوانید فرمی طراحی کنید که با لود شدن به اندازه صفحه نمایش تغییر اندازه می دهد و در تمامی فرمهای برنامه از آن ارثبری کنید.
برای این کار:
1- یک پروژه جدید از نوع WindowsFormsApplication در VS ایجاد کنید.

2- از منوی project گزینه Add new Item را باز کرده از قسمت common items گزینه Class را انتخاب کنید تا یک کلاس جدید به پروژه اضافه شود.
3- کد مربوط به class1 را به صورت زیر تغییر دهید:

'in the name of god
'صل الله علی محمد و آله

Public Class MaximizedForm
Inherits System.Windows.Forms.Form

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
Me.Location = Point.Empty
Me.Size = Screen.PrimaryScreen.Bounds.Size
End Sub



End Class

با این کار ما کلاسی ساختیم که از Form ارثبری میکند با این تفاوت که این فرم در زمان لود شدن به اندازه صفحه نمایش تغییر اندازه میدهد.
4- کد مربوط به Form1 را باز کرده و به صورت زیر تغییر دهید:

'in the name of god
'صل الله علی محمد و آله

Public Class Form1
Inherits MaximizedForm


End Class

با این کار در واقع ما Form1 را از MaximizedForm مشتق میکنیم تا در زمان لود شدن به طور خودکار تمام صفحه شود.
5- کلید f5 را بزنید تا برنامه اجرا شود. به خطای زیر بر میخورید:


Error 1 Base class 'MaximizedForm' specified for class 'Form1' cannot be different from the base class 'System.Windows.Forms.Form' of one of its other partial types. D:\Users\mmmmmm\AppData\Local\Temporary Projects\WindowsApplication1\Form1.vb 2 14 WindowsApplication1

روی آن کلید enter را بزنید و گزینه Change 'form1' to inherit from 'WindowsApplication1.MaximizedForm' را انتخاب کنید.
6- به تعداد دلخواه فرم به پروژه اضافه کنید و مراحل 4 و 5 را روی آنها پیاده کنید.
7- برنامه را اجرا کنید.

Ship Storm
جمعه 03 خرداد 1392, 22:54 عصر
ممنون
در واقع با این کار ما سایز صفحه رو تو هر رزولیشنی که باشه روی ماکزیمم تنظیم میکنیم درسته ؟

محمد آشتیانی
شنبه 04 خرداد 1392, 03:12 صبح
سلام

اینطور که من متوجه شدم، با روشی که دوستان گفتن مشکل شما حل نمیشه ، بخاطر اینکه فرضا شما یه فرم درست کردی به ابعاد 1000*1800 و مانیتور خودت هم FullHD - 1920*1080 هست تا اینجا مشکلی نیست
ولی طبیعتا وقتی بخوای برنامتو رو یه مانیتور با مثلا رزولوشن HD اجرا کنی خب مشخصه که قسمتی از فرم از صفحه بیرون میزنه و دیده نمیشه ربطی هم به WindowState فرم نداره.
برای این قضیه یه راه هست ، این که با توجه به رزولوشن سیستم مقصد سایز فونت فرم رو کوچیک یا بزرگ کنی تا همه اجزای فرم به همون نسبت تغییر سایز بدن. البته ممکنه بازم خیلی نتیجه دلچسب نباشه.

barnamenevisforme
شنبه 04 خرداد 1392, 10:05 صبح
سلام دوست عزیز
مشکل عدم تناسب اندازه ها از یک سیستم به سیستم دیگه مربوط به 2 مسئله میشه:
1-resolution
2-dpi
همون طور که دوستان فرمودن،شما میتونید فرمتون رو برای هر اندازه و resolution ی تمام صفحه کنی.
ولی مهم تر از همه حفظ تناسب کنترل های چیده شده در فرم هست.
یکی از راه های مناسب برای این کار استفاده از table layout panel هست.البته استفاده از خصوصیت anchor(لنگر) هم توسط دوستان پیشنهاد میشه،
ولی اینو باید خدمتتون عرض کنم که من تا به حال از اون نتیجه مطلوب نگرفتم.
در ضمن خصوصیت dock هر کنترل هم در نحوه قرار گرفتن اون کنترل در سلول های table layout panel خیلی مهمه،من بیشتر گزینه fill رو ترجیح میدم،
استفاده از ترکیبی از table layout ها و panel ها،میتونه شما رو به نتیجه مطلوب برسونه.
با استفاده از این کنترل،متناسب با اندازه فرم ،اندازه و مکان قرار گرفتن کنترل ها در فرم تغییر خواهند کرد.

Ship Storm
شنبه 04 خرداد 1392, 20:09 عصر
مشکل با این مسائل حل نمیشه و واقعا دچار دردسر شدم سر این قضیه چون امکان ساخت برنامه با رزولیشن پایین به علت کمبود وقت برام دیگه وجود نداره و دسترسی به مانیتور رزولیشن پایین هم ندارم که بخوام اینکارو انجام بدم
قطعا ماکروسافت راه حلی برای این مشکل داره ولی نمیدونم چرا هرچی میگردم چیزی دستگیرم نشده تا حالا که بتونه نیاز من رو برآورده کنه:ناراحت:

مهرداد صفا
شنبه 04 خرداد 1392, 21:16 عصر
ممنون
در واقع با این کار ما سایز صفحه رو تو هر رزولیشنی که باشه روی ماکزیمم تنظیم میکنیم درسته ؟
سلام خواهش می کنم.
بله دقیقا.
اندازه Screen به صورت داینامیک و با توجه به رزولوشن صفحه نمایش کاربر محاسبه می شود.
برای اجزای فرم هم جدا از نظرات دوستان می توانید ابتدا فرم را بر اساس صفحه نمایش تنظیم کنید و اشیا دیگر را نسبت به فرم و یکدیگر تنظیم کنید.
مثال:

'in the name of god
'صل الله علی محمد و آله

Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.BackColor = Color.Black
Me.Width = Screen.PrimaryScreen.Bounds.Width \ 2
Me.Height = Screen.PrimaryScreen.Bounds.Height \ 2

End Sub

Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
With Button1
.Width = Me.Width \ 4
.Left = .Width \ 4
.Top = Height - Height \ 4

End With
With Button2
.Top = Button1.Top
.Left = Button1.Right + Button1.Left
.Width = Button1.Width
End With

With Button3
.Top = Button1.Top
.Left = Button2.Right + Button1.Left
.Width = Button1.Width
End With
End Sub
End Class

فرید نجفلو
یک شنبه 05 خرداد 1392, 00:37 صبح
سلام


چون امکان ساخت برنامه با رزولیشن پایین به علت کمبود وقت برام دیگه وجود نداره و دسترسی به مانیتور رزولیشن پایین هم ندارم که بخوام اینکارو انجام بدم
بر طبق این حرفتون من الان فقط یه پیشنهاد می تونم بهتون بدم
اینکه شما زمان ران تایم (اجرای برنامه) به نسبت دقت نمایشی که الان دارید (زمان طراحی) و دقت نمایشی که ضمن اجرا خواهید داشت فرم همه و همه کنترل های اون رو تغییر اندازه بدید
یعنی اگه الان دقت 1280 در 960 دارید و زمان اجرا 640 در 480 باشه در این صورت فرم و تمام کنترل های اون باید طول و عرضشون نصف بشه

من قبلا (10 سال پیش!) شبیه این کد رو دیده برای VB6 بودم و واستو از آرشیوم پیدا کردم و به همون شکل اینجا قرار می دم یعنی حتی کامل کد ها رو نخوندم ولی انیدوارم بتونه کمکتون کنه (توجه: کدها شامل گارانتی و خدمات پس از ارسال نیست :قهقهه:)

Sub Resize_For_Resolution(ByVal SFX As Single, ByVal SFY As Single, MyForm As Form)
Dim i As Integer
Dim SFFont As Single
SFFont = (SFX + SFY) / 2.2
On Error Resume Next
With MyForm
For i = 0 To .Count - 1
If TypeOf .Controls(i) Is ComboBox Then
.Controls(i).Left = .Controls(i).Left * SFX
.Controls(i).Top = .Controls(i).Top * SFY
.Controls(i).Width = .Controls(i).Width * SFX
ElseIf TypeOf .Controls(i) Is TextBox Then
.Controls(i).Move .Controls(i).Left * SFX, _
.Controls(i).Top * SFY, _
.Controls(i).Width * SFX, _
.Controls(i).Height
Else
.Controls(i).Move .Controls(i).Left * SFX, _
.Controls(i).Top * SFY, _
.Controls(i).Width * SFX, _
.Controls(i).Height * SFY
End If
' If TypeOf .Controls(i) Is vaSpread Then
' ' .Controls(i).FontSize = .Controls(i).FontSize * SFFont
' Else
' .Controls(i).FontSize = .Controls(i).FontSize * SFFont
' End If
Next i
If RePosForm Then
.Move .Left * SFX, .Top * SFY, .Width * SFX, .Height * SFY
End If
End With
End Sub


Public Sub G_P_FormResize(TheForm As Form)
Dim ScaleFactorX As Single, ScaleFactorY As Single
If Not DoResize Then
DoResize = True
Exit Sub
End If
If MyForm.Width = 0 Then GoTo MyExit
If MyForm.Height = 0 Then GoTo MyExit
RePosForm = False
ScaleFactorX = TheForm.Width / MyForm.Width
ScaleFactorY = TheForm.Height / MyForm.Height
Resize_For_Resolution ScaleFactorX, ScaleFactorY, TheForm
MyForm.Height = TheForm.Height
MyForm.Width = TheForm.Width

MyExit:
End Sub

Public Sub G_P_AdjustForm(TheForm As Form, Optional DX As Integer = 1024, Optional DY As Integer = 768)
Dim Res As String ' Returns resolution of system
' Put the design time resolution in here
' provide DX , DY as design time resolution of form
' i.e. the resulution of Programmers Machine
DesignX = DX
DesignY = DY
RePosForm = True
DoResize = False
Xtwips = Screen.TwipsPerPixelX
Ytwips = Screen.TwipsPerPixelY
Ypixels = Screen.Height / Ytwips
Xpixels = Screen.Width / Xtwips
ScaleFactorX = (Xpixels / DesignX)
ScaleFactorY = (Ypixels / DesignY)
TheForm.ScaleMode = 1
Resize_For_Resolution ScaleFactorX, ScaleFactorY, TheForm
Res = Str$(Xpixels) + " by " + Str$(Ypixels)
'Debug.Print Res
TheForm.Height = TheForm.Height
TheForm.Width = TheForm.Width
End Sub

sanjar.ir
چهارشنبه 22 مرداد 1393, 00:59 صبح
سلام
تمام ابعاد اشیاء را درصدی از ابعاد مانیتور تعریف نمایید.
با آغاز برنامه یک الگوریتم اجرا می شود که که ابعاد مانیتور را می گیرید و ابعاد فرم را با آن تنظیم می کند و سپس ابعاد هر شيء را درصدی از آن تعریف می کند.
این الگوریتم می تواند درون یک Sub باشد تا در صورت تغییر اندازه برنامه، اشیاء نیز تغییر اندازه پیدا کنند و فواصلشان تنظیم شود.