2010-05-14 11 views
9

के अनुसार घुमावदार कर्सर मेरे पास TextBox है जो मैं अपने उपयोगकर्ताओं को घूमने की अनुमति देता हूं। लेकिन मैं अपने उपयोगकर्ताओं के लिए क्या प्यार करूंगा, उनके Cursor को उसी कोण पर घुमाएं जो TextBox पर घुमाया गया था। उदाहरण के लिए, यदि उन्होंने TextBox को 28 डिग्री पर घुमाया, तो Cursor उस TextBox में प्रवेश करता है Cursor को स्वयं को 28 डिग्री तक घुमाया जाना चाहिए।रोटेटेड टेक्स्टबॉक्स

किसी भी मदद की बहुत सराहना की जाएगी।

धन्यवाद :)

+0

शायद ... चूंकि "कर्सर" स्वयं एक वास्तविक नियंत्रण है, इसलिए इसे मेरे अन्य नियंत्रणों को घुमाए जाने के समान ही घुमाया जा सकता है। हमम, मैं कोशिश करूँगा और दोबारा पोस्ट करूंगा। –

+0

नुप ... काम नहीं किया! अरे! –

+0

जब आप कर्सर कहते हैं तो आपका मतलब माउस कर्सर यानी है। मैं बीम या क्या आप कैरेट को रेफर कर रहे हैं जो यह इंगित करने के लिए प्रदर्शित होता है कि अगला चरित्र कहां डाला जाएगा/हटाया जाएगा। मैं केवल इसलिए पूछता हूं क्योंकि दस में से प्रत्येक शब्द कर्सर को दोनों को इंगित करता था। मुझे लगता है कि आपका मतलब माउस कर्सर है क्योंकि ब्लिंकिंग कैरेट घुमाता है, लेकिन सोचा कि मैं वैसे भी पूछूंगा। –

उत्तर

8

आप घुमा सकते हैं अपने WinForms से SystemFDing.Icon क्लास का उपयोग कर कर्सर WPF की बिटमैप रोटेशन क्षमता के साथ संयोजन में।

ऐसा करने का तरीका आइकन लोड करना है, इसे बिटमैप स्रोत में परिवर्तित करना है, इसे घुमाने के लिए छवि और रेंडरटाइटल बिटमैप का उपयोग करें, इसे वापस एक आइकन में परिवर्तित करें, इसे सहेजें, और आखिरकार बाइट 2, 10, और 11 अपडेट करें इसे एक .ico के बजाय एक .cur बनाओ।

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); 
} 

आप पाश से बचना चाहते हैं, तो आप इसे usafe कोड का एक छोटा सा System.Drawing.Bitmap निर्माता कि प्रारंभ डेटा लेता है कॉल करने के लिए के साथ की जगह ले सकता:

यहाँ कोड कैसा दिखाई देता है है :

fixed(int* bits = pixels) 
    { 
    resultBitmap = new System.Drawing.Bitmap(width, height, width, System.Drawing.Imaging.PixelFormat.Format32bppPargb, new IntPtr(bits)); 
    } 

आप इस हर बार कॉल करने के लिए अपने पाठ बॉक्स रोटेशन परिवर्तन की आवश्यकता होगी। यह उस कोड से किया जा सकता है जो आपके टेक्स्टबॉक्स को घुमाता है, या PropertyChangedCallback से टेक्स्टबॉक्स के घूर्णन के लिए बाध्य है।

+0

वाह! यह पूरी तरह से काम करता है। इसे लिखने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद। प्रतिभाशाली! –

+0

आपका स्वागत है। यह एक मजेदार छोटी पहेली थी। मुझे खुशी है कि मेरा कोड वास्तव में काम करता है। –

+0

मुझे विभिन्न वाक्यविन्यास त्रुटियां मिल रही हैं। – SepehrM

0

mmm मुझे यकीन है कि नहीं कर रहा हूँ ... लेकिन जब से कर्सर विंडोज द्वारा किया जाता है .. मुझे लगता है कि आप कर्सर छुपाना जब यह पाठ बॉक्स में प्रवेश करती है और अपने खुद के आकर्षित करने के लिए की आवश्यकता होगी (जो आप अन्य नियंत्रण घूर्णन कर रहे हैं क्योंकि घूमना आसान होगा)।

हे, यह करने के लिए एक तरह से के लिए Googling, पहला परिणाम प्राकृतिक तौर पर इतना से था, तो आप करना चाहते हैं स्वीकार किए जाते हैं जवाब की जांच (यदि आप WPF का उपयोग कर रहे हैं) हो सकता है:

Custom cursor in WPF?

+0

इसके लिए धन्यवाद। :-) मुझे फ्यूचर हीच और टाइम लॉल का बहुत बचाया। –

संबंधित मुद्दे