2015-10-01 6 views
1

Я хотел бы скрыть каретку из RichEdit (50 Вт) с указанным стилем ES_READONLY. Это довольно запутанно для пользователя, когда каретка мигает, и пользователь не может ввести.
Я попытался скрыть каретку, используя функцию HideCaret(),
однако она не работает для меня с помощью следующего кода:Скрытие каретки в RichEdit winapi

LRESULT CALLBACK ChatMessaegsSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) // Subclassed control 
{ 
    LRESULT ret = CallWindowProc(WndProc_ChatMessages, hwnd, msg, wParam, lParam); 
    switch(msg) 
    { 
    //Also tried with EN_SETFOCUS 
    case WM_SETFOCUS: 
    { 
     ret = CallWindowProc(WndProc_ChatMessages, hwnd, msg, wParam, lParam); 
     HideCaret(ChatMessages); //Returns 5 (Access denied.) 
     break; 
    } 

    //According the documentation: 
    //If your application calls HideCaret five times in a row, 
    //it must also call ShowCaret five times before the caret is displayed. 
    case WM_KILLFOCUS: //The message is called when the RichEdit get focus, however nothing happens. 
    { 
     ret = CallWindowProc(WndProc_ChatMessages, hwnd, msg, wParam, lParam); 
     ShowCaret(ChatMessages); 
     break; 
    } 
    } 
    return ret; 
} 
+1

Ваше решение находится на правильном пути, но это не поможет, если управление получает фокус с клавиатуры (например, клавиши Tab). Скрывает ли каретку действительно хорошую идею? Я сомневаюсь, как это «запутывает» - это стандартное поведение элемента управления и позволяет пользователю понять, что они могут копировать текст из него, даже если они не могут ввести его. –

+0

@JonathanPotter Вы правы с фокусом клавиатуры. Я хочу отображать такие сообщения, как в skype в этом RichEdit. Кажется запутанным для пользователей, когда они видят карет, который на самом деле говорит им: «Эй, вы можете ввести здесь!» и они не могут из-за стиля «ES_READONLY». – ProXicT

+2

Вы можете отправить ответ на свой вопрос, чтобы люди знали, что проблема закрыта. –

ответ

0

Вот решение:

LRESULT CALLBACK ChatMessaegsSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    LRESULT ret = CallWindowProc(WndProc_ChatMessages, hwnd, msg, wParam, lParam); 
    switch(msg) 
    { 
    case WM_LBUTTONDOWN: 
    { 
     HideCaret(ChatMessages); 
     break; 
    } 
    case WM_KILLFOCUS: 
    { 
     ShowCaret(ChatMessages); 
     break; 
    } 
    } 
    return ret; 
} 

Примечание это только работает, когда пользователь вызывает фокус с помощью мыши. Поэтому, если кто-то знает, как правильно с этим справиться, не стесняйтесь отвечать, я буду рад.

+0

Это выглядит отлично, как и Keyboard focus не должен активировать каретку! За исключением «SetWindowSubclass» было бы лучше. –

+0

@BarmakShemirani Клавиатурный фокус не скрывает каретку. Это очевидно, когда я работаю только с LMB-down. Почему 'SetWindowSubclass' лучше, чем' SetWindowLong'? – ProXicT

+0

'SetWindowSubclass' рекомендуется для общего контроля 6 и выше https://msdn.microsoft.com/en-us/library/windows/desktop/bb773183%28v=vs.85%29.aspx --- Вы можете включить' WS_TAB' для управления редактированием или включения/выключения --- Должен быть другой способ обработки ключа вкладок в WinApi, но я не знаю, как это сделать. –