2013-11-04 5 views
2

저는 Windows 프로그래밍의 초보자이며 계속해서 여러 가지 문제를 겪고 있습니다. 그 중 대부분은 혼자서 해결할 수있었습니다.C++ win32 편집 상자 커서 깜박임이 없습니다.

내 문제는 텍스트 영역에 표시된 캐럿 (또는 커서)입니다. 텍스트를 입력하는 위치를 나타내는 것? 글쎄, 최소한 보여 주지만 그것이해야하는 것처럼 깜박이지는 않습니다. 편집 상자에 관한 모든 코드

case WM_CREATE: 
     { 

      if(!logged) { 

        HWND userField = CreateWindow(
             "EDIT", // Predefined class; Unicode assumed 
             NULL,  // Button text 
             WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, // Styles 
             C_WIDTH/2 - 80,   // x position 
             C_HEIGHT - 240,   // y position 
             160,  // Button width 
             25,  // Button height 
             hwnd,  // Parent window 
             NULL,  // No menu. 
             (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
             NULL);  // Pointer not needed. 

        // initialize NONCLIENTMETRICS structure 
        NONCLIENTMETRICS ncm; 
        ncm.cbSize = sizeof(ncm); 

        // obtain non-client metrics 
        SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0); 

        // create the new font 
        HFONT hNewFont = CreateFontIndirect(&ncm.lfMessageFont); 

        // set the new font 
        SendMessage(userField, WM_SETFONT, (WPARAM)hNewFont, 0); 

      } 

     } 
     break; 

:

나는과 같이 WM_CREATE에서 만든 편집 상자가 있습니다. 내가 충분히 명확하지 않거나 코드의 공급이 부족하다면 미안합니다. 여기에 어떤 코드 부분이 관련되어 있으며 무엇이 관련이 있는지 알 수 없습니다. 나는 내 전체 코드를 붙여야한다고 생각하지 않는다.

문제는 텍스트 상자 (userField)의 캐럿이 깜박이지 않는다는 것입니다.

필요한 경우 자세한 내용을 문의하십시오.

+2

유니 코드는 btw로 간주하면 안됩니다.이 코드가 작성된 방식은 'CreateWindowA'를 호출하는 것과 같습니다. ANSI 버전 유니 코드 버전은 첫 번째 매개 변수로'LPCWSTR'을 취하고,'LPCSTR'을 전달합니다. 나는 대단히 ** 당신이 VS를 사용하고 있거나 UNICODE와 _UNICODE 둘 다 정의하지 않았다면 유니 코드로 설정된 문자 세트를 가지고 있는지 확인하는 것이 좋습니다. – Mgetz

+0

오, 그게 그게 전부 였어. 나는 VS2012에서 VS2013으로 업그레이드했고 갑자기 모든 "문자열"이 잘못되어 "문자열"로만 변경해야했습니다. 내 전처리 정의에 UNICODE와 _UNICODE를 모두 추가했는데 모든 것이 정상으로 돌아갔습니다. –

+0

수동으로 할 필요는 없습니다. VC++ 프로젝트 설정을 확인해야합니다. 아마도 MBCS – Mgetz

답변

4

코드를 사용하여 깜박이는 캐럿을 얻지 못했습니다. 하지만 내가 추가 :

SetFocus(userField); 

봐라,

주위를 연주 후
+0

으로 설정되어있을 것입니다. 나는 WM_CREATE의 끝에서 그것을 추가했다 - 당신은 그것을 어디에 넣었습니까? –

+0

WM_CREATE의 끝에. – manuell

0

:-) 깜박이는 캐럿 - 내 코드 조금 정돈하고 물건을 만드는 - 내가 실수로 자신의

I에 해결

HWND userField = CreateWindow("EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, 
        C_WIDTH/2 - 80, C_HEIGHT - 240, 160, 25, hwnd, NULL, g_hInstance, NULL); 
속으로

HWND userField = CreateWindow(
          "EDIT", // Predefined class; Unicode assumed 
          NULL,  // Button text 
          WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT, // Styles 
          C_WIDTH/2 - 80,   // x position 
          C_HEIGHT - 240,   // y position 
          160,  // Button width 
          25,  // Button height 
          hwnd,  // Parent window 
          NULL,  // No menu. 
          (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
          NULL);  // Pointer not needed. 

변경

유일한 차이점은 hInstance입니다. 첫 번째 코드에서는 분명히 잘못되었습니다. hInstance에 대한 글로벌 참조로 변경했습니다.

+0

다른 곳에 다른 것이 있어야합니다. 나는 당신의 정확한 CreateWindow 코드를 사용하여 문제를 재현했다. (포커스가 없을 때, 실제로는 * 문제가 아니다.) 정확한 SetWocus 코드로 "고정"했다. 기묘한. – manuell

+0

오. 문제를 잘못 이해 했어야합니다. 문제는 포커스가 없을 때 캐럿이 없다는 것이 아닙니다 (실제로는 문제가 아니라 ...)하지만 포커스가있을 때 캐럿이 깜박 거리지 않습니다. 깜박 거리는 캐럿이 없다는 말은 캐럿이 있다는 뜻입니다. 깜박이지 않습니다. –

+0

죄송합니다. 내 대답은 전혀 관련이 없습니다. "깜박 거리지 않는"캐럿 폰트였습니까? (화살표 키 또는 마우스를 사용할 때 id가 움직입니다.) – manuell

1

이는 영업 이익이 경험 한 문제가되지 않을 수도 있습니다,하지만 난 경우 다른 사람의 경험이 문제에 여기 내 솔루션을 게시하도록하겠습니다 같은 증상을 경험하고 있었다 ... 한마디로

, 당신이 경우 편집 컨트롤을 서브 클래스로 만들고 WM_SETFOCUS 이벤트를 처리하려면 DefSubclassProc()을 호출해야합니다. 그렇지 않으면 캐럿이 표시되지 않습니다. 아마 당신은 ShowCaret()을 직접 호출 할 수 있지만, 발생할 필요가있는 다른 처리가있을 경우에는 DefSubclassProc()를 호출하는 것이 더 안전합니다.