và bắt sự kiện trên đúng chưa? thanksVisual C# Code:
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:
Các trị Mô tả 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 CenterScreen form được căn giữa màn hình. Ví dụ: StartPosition = FormStartPosition.CenterScreen 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 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 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
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).Visual C# Code:
Và dưới đây liệt kê các thành viên của lớp Screen:
Details Code:
Các thành viên Mô tả 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. 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. 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. 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.
và bắt sự kiện trên đúng chưa? thanksVisual C# Code:
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 đó.
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![]()
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ôiVB.NET Code:
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim rec As Rectangle Dim CtlOut, CtlIn As Control For Each CtlOut In Me.Controls CtlOut.Tag = CtlOut.Top / Me.Height & ";" & CtlOut.Left / Me.Width & ";" & CtlOut.Width / Me.Width & ";" & CtlOut.Height / Me.Height & ";" & CtlOut.Font.Size / Me.Height If TypeOf CtlOut Is GroupBox Then For Each CtlIn In CtlOut.Controls CtlIn.Tag = CtlIn.Top / CtlOut.Height & ";" & CtlIn.Left / CtlOut.Width & ";" & CtlIn.Width / CtlOut.Width & ";" & CtlIn.Height / CtlOut.Height & ";" & CtlIn.Font.Size / CtlOut.Height Next End If Next Me.Height = Screen.GetBounds(rec).Height Me.Width = Screen.GetBounds(rec).Width Me.Top = 0 : Me.Left = 0 End Sub Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize Dim CtlOut, CtlIn As Control For Each CtlOut In Me.Controls ResizeControl(Me, CtlOut) If TypeOf CtlOut Is GroupBox Then For Each CtlIn In CtlOut.Controls ResizeControl(CtlOut, CtlIn) Next End If Next End Sub Private Sub ResizeControl(ByVal PaCtl As Object, ByVal ChCtl As Control) Dim ctlTag, CtlTop, CtlLeft, CtlWidth, CtlHeight, ctlFontSize As String Dim P1, P2 As Integer ctlTag = ChCtl.Tag.ToString P1 = ctlTag.IndexOf(";") CtlTop = ctlTag.Substring(0, P1) P2 = P1 + 1 P1 = ctlTag.IndexOf(";", P2) CtlLeft = ctlTag.Substring(P2, P1 - P2) P2 = P1 + 1 P1 = ctlTag.IndexOf(";", P2) CtlWidth = ctlTag.Substring(P2, P1 - P2) P2 = P1 + 1 P1 = ctlTag.IndexOf(";", P2) CtlHeight = ctlTag.Substring(P2, P1 - P2) P2 = P1 + 1 ctlFontSize = ctlTag.Substring(P2) ChCtl.Top = PaCtl.Height * CtlTop ChCtl.Left = PaCtl.Width * CtlLeft ChCtl.Height = PaCtl.Height * CtlHeight ChCtl.Width = PaCtl.Width * CtlWidth ChCtl.Font = New Font(ChCtl.Font.Name, CSng(PaCtl.Height * ctlFontSize), ChCtl.Font.Style) End Sub End Class
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
Ở đấ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
các bác pro quá...
bài viết thật hay...cảm ơn các bác nhiều lắm..
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:
{ { RegistryKey key; key = Registry.LocalMachine.CreateSubKey(RegPath + frm.Name); key.SetValue("Height", frm.Height); key.SetValue("Width", frm.Width); key.SetValue("Left", frm.Left); key.SetValue("Top", frm.Top); } { RegistryKey key; key = Registry.LocalMachine.OpenSubKey(RegPath + frm.Name); } }
sau đó bạn tạo thêm 2 method xử lý cho sự kiện FormClosing và FormLoad như sau :
Vậy là xong .
bigdog
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???
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:
{ { RegistryKey key = Registry.LocalMachine.OpenSubKey(regPath + frm.Name); } { } }
... Từ [0] và [1] họ đã tạo ra nhiều thứ cho những thằng ngu ngồi cãi nhau...