2012-02-22 2 views
1

질문을 올리면서 생각하고 대답을 테스트 한 후 답변을 잘못 해석했으며 답변자가 나를 잘못 해석했다고 생각합니다. 원래 질문은 here입니다. 나는 사람들이 내가 문자열을 강조하고 싶다고 믿었으며, 정확한 목적을 밝히지 않았다. 그래서, 이제 할게요 :사용자 지정 텍스트 상자 : 강조 표시 및 선택

최근에 나는 GDI +를 사용하여 C++ CLR의 처음부터 100 % 텍스트 상자를 생성하려고합니다. 나는 사용자가 텍스트 박스를 클릭 할 때 캐럿을 배치하는 것에 대한 도전에 빠져있다. 간단한 수학을 (그들이 선 너비로 나누어 클릭 한 곳) 나는 클릭 한 줄을 알아낼 수 있습니다. 그러나 캐릭터를 클릭하기 위해서는 라인의 모든 문자의 경계 사각형을 비교하고 마우스가 들어가기 전에 캐럿을 배치해야합니다 (더 좋은 방법이 없다면). 이를 위해서는 각 문자열이 아닌 개별 문자의 정확한 범위를 가져와야합니다.

은 이미 어느 것도 작동 듯, 몇 가지를 시도했다 :

한계가있는 경우가 아니면 이러한 방법을 사용할 수 없다고 생각합니다. 나는 내가 이전에했던 것보다 훨씬 더 분명하게 나의 문제와 예상 된 해결책을 만들었 으면 좋겠다.

+0

32 자의 뚜껑을 나타내는 Graphics :: MeasureCharacterRanges 링크에 아무것도 표시되지 않습니다. –

+0

@ MarkRansom 나는 어딘가에 그것을 읽고, 나는 32+ 문자를 할 때 OverflowException을 받는다. – smoth190

답변

1

텍스트가 커닝되고 앤티 앨리어스 처리되는 방식 때문에 문자의 경계는 왼쪽의 모든 문자에 따라 다릅니다. 그러나 각 문자 경계를 알 필요는 없으며 클릭 포인트의 양쪽에있는 문자 경계 만 알 수 있습니다. 바이너리 검색을 사용하는 문자열을 찾을 수 있습니다. 문자열을 반으로 분할하고이를 (TextRenderer :: MeasureText를 사용하여) 측정하고 클릭 지점의 왼쪽 또는 오른쪽에 있는지 확인하십시오. 한 가지 가능성이 남아있을 때까지 문자열의 크기를 줄입니다.

+0

좋아, 문제가 해결되면 문제가 해결되면 어떻게 될까? 위의 측정 결과는 내 문제를 해결하지 못합니다. – smoth190

+0

@ smoth190, 그게 훨씬 쉽습니다. 강조 표시 전에 문자를 한 번 측정하고 강조 표시를 포함하여 모든 문자까지 측정하십시오. –

+0

좋습니다. 논리적 인 것 같습니다. 도움을 주셔서 감사합니다. 저는이 모든 것이 작동하도록했습니다. – smoth190

관련 문제