2010-05-14 9 views
9

나는 사용자가 회전 할 수 있도록 TextBox입니다. 하지만 내 사용자가 좋아할만한 점은 CursorTextBox과 같은 각도로 회전시키는 것입니다. 예를 들어, TextBox을 28 °로 회전 한 경우 Cursor이 입력되면 TextBoxCursor도 28 °로 회전해야합니다.회전 된 텍스트 상자에 따라 회전 커서

아무런 도움이 필요하지 않으시면 언제든지 큰 도움이 될 것입니다.

는 :) 감사

+0

어쩌면 ... "커서"자체가 실제 컨트롤이기 때문에 다른 컨트롤을 회전하는 것과 같은 방식으로 회전 할 수 있습니다. 흠, 나는 이것을 시험해보고 재 게시 할 것이다. –

+0

Nup ... 작동하지 않았습니다! 아! –

+0

커서를 마우스 커서라고 할 때 즉. I Beam 또는 다음 문자가 삽입/삭제 될 곳을 표시하기 위해 표시되는 캐럿을 참조하고 있습니까? 10 명 중 한 명이 커서를 사용하여 두 단어 모두를 암시하기 때문에 질문합니다. 깜박이는 캐럿이 회전하기 때문에 마우스 커서를 의미한다고 가정하지만 어쨌든 물어볼 것입니다. –

답변

8

당신은 회전 할 수 있습니다 커서는 WPF의 비트 맵 회전 기능과 함께 WinForms의 System.Drawing.Icon 클래스를 사용합니다.

아이콘을로드하고, BitmapSource로 변환하고, 이미지 및 RenderTargetBitmap을 사용하여 회전하고, 아이콘으로 다시 변환하고 저장 한 다음 마지막으로 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); 
} 

, 당신은 초기화 데이터를 취하는 System.Drawing.Bitmap 생성자를 호출하는 usafe 코드의 작은 비트로 교체 할 수 있습니다 : 여기

코드가 어떻게 생겼는지입니다 :

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

TextBox 회전이 변경 될 때마다이 코드를 호출해야합니다. 이 작업은 TextBox를 회전하는 코드 또는 TextBox의 회전에 바인딩 된 값의 PropertyChangedCallback에서 수행 할 수 있습니다.

+0

와우! 그것은 완벽하게 작동합니다. 이것을 쓸 시간을 내 주셔서 대단히 감사합니다. 훌륭한! –

+0

반갑습니다. 재미있는 작은 퍼즐이었습니다. 내 코드가 실제로 작동되어서 다행이다. –

+0

다양한 구문 오류가 발생합니다. – SepehrM

0

음 잘 모르겠어요 ...하지만 커서가 윈도우에 의해 관리되기 때문에 .. 나는 (당신이 텍스트 상자를 입력하면 커서를 숨기고 자신을 그릴 필요가 추측 다른 컨트롤을 회전하고 있기 때문에 쉽게 회전 할 수 있습니다).

훗는,이 작업을 수행 할 수있는 방법을 인터넷 검색, 첫 번째 결과는 SO에서 자연적으로했다, 당신이 (당신이 WPF를 사용하는 경우) 허용 대답을 확인 싶어 있습니다

Custom cursor in WPF?

+0

고마워요. :-) 나에게 futre heaches와 시간 lol의 제비 뽑기를 구했다. –