Tôi đã cố vẽ đường viền tùy chỉnh cho các điều khiển .Net WinForms hiện có. Tôi đã thử điều này bằng cách tạo một lớp mà từ điều khiển tôi muốn thay đổi màu viền của, và sau đó thử một vài thứ trong khi vẽ. Tôi đã thử các cách sau:Làm cách nào để vẽ đường viền tùy chỉnh trên .Net WinForms kiểm soát
1. Catch WM_NCPAINT
. Điều này hoạt động, phần nào. Vấn đề với mã bên dưới là khi điều khiển thay đổi kích thước, đường viền sẽ bị cắt ở bên phải và phía dưới. Không tốt.
protected override void WndProc(ref Message m)
{
if (m.Msg == NativeMethods.WM_NCPAINT) {
WmNcPaint(ref m);
return;
}
base.WndProc(ref m);
}
private void WmNcPaint(ref Message m)
{
if (BorderStyle == BorderStyle.None) {
return;
}
IntPtr hDC = NativeMethods.GetWindowDC(m.HWnd);
if (hDC != IntPtr.Zero) {
using (Graphics g = Graphics.FromHdc(hDC)) {
ControlPaint.DrawBorder(g, new Rectangle(0, 0, this.Width, this.Height), _BorderColor, ButtonBorderStyle.Solid);
}
m.Result = (IntPtr)1;
NativeMethods.ReleaseDC(m.HWnd, hDC);
}
}
2. Ghi đè void OnPaint
. Điều này làm việc cho một số điều khiển, nhưng không phải tất cả. Điều này cũng yêu cầu bạn phải đặt BorderStyle
thành BorderStyle.None
và bạn phải xóa nền theo cách thủ công trên sơn, nếu không, hãy you get this khi bạn đổi kích thước.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawBorder(e.Graphics, new Rectangle(0, 0, this.Width, this.Height), _BorderColor, ButtonBorderStyle.Solid);
}
3. Overriding void OnResize
và void OnPaint
(như trong phương pháp 2). Bằng cách này, nó vẽ tốt với thay đổi kích thước, nhưng không phải khi Bảng điều khiển có kích hoạt AutoScroll
, trong trường hợp này nó sẽ look like this khi cuộn xuống. Nếu tôi cố gắng sử dụng WM_NCPAINT
để vẽ đường viền, Refresh()
sẽ không có hiệu lực.
protected override void OnResize(EventArgs eventargs)
{
base.OnResize(eventargs);
Refresh();
}
Đề xuất được hoan nghênh hơn. Tôi muốn biết những gì tốt nhất cách để đi về việc này là, cho nhiều loại điều khiển (tôi sẽ phải làm điều này cho nhiều điều khiển WinForms mặc định).
tôi chắc chắn rằng bạn đã nghe nói nó trước, nhưng đề nghị chân thành của tôi sẽ được chỉ cần sử dụng WPF thay vì WinFroms. Ngoài ra, bạn có mong muốn của tôi cho may mắn trong việc này, và +1 của tôi cho một câu hỏi tốt bằng văn bản. – BradleyDotNET
Cảm ơn bạn! Và có, tôi đã nghe nói rằng trước đây, nhiều lần :) Tôi vẫn cần phải tìm thời gian để tìm hiểu WPF, nhưng dự án này là quá sâu vào WinForms để chuyển đổi nó thành WPF. Có lẽ trong tương lai. – Codecat
void override void OnResize (EventArgs eventargs) { base.OnResize (eventargs); Làm mới(); } – houssam