TextBox metninin rengini DWM Glass altında ele almaya çalışıyorum. Çok fazla malzeme okuyorum, hala mükemmel bir çözüm yok.DWM camı altında TextBox ile testler
Neredeyse mükemmel sonuçlar kodunu burada bulabilirim: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/316a178e-252b-480d-8cc9-85814c2073d8/, ancak çok fazla harekete geçirme ve olaya özel işlem var (Örneğin: bazı metinleri yazın ve Ana Sayfa düğmesine basın).
Bu sorunları çözmeye çalışıyorum.
Aşağıdaki kod, orijinal kodun bir mütasyonudur, ancak yalnızca WM_PAINT üzerinde herhangi bir olaya dayanmaz. Hala flicking, ve caret (metin imleci) bir şekilde ortadan kayboldu!
Yanıp sönmeyi nasıl önlersiniz ve karet (metin imleci) nasıl geri alınır?
Teşekkürler. Sonra cam alanında arka plan renge formun TransparencyKey ayarlarsanız
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;
namespace AeroWindowsFormsApplication
{
public class AeroTextBox : TextBox
{
private const int WM_PAINT = 0xf;
private bool _aeroFix;
public AeroTextBox()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}
protected override void WndProc(ref Message m)
{
if (_aeroFix)
{
switch (m.Msg)
{
case WM_PAINT:
RedrawAsBitmap();
m.Result = new IntPtr(1);
break;
default:
base.WndProc(ref m);
break;
}
}
else
{
base.WndProc(ref m);
}
}
private void RedrawAsBitmap()
{
using (Bitmap bm = new Bitmap(this.Width, this.Height))
using (Graphics g = this.CreateGraphics())
{
this.DrawToBitmap(bm, this.ClientRectangle);
g.DrawImageUnscaled(bm, -1, -1);
}
}
public bool AeroFix
{
get { return _aeroFix; }
set
{
if (_aeroFix != value)
{
Invalidate();
}
_aeroFix = value;
}
}
}
}
Genel olarak yöntemi geliştirmek için bir ödül başlattım. Çoğunlukla flört etmekten kaçının, geçersiz kılmalardan kaçının, vb. Kodun ne kadar çirkin olduğunu düşünmüyorum. – Lazlo
Başka bir nokta: Bu kodda AeroFix'in ne yaptığını bilmiyorum, çünkü asla ayarlanmadı. Ancak lütfen etkinlik başına geçersiz kılma kodunu belirten VB'deki (postayla bağlantılı) orijinal koda bakın. – Lazlo
WPF'yi kullanabilir ve sonsuza dek mutlu yaşayabilirsiniz. –