2010-05-14 41 views
9

Tôi có một số TextBox mà tôi cho phép người dùng của mình xoay. Nhưng những gì tôi sẽ yêu cho người dùng của tôi là phải xoay Cursor của họ đến cùng một góc mà TextBox được xoay tại. Ví dụ: nếu chúng xoay vòng TextBox đến 28 °, thì khi Cursor nhập vào đó TextBox, Cursor cũng sẽ tự xoay vòng thành 28 °.Xoay Con trỏ Theo Hộp văn bản được Xoay

Bất kỳ trợ giúp nào đều sẽ được đánh giá cao.

Cảm ơn bạn :)

+0

Có thể ... Vì "Con trỏ" là chính nó là một Điều khiển thực, nó có thể được xoay giống như cách tôi xoay các Điều khiển khác của mình. Hừm, tôi sẽ thử cái này và đăng lại. –

+0

Nup ... Không hoạt động! Argh! –

+0

Khi bạn nói Cursor bạn có nghĩa là con trỏ chuột tức là. Tôi Beam hoặc bạn đang đề cập đến Caret được hiển thị để chỉ ra nơi nhân vật tiếp theo sẽ được chèn vào/xóa, vv Tôi chỉ hỏi vì tôi mười nghe con trỏ từ được sử dụng để hàm ý cả hai. Tôi giả sử bạn có nghĩa là con trỏ chuột vì dấu nháy mắt không xoay, nhưng tôi nghĩ sẽ hỏi. –

Trả lời

8

Bạn có thể xoay của bạn con trỏ bằng cách sử dụng lớp System.Drawing.Icon từ WinForms kết hợp với khả năng xoay bitmap của WPF.

Cách để thực hiện việc này là tải biểu tượng, chuyển đổi nó sang BitmapSource, sử dụng hình ảnh và RenderTargetBitmap để xoay nó, chuyển đổi nó trở lại biểu tượng, lưu và cuối cùng cập nhật byte 2, 10 và 11 làm cho nó một .cur thay vì một .ico.

Đây là những gì mã trông giống như:

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

Nếu bạn muốn tránh các vòng lặp, bạn có thể thay thế nó bằng một đoạn mã nhỏ usafe để gọi constructor System.Drawing.Bitmap mà mất dữ liệu khởi tạo :

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

Bạn sẽ cần phải gọi điều này mỗi lần xoay hộp văn bản của bạn thay đổi. Điều này có thể được thực hiện hoặc từ mã quay TextBox của bạn, hoặc từ một PropertyChangedCallback trên một giá trị được ràng buộc để xoay TextBox.

+0

Thật tuyệt vời! Nó hoạt động hoàn hảo. Cảm ơn bạn rất nhiều vì đã dành thời gian để viết điều này. Rực rỡ! –

+0

Bạn được chào đón. Đó là một câu đố thú vị. Tôi vui mừng mã của tôi thực sự làm việc. –

+0

Tôi nhận được nhiều lỗi cú pháp khác nhau. – SepehrM

0

mmm Tôi không chắc chắn ... nhưng kể từ khi con trỏ được quản lý bởi Windows .. Tôi đoán bạn sẽ cần phải che giấu con trỏ khi nó xâm nhập vào hộp văn bản và vẽ của riêng bạn (mà sẽ dễ dàng xoay vì bạn đang xoay các điều khiển khác).

Heh, Googling cho một cách để làm điều này, kết quả đầu tiên là một cách tự nhiên từ SO, bạn có thể muốn kiểm tra các câu trả lời được chấp nhận (nếu bạn đang sử dụng WPF):

Custom cursor in WPF?

+0

Cảm ơn vì điều này. :-) Đã cứu tôi rất nhiều bài giảng và thời gian của futre lol. –

Các vấn đề liên quan