Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Xử lý kích thước và vị trí của Form trong lập trình C#

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Post Xử lý kích thước và vị trí của Form trong lập trình C#

    Lớp Form cung cấp những thuộc tính Location (vị trí) và Size (kích thước) mà mỗi ô control đều có, nhưng với một “méo mó” một chút. Thuộc tính Location cho biết khoảng cách ở góc top left của cửa sổ so với góc top left của màn hình (hoặc desktop area) trở đi. Ngoài ra, Location sẽ bị phớt lờ trừ khi thuộc tính StartPosition được cho về Manual. Các trị của thuộc tính StartPosition sẽ lấy từ enum FormStartPosition, như dưới đây:

    Details Code:
    1. Các trị                          Mô tả
    2. CenterParent                    Nếu form được hiển thị theo kiểu modal, thì nó sẽ được canh giữa tương đối với biểu mẫu hiển thị nó. Nếu biểu mẫu này không có cha-mẹ, thì đặt để này giống như WindowsDefaultLocation
    3.  
    4. CenterScreen                    form được căn giữa màn hình. Ví dụ: StartPosition = FormStartPosition.CenterScreen
    5.  
    6. Manual                          form sẽ được canh theo vị trí được khai báo bởi thuộc tính Location, tương đối so với top left của desktop area
    7.  
    8. WindowsDefaultLocation          form được hiển thị theo vị trí mặc nhiên của Windows. Nói cách khác, sẽ không biết chính xác biểu mẫu sẽ được canh về đâu
    9.  
    10. WindowsDefaultBound             form được hiển thị theo vị trí mặc nhiên của Windows với một kích thước mặc nhiên (thuộc tính Size bị bỏ qua). Thiết đặt này ít khi dùng tới vì thông thường người ta muốn điều khiển chính xác kích thước của biểu mẫu

    Thỉnh thoảng, bạn cần cẩn thận 1 chút khi chọn vị trí và kích thước đối form của bạn. Thí dụ, bạn có thể vô tình tạo ra 1 form quá lớn để có thể thích nghi với 1 màn hình có độ phân giải thấp. Nếu bạn làm việc với 1 ứng dụng chỉ độc nhất 1 form, giải pháp tốt nhất là tạo 1 form có thể thay đổi kích thước. Nếu bạn dùng 1 ứng dụng với nhiều cửa sổ bay lung tung thì câu trả lời là không đơn giản chút nào.
    Tất nhiên, bạn sẽ nghĩ mình có thể giới hạn vị trị cửa sổ vào vị trí mà những màn hình có độ phân giải nhỏ có thể hỗ trợ, nhưng làm vậy thì thiệt thòi cho những người sử dụng đang sở hữu màn hình có độ phân giải cao (do nhu cầu về thiết kế đồ họa,đọc biểu mẫu,…). Và câu hỏi mà tôi đặt ra cho bạn là phải tìm vị trí thích hợp nhất của form đối với màn hình của người sử dụng. Muốn giải quyết, bạn cần tìm lại những thông tin cơ bản đối với mặt bằng màn hình có sẵn sử dụng đến lớp Screen
    Visual C# Code:
    1. private void Form_Load(sender,EventArgs e) //event Load của Form
    2. {
    3.           Screen scr = Screen.PrimaryScreen; //đi lấy màn hình chính
    4.           this.Left = (scr.WorkingArea.Widththis.Width)/2;
    5.           this.Top = (scr.WordkingArea.Heightthis.Height)/2;
    6. }
    Ví dụ trên sử dụng thuộc tính WorkingArea của lớp Screen. Thuộc tính này trả về vùng làm việc của màn hình, trừ đi vùng chiếm dụng bởi thanh taskbar, bởi thanh công cụ cập bến (docked toolbar), và bởi các cửa sổ cập bến (docked windows).
    Và dưới đây liệt kê các thành viên của lớp Screen:

    Details Code:
    1. Các thành viên                       Mô tả
    2. PrimaryScreen                       Hàm static này trả về 1 đối tượng Screen tượng trưng cho màn hình chính trên hệ thống.
    3.  
    4. Bounds                              Hàm này trả về 1 cấu trúc Rectangle tượng trưng cho biên giới của vùng hiển thị (display area) đối với màn hình hiện hành.
    5.  
    6. WorkingArea                         Hàm này trả về 1 cấu trúc Rectangle tượng trưng cho biên giới vùng hiển thị đối với màn hình hiện hành, trừ đi khoảng mặt bằng chiếm dụng bởi thanh taskbar, thanh công cụ cập bến, và bất cứ cửa số cập bến nào.
    7.  
    8. DeviceName                          Hàm này trả về tên thiết bị được gắn liền với 1 màn hình theo dạng 1 chuỗi
    Đã được chỉnh sửa lần cuối bởi neverland87 : 01-05-2007 lúc 06:42 PM.

  2. #2
    Ngày gia nhập
    03 2007
    Bài viết
    179

    Visual C# Code:
    1.         private void Form1_Resize(object sender, EventArgs e)
    2.         {
    3.            // làm sao cho các BUTTON,LISTBOX, LABLE... thay đổi size theo ?
    4.         }
    và bắt sự kiện trên đúng chưa? thanks

  3. #3
    Ngày gia nhập
    07 2007
    Bài viết
    41

    Không quá cần thiết phải bắt resize event, nên sử dụng thuộc tính anchor của các control trước, khi không được mới phải dùng sự kiện đó.

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà nội
    Bài viết
    77

    nếu form có hàng trăm controls thì set anchor cho từng control hơi mêt đấy
    có ai biết cách resize tất cả các control trên 1 form ko,tôi có đoạn code vb.net nhưng nó dùng typeof,tôi lại chưa biết dùng typeof bên c# như nên ko biết chuyển code,nếu bạn nào rành về convert code thì giúp tôi chuyển đoạn này sang c# được ko,cho tôi và cho cả bạn nữa

    VB.NET Code:
    1. Public Class Form1
    2.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3.         Dim rec As Rectangle
    4.         Dim CtlOut, CtlIn As Control
    5.         For Each CtlOut In Me.Controls
    6.             CtlOut.Tag = CtlOut.Top / Me.Height & ";" & CtlOut.Left / Me.Width & ";" & CtlOut.Width / Me.Width & ";" & CtlOut.Height / Me.Height & ";" & CtlOut.Font.Size / Me.Height
    7.             If TypeOf CtlOut Is GroupBox Then
    8.                 For Each CtlIn In CtlOut.Controls
    9.                     CtlIn.Tag = CtlIn.Top / CtlOut.Height & ";" & CtlIn.Left / CtlOut.Width & ";" & CtlIn.Width / CtlOut.Width & ";" & CtlIn.Height / CtlOut.Height & ";" & CtlIn.Font.Size / CtlOut.Height
    10.                 Next
    11.             End If
    12.         Next
    13.         Me.Height = Screen.GetBounds(rec).Height
    14.         Me.Width = Screen.GetBounds(rec).Width
    15.         Me.Top = 0 : Me.Left = 0
    16.     End Sub
    17.     Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    18.         Dim CtlOut, CtlIn As Control
    19.         For Each CtlOut In Me.Controls
    20.             ResizeControl(Me, CtlOut)
    21.             If TypeOf CtlOut Is GroupBox Then
    22.                 For Each CtlIn In CtlOut.Controls
    23.                     ResizeControl(CtlOut, CtlIn)
    24.                 Next
    25.             End If
    26.         Next
    27.     End Sub
    28.     Private Sub ResizeControl(ByVal PaCtl As Object, ByVal ChCtl As Control)
    29.         Dim ctlTag, CtlTop, CtlLeft, CtlWidth, CtlHeight, ctlFontSize As String
    30.         Dim P1, P2 As Integer
    31.         ctlTag = ChCtl.Tag.ToString
    32.         P1 = ctlTag.IndexOf(";")
    33.         CtlTop = ctlTag.Substring(0, P1)
    34.         P2 = P1 + 1
    35.         P1 = ctlTag.IndexOf(";", P2)
    36.         CtlLeft = ctlTag.Substring(P2, P1 - P2)
    37.         P2 = P1 + 1
    38.         P1 = ctlTag.IndexOf(";", P2)
    39.         CtlWidth = ctlTag.Substring(P2, P1 - P2)
    40.         P2 = P1 + 1
    41.         P1 = ctlTag.IndexOf(";", P2)
    42.         CtlHeight = ctlTag.Substring(P2, P1 - P2)
    43.         P2 = P1 + 1
    44.         ctlFontSize = ctlTag.Substring(P2)
    45.         ChCtl.Top = PaCtl.Height * CtlTop
    46.         ChCtl.Left = PaCtl.Width * CtlLeft
    47.         ChCtl.Height = PaCtl.Height * CtlHeight
    48.         ChCtl.Width = PaCtl.Width * CtlWidth
    49.         ChCtl.Font = New Font(ChCtl.Font.Name, CSng(PaCtl.Height * ctlFontSize), ChCtl.Font.Style)
    50.     End Sub
    51. End Class
    bạn dặt 1 groupbox lên form,đặt các controls cần thiết lên,kết quả khá tuyệt,mong rằng có ai đó chuyển nó sang c# giúp tôi
    cảm ơn !
    Sống ở trên đời cần có một TẤM LÒNG để lúc đói còn có chỗ mà nhét THỨC ĂN

  5. #5
    Ngày gia nhập
    03 2007
    Bài viết
    179

    Trích dẫn Nguyên bản được gửi bởi zxc Xem bài viết
    Không quá cần thiết phải bắt resize event, nên sử dụng thuộc tính anchor của các control trước, khi không được mới phải dùng sự kiện đó.
    Dùng anchor nó kỳ kỳ, vì nó canh trái / phải thì hay bị thừa 1 diện tích không có gì

  6. #6
    Ngày gia nhập
    10 2007
    Bài viết
    2

    Mặc định Xử lý kích thước và vị trí của Form trong lập trình C#

    Ở đấy có cách làm này thấy hay nè, nhung hơi rườm rà, tham khao ở link này:
    Code:
    http://www.codeproject.com/KB/menus/dockingcontrol.aspx

  7. #7
    Ngày gia nhập
    10 2008
    Bài viết
    1

    các bác pro quá...
    bài viết thật hay...cảm ơn các bác nhiều lắm..

  8. #8
    Ngày gia nhập
    12 2006
    Bài viết
    28

    Nói về kích thước và vị trí của form trong C# mình cũng xin góp 1 bài nhỏ về vấn đề này .
    Chúng ta có thể lưu vị trí và kích thước của form của lần mở trước.
    Và lần mở form sau thì form sẽ xuất hiện tại vị trí lần trước mà nó xuất hiện.
    Và cách làm như sau (cũng rất là đơn giản) :

    Trước hết bạn tạo thêm 1 class RegistryForm như sau:
    Visual C# Code:
    1. using Microsoft.Win32;
    2.  
    3. public class RegistryForm
    4. {
    5.     public static string RegPath = @"Software\App\";
    6.  
    7.     public static void SaveSize(System.Windows.Forms.Form frm)
    8.     {
    9.        
    10.         RegistryKey key;
    11.         key = Registry.LocalMachine.CreateSubKey(RegPath + frm.Name);
    12.  
    13.         key.SetValue("Height", frm.Height);
    14.         key.SetValue("Width", frm.Width);
    15.         key.SetValue("Left", frm.Left);
    16.         key.SetValue("Top", frm.Top);
    17.     }
    18.  
    19.     public static void SetSize(System.Windows.Forms.Form frm)
    20.     {
    21.         RegistryKey key;
    22.         key = Registry.LocalMachine.OpenSubKey(RegPath + frm.Name);
    23.  
    24.        
    25.         frm.Height = (int)key.GetValue("Height", frm.Height);
    26.         frm.Width = (int)key.GetValue("Width", frm.Width);
    27.         frm.Left = (int)key.GetValue("Left", frm.Left);
    28.         frm.Top = (int)key.GetValue("Top", frm.Top);
    29.     }
    30. }

    sau đó bạn tạo thêm 2 method xử lý cho sự kiện FormClosing và FormLoad như sau :

    Visual C# Code:
    1. private void MyForm_Closing(object sender,
    2.  System.ComponentModel.CancelEventArgs e)
    3. {
    4.     registryForm.SaveSize(this);
    5. }
    6.  
    7. private void MyForm_Load(object sender, System.EventArgs e)
    8. {
    9.     registryForm.SetSize(this);
    10. }
    Vậy là xong .
    bigdog

  9. #9
    Ngày gia nhập
    03 2009
    Bài viết
    1

    Mình đã thử cách của bạn bigdog188 nhưng nó báo lỗi là: "Object reference not set to an instance of an object"???
    Mình phải sửa như thế nào???

  10. #10
    Ngày gia nhập
    10 2006
    Nơi ở
    Bốn biển là nhà
    Bài viết
    36

    dùng try/catch vào, vì nếu bạn mở một frm mới, thì key của nó chưa đựoc đăng ký trong Registry, nên nó sẽ không tìm thấy, bạn dùng try/ cath sẽ không báo lỗi đó nữa
    Visual C# Code:
    1.         public void SetSize(System.Windows.Forms.Form frm)
    2.         {
    3.             try
    4.             {
    5.                 RegistryKey key = Registry.LocalMachine.OpenSubKey(regPath + frm.Name);
    6.                 frm.Height = (int)key.GetValue("Height", frm.Height);
    7.                 frm.Width = (int)key.GetValue("Width", frm.Width);
    8.                 frm.Left = (int)key.GetValue("Left", frm.Left);
    9.                 frm.Top = (int)key.GetValue("Top", frm.Top);
    10.             }
    11.             catch
    12.             {
    13.             }
    14.         }
    ... Từ [0] và [1] họ đã tạo ra nhiều thứ cho những thằng ngu ngồi cãi nhau...

Các đề tài tương tự

  1. ADO.NET Lỗi Incorrect syntax near 'Form' trong form đăng nhập C#
    Gửi bởi vodoi_93 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 08-12-2013, 04:48 PM
  2. Làm thế nào để click vào nút minimum trong form thì form ẩn đi không xuất hiện ở taskbar?
    Gửi bởi thanhhungph127 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 16-07-2013, 09:45 PM
  3. Cách Refresh Form trong 1 hàm thuộc 1 class khác, mà được gọi trong form đó?
    Gửi bởi troy91 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 14-04-2012, 10:13 PM
  4. Sự kiện nhập chữ trong gridview ở form khác thì form này sẽ lấy chữ và id của field
    Gửi bởi lotus88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 03-07-2011, 05:20 PM
  5. lỗi code khi viết form Thêm trong windows form
    Gửi bởi maixanh88 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 14-08-2010, 10:50 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn