2010-05-07 3 views
2

텍스트 입력을 허용하는 C# (VS2008, .net 3.5 사용)에서 WinForms 컨트롤을 만들고 있습니다. 나는 일반적인 Windows 캐럿을 표시하기 위해 User32.dll에서 필요한 Win32 API 함수를 가져 왔으며 이것들은 모두 정상적으로 작동하지만 정확히 어떻게 표시하는지 표시하지는 않습니다.C# 프로그램에서 캐럿 잘라 내기

텍스트가 컨트롤에 공백 테두리로 표시되고이 여백을 분명히하기 위해 Graphics.SetClip()을 사용합니다. 캐럿을 같은 지역으로 클리핑하고 싶지만 클리핑 영역을 설정하는 확실한 API 함수가 없기 때문에이 작업을 수행 할 방법이 없습니다. 나는 명백한 것을 놓친 적이 있습니까?

캐럿은 그 안에있는 컨트롤 안에 잘립니다. 따라서 하나의 해결책은 테두리가없는 별도의 하위 컨트롤에 텍스트를 배치하는 것이 될 수 있다는 것을 알고 있습니다. 그러나 컨트롤의이 부분을 다시 디자인하는 것보다 간단한 방법이 있다면 먼저 살펴 보겠습니다.

미리 도움을 청하십시오!

+0

TextBox에서 컨트롤을 파생 했습니까? 아니면 모두 직접 그렸습니까? –

+0

처음부터 그려져 있습니다. 안타깝게도 Textbox는 관리되지 않는 Win32 컨트롤을 감싸는 비교적 얇은 래퍼이므로 기능을 수정할 수있는 부분은 제한적입니다. –

답변

0

그렇다면 기본 캐럿이 여백 영역에 '출혈'된다는 문제가 올바르게 이해 된 것입니까?

당신이 말한대로 보조 또는 하위 컨트롤에 텍스트를 배치하는 것이 가장 좋습니다. 고려할 수있는 두 가지 옵션 (요구 사항에 맞을 수도 있음)

1- 자르기 영역에 맞는 작은 커서를 만들려면 CreateCaret을 사용하십시오. 물론 경계 공간에 캐럿을 배치하지 않도록해야합니다.

[DllImport("user32", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private extern static bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); 

// Create a caret which is 2 pixels wide by 8 high 
CreateCaret(theControl.Handle, IntPtr.Zero, 2, 8); 

2 아마 덜 유용한 또 다른 옵션이 있지만 캐럿을 클립합니다, 그래서 그것을 언급 할 것이다. Control.Region을 사용하면 전체 창을 필요한 클리핑 영역으로 클립 할 수 있습니다. 물론 이것은 당신을 위해 문제가 될 수도 있고 그렇지 않을 수도있는 당신의 경계 지역을 잘라낼 것입니다. 배경이 국경에 침입하지 않는 그러한 성질의 것이라면, 국경은 투명해질 것입니다.

하지만 하루가 끝날 무렵에는 하위 컨트롤을 사용하는 것이 가장 잘 제어 할 수 있다고 생각합니다.

+0

제안 해 주셔서 감사합니다. 나는 하위 컨트롤이 현재 가장 깨끗한 옵션이 될 것이라고 생각하고 있습니다. –

1

SetClip()으로 현재 클린 클라이언트 영역으로 현재 클립하는 영역을 정의하는 방법은 어떻습니까? (WM_NCCALCSIZE 무시).

+0

이것은 흥미로운 아이디어입니다. 하지만 필자는이 함수의 출력을 정확히 읽은 문서를 읽을 수는 없습니다. 예를 들어, 스크롤 바가 위치한 컨트롤의 일부를 제외하면 필요할 때 다시 그려지는 것입니까? –

+1

당신은 NC_PAINT에 응답해야하고 WM_NCCALCSIZE를 오버라이드 한 윈도우의 클라이언트 영역 외부에있는 것을 그려야합니다. (http://www.codeproject.com/KB/edit/PaddedRichTextBox.aspx) –

+0

@AlexK. 그게 정말 도움이되었다, 고마워! – nekavally

관련 문제