2010-05-14 14 views
9

Kullanıcılarımın dönmesine izin verdiğim bir TextBox var. Ama kullanıcılar için SEVECEKLERİMİZ Cursor, TextBox'un döndürülmüş olduğu aynı açıya sahip olmaktır. Örneğin, TextBox'u 28 ° döndürdüyse, Cursor bu TextBox'a girdiğinde, Cursor da kendini 28 ° döndürmelidir.Döndürülmüş TextBox'a Göre İmleci Döndürme

Her hangi bir yardım çok takdir edilecektir.

:) Teşekkürler

+0

Belki ... "İmleç" kendi başına gerçek bir Kontrol olduğundan, diğer Kontrollerimi döndürdüğüm şekilde döndürülebilir. Hmmm, bunu deneyeceğim ve repertleyeceğim. –

+0

Nup ... İşe yaramadı! Ahh! –

+0

İmleç dediğinizde, fare imlecini kastediyorsunuzdur. I Beam veya bir sonraki karakterin nereye ekleneceğini/silineceğini göstermek için görüntülenen Caret'e atıfta bulunuyorsunuz. Sadece soruyorum, her ikisini de ima etmek için kullanılan kelime imlecini duyuyorum. Fare imlecini kastettiğini farzediyorum çünkü yanıp sönen piyano dönüyor, ama yine de istediğimi düşündüm. –

cevap

8

Sen döndürebilirsiniz senin WPF'nin bitmap döndürme yeteneği ile birlikte WinForms System.Drawing.Icon sınıfını kullanarak imleci.

Bunu yapmanın yolu, simgeyi yüklemek, bir BitmapSource'a dönüştürmek, Resim ve RenderTargetBitmap öğelerini döndürmek, bir simgeye geri dönüştürmek, kaydetmek ve son olarak 2, 10 ve 11 baytlarını güncellemek. .ico yerine bir .cur yapın. Eğer döngü kaçınmak istiyorsanız

public Cursor GetRotatedCursor(byte[] curFileBytes, double rotationAngle) 
{ 
    // Load as Bitmap, convert to BitmapSource 
    var origStream = new MemoryStream(curFileBytes); 
    var origBitmap = new System.Drawing.Icon(origStream).ToBitmap(); 
    var origSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(origBitmap.GetHBitmap()); 

    // Construct rotated image 
    var image = new Image 
    { 
    BitmapSource = origSource, 
    RenderTransform = new RotateTransform(rotationAngle) 
    }; 

    // Render rotated image to RenderTargetBitmap 
    var width = origBitmap.Width; 
    var height = origBitmap.Height; 
    var resultSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); 
    resultSource.Render(image); 

    // Convert to System.Drawing.Bitmap 
    var pixels = new int[width*height]; 
    resultSource.CopyPixels(pixels, width, 0); 
    var resultBitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPargb); 
    for(int y=0; y<height; y++) 
    for(int x=0; x<width; x++) 
     resultBitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x])); 

    // Save to .ico format 
    var resultStream = new MemoryStream(); 
    new System.Drawing.Icon(resultBitmap.GetHIcon()).Save(resultStream); 

    // Convert saved file into .cur format 
    resultStream.Seek(2); resultStream.WriteByte(curFileBytes, 2, 1); 
    resultStream.Seek(10); resultStream.WriteByte(curFileBytes, 10, 2); 
    resultStream.Seek(0); 

    // Construct Cursor 
    return new Cursor(resultStream); 
} 

, sen başlatma verilerini alır System.Drawing.Bitmap kurucusunu çağırmak için usafe küçük bir kod biraz değiştirebilirsiniz: Burada

kod gibi görünür : TextBox döndürme her değiştiğinde, bunu çağırmanız gerekir. Bu, TextBox'unuzu döndüren koddan veya TextBox'un rotasyonuna bağlı bir değerde bir PropertyChangedCallback öğesinden yapılabilir.

+0

Vay! Mükemmel çalışıyor. Bunu yazmak için zaman ayırdığınız için çok teşekkür ederim. Parlak! –

+0

Rica ederim. Eğlenceli küçük bir bulmaca oldu. Kodumun gerçekten işe yaradığıma sevindim. –

+0

Çeşitli sözdizimi hataları alıyorum. – SepehrM

0

mmm emin değilim ... ama imleç Windows tarafından yönetilir beri .. Ben (bunu metin kutusu girdiğinde imleci gizlemek ve kendi çizmek gerekir tahmin Diğer kontrolleri döndürdüğünüzden dönmesi kolay olacaktır).

Heh, bunu yapmanın bir yolu Googling, ilk sonuç SO gelen doğal oldu, siz (WPF kullanıyorsanız) kabul cevabı kontrol et istersen olabilir:

Custom cursor in WPF?

+0

Bunun için teşekkürler. :-) Bana bir sürü hürmet ve zaman lol kaydetti. –

İlgili konular