2012-11-18 1 views
1

Windows를 변경하는 방법 커서 모양을 기본적으로 세로 (|)에서 가로 (dos)에 사용 된 것과 같이 깜박입니다.C++에서 창을 깜박이는 커서 모양을 변경하는 방법은 무엇입니까?

거기에 신경을 쓰는 좋은 기능이 있습니까?

OS :

+0

내가 생각 [에서는 SetCursor 기능 (윈도우)] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648393%28v=vs.85 : 나는 다음과 같은 과부하를 제공 할 수 있습니다 % 29.aspx) 유용 할 수도 있습니다 –

+0

@NullPointer 괜찮아요 내가 좀 걸릴 것입니다 – tonni

답변

2

이 WIN7 실제로 오히려 커서보다는 캐럿이라고합니다. 그것은 아마도 혼란이 어디에서 왔으며, 왜 해결책을 찾지 않아도 많은 도움을 얻지 못하는 이유 일 것입니다. NullPonyPointer's comment도이 일반적인 혼동을 반영합니다. SetCursor 기능은 실제로 마우스 커서를 변경하려는 것이지만 캐럿을 변경하는 데는 작동하지 않습니다. CreateCaret, ShowCaret, HideCaret, SetCaretPosDestroyCaret :

다행히 캐럿 작업 윈도우 기능의 전체 그룹이있다. 깜박임 시간을 조정할 수있는 몇 가지 방법이 있지만 사용자의 현재 설정 (기본값)을 사용하는 것이 좋습니다.

먼저 약간의 배경. 두 개의 소개 용 MSDN 기사 about caretsusing carets을 읽는 것이 좋습니다. 그러나 요약은 다음과 같습니다. 캐럿은 창에 의해 소유됩니다. 특히, 현재 포커스가있는 윈도우. 이 창은 텍스트 상자 컨트롤과 비슷할 것입니다. 윈도우가 포커스를 받으면 사용할 캐럿을 만든 다음 포커스를 잃으면 캐럿을 파괴합니다. 물론 수동으로 수행하지 않으면 기본 구현을 받게됩니다.

샘플 코드. WM_SETFOCUS, EN_SETFOCUS에 대한 응답으로,

bool CreateCustomCaret(HWND hWnd, int width, int height, int x, int y) 
{ 
    // Create the caret for the control receiving the focus. 
    if (!CreateCaret(hWnd, /* handle to the window that will own the caret */ 
        NULL, /* create a solid caret using specified size */ 
        width, /* width of caret, in logical units    */ 
        height)) /* height of caret, in logical units   */ 
     return false; 

    // Set the position of the caret in the window. 
    if (!SetCaretPos(x, y)) 
     return false; 

    // Show the caret. It will begin flashing automatically. 
    if (!ShowCaret(hWnd)) 
     return false; 

    return true; 
} 

그런 다음, 또는 유사한 통지, 나는 CreateCustomCaret 함수를 호출 할 것이다 : 나는 사탕 기계 인터페이스를 좋아하기 때문에, 나는 기능에 포장 것입니다. WM_KILLFOCUS, EN_KILLFOCUS 또는 다른 유사한 알림에 대한 응답으로 DestroyCaret()으로 전화 할 것입니다.

또는 CreateCustomCaret은 비트 맵에서 캐럿을 만들 수 있습니다.

bool CreateCustomCaret(HWND hWnd, HBITMAP hbmp, int x, int y) 
{ 
    // Create the caret for the control receiving the focus. 
    if (!CreateCaret(hWnd, /* handle to the window that will own the caret */ 
        hBmp, /* create a caret using specified bitmap   */ 
        0, 0)) /* width and height parameters ignored for bitmap */ 
     return false; 

    // Set the position of the caret in the window. 
    if (!SetCaretPos(x, y)) 
     return false; 

    // Show the caret. It will begin flashing automatically. 
    if (!ShowCaret(hWnd)) 
     return false; 

    return true; 
} 
+0

헤이 코디, 노력을 많이 한 덕분에,이 게시물은 오래되었고 나는 캐럿을 바꾸는 것이 너무 많은 조사를하는 직원이라고 생각하면서 거의 잊어 버렸습니다. , 그리고 나는 인터넷에서 많은 좋은 정보를 찾지 못했지만, 당신은 저에게 다른면을 보여줍니다! Thnx 남자 당신은 최고입니다, 정말 고마워! – tonni

+0

@tonni 그래! 어제 내가 너를 도왔다 고 했지. 나는 그것을 기억하지 못했지만, 당신 프로필에있는 당신의 오래된 질문 중 일부를 보았고, 나는이 답변에 답을 얻지 못했다. 당신 말이 맞아요. 온라인에 관한 정보는별로 없습니다. 사람들이 더 이상 그렇게하지 않는 것이 아닙니다. 커서 변경은 1992 년에 16 비트 Windows에서 훨씬 인기가있었습니다. Windows API의 원본은 carets에 대한 장을 헌정했으나 더 이상 보지 못했습니다. 좋은 정보를 사용할 수 있습니다. –

+0

"너는 어제 내가 너를 도왔다 고 말했어. 나는 기억하지 못 했어."- 네, 너는 나를 돕는다. 그리고 나는 기억한다. 그러나 내가 암호를 잃어 버릴만한 다른 기록이있다. 그러나 도움이되는 해안에 대해 안다. 당신에게서 왔습니다 :) – tonni

관련 문제