Chiều rộng của biểu mẫu của bạn không phải là 188 pixel trong một thời gian dài. Bây giờ với VS2012, Windows cuối cùng đã ngừng nói dối về nó.
Vấn đề là đường viền cửa sổ chất béo trong Aero. Họ là một vấn đề cực kỳ phức tạp khi tính năng này được giới thiệu trong Vista. Rất cần thiết vì hai điểm ảnh đó trở nên khó đánh bằng chuột. Nhưng mạnh mẽ không tương thích với cách một ứng dụng tạo ra một cửa sổ. Nó yêu cầu kích thước cửa sổ cụ thể, kích thước bên ngoài, đối số nWidth và nHeight của hàm CreateWindow(). Nhưng những gì thực sự quan trọng là kích thước của khu vực khách hàng, một phần của cửa sổ bên trong biên giới. Nếu Microsoft không làm điều gì đó về nó, các ứng dụng cũ sẽ kết thúc với một khu vực khách hàng quá nhỏ. Có vẻ rất xấu, nội dung cửa sổ sẽ không còn phù hợp nữa. Một điều khiển đối với phía dưới hoặc bên phải của biểu mẫu sẽ không được hiển thị hoàn toàn ví dụ.
Vì vậy, lén lút, Aero làm cho cửa sổ lớn hơn bởi chiều rộng thêm của đường viền chất béo. Và khi ứng dụng yêu cầu kích thước cửa sổ, nó lén lút nói rằng nó nhỏ hơn bởi cùng chiều rộng được thêm vào. Các ứng dụng không biết tốt hơn so với nó vẫn đang chạy với kích thước cửa sổ tương tự nó đã có trên XP. Điều này hoạt động khá tốt, nhưng không chính xác lý tưởng. Khó có được các cạnh cửa sổ để căn chỉnh đúng cách với lời nói dối đó chẳng hạn.
Có hoặc không Aero sẽ nói dối về kích thước cửa sổ dựa trên hệ điều hành đích được ghi trong tiêu đề EXE. Khi nó nhìn thấy một phiên bản cũ hơn sau đó 6.00, số phiên bản Vista, sau đó nó sẽ giả định rằng EXE của bạn là một chương trình di sản mà không biết về tính năng biên giới chất béo. Vì vậy, cần phải nói dối. Bạn đã chạy với số phiên bản đích đó được đặt là 4.00 trong một thời gian dài, nó được viết bởi trình biên dịch .NET khi nó xây dựng chương trình của bạn. Bạn có thể xem nó với dumpbin.exe /headers yourapp.exe
.
Điều này cuối cùng đã thay đổi trong VS2012 và .NET 4.5. Đây là phiên bản .NET không có trong XP. Trình biên dịch cuối cùng có thể đưa ra giả định rằng XP là lịch sử và bạn sẽ chạy trên một phiên bản Windows có hỗ trợ Aero. Vì vậy, nó đặt phiên bản Windows mục tiêu trong tiêu đề EXE đến 6.00. Tương ứng, Aero giờ sẽ dừng nói dối về kích thước cửa sổ. Bạn nhận được một thực tế, không phải là một giả.
Vì vậy, khắc phục nhanh là thay đổi phiên bản .NET framework mục tiêu thành 4.0. Đó là có sẵn trên XP, do đó bạn sẽ nhận được nói dối một lần nữa.
Tất nhiên, tốt hơn là sửa mã của bạn. Không bao giờ sử dụng thuộc tính Kích thước, Chiều rộng hoặc Chiều cao, chúng chắc chắn sẽ phụ thuộc vào kích thước đường viền và chú thích. Sử dụng thuộc tính ClientSize thay vào đó, đó là thuộc tính ổn định và thuộc tính bạn thực sự quan tâm.Nhưng hãy cẩn thận với tài sản đó, một hình thức có thể rescale khi nó chạy trên một máy có bộ điều hợp video của nó thiết lập đến hơn 96 chấm trên mỗi inch. Một tính năng khác rất dễ truy cập trong Vista trở lên. Thay đổi tỷ lệ thay đổi ClientSize tương ứng theo cài đặt DPI.
Sửa lỗi thực tế là sử dụng trường bool thay vì theo dõi trạng thái cửa sổ. Và đặt thuộc tính ClientSize dựa trên vị trí của điều khiển bạn muốn ẩn hoặc tiết lộ. Vì vậy, khoảng:
private bool enlarged;
private void button1_Click(object sender, EventArgs e)
{
enlarged = !enlarged;
int width = someControl.Left - 5;
if (enlarged) width = someControl.Right + 5;
this.ClientSize = new Size(width, this.ClientSize.Height);
}
Thay thế someControl trong mã này bằng tên điều khiển của bạn.
Điều gì sẽ xảy ra nếu bạn nhấn Shift + F5? –
@ofstream Xin cảm ơn vì đã trả lời. Bạn không chắc chắn tôi làm theo? Tất cả mọi thứ hoạt động tốt trong khi gỡ lỗi và hành động theo cách nó nên. Khi tôi xuất bản chương trình và mở tập tin được biên dịch là khi nó không làm những gì nó cần. Tôi nhấn shift + f5 trong vs trong khi gỡ lỗi và nó chỉ dừng trình gỡ lỗi – Nabbic
Chỉ là một dự đoán hoang dã, nhưng hãy kiểm tra tập tin cấu hình của một xuất bản, chắc chắn rằng nó đang được công bố. – AaronLS