Pregunta

Estoy tratando de hacerlo para que un usuario pueda seleccionar texto de un cuadro de edición de solo lectura, pero no verá el careto parpadeante. He podido hacer que el careto desaparezca de la edición, pero aún se puede ver por un instante.

Este es mi código para la subclase:

LRESULT CALLBACK UserInfoProc (HWND hUserInfoWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{

    HideCaret(hUserInfoWnd);

    return DefSubclassProc(hUserInfoWnd, uMsg, wParam, lParam);

}

Es un poco modesto de código, lo sé, pero casi hace lo que quiero.

Entonces, lo que sucede es que cuando hago clic en la edición, el careto se puede ver por un instante (¿50 ms?). Quiero que no aparezca en absoluto. ¿Cómo puedo hacer esto? Quiero que el usuario todavía pueda seleccionar el texto de la edición.

¿Fue útil?

Solución

Podrías intentar mover el HideCaret() llamar a después del DefSubclassProc(), ya que en este momento si un mensaje desencadena el careto no será hasta el Siguiente mensaje que está oculto de nuevo.

Además, supongo que el único mensaje que desencadena el careto que se muestra es WM_SETFOCUS, por lo que es posible que desee probar solo ese mensaje. Por ejemplo,

LRESULT CALLBACK UserInfoProc (HWND hUserInfoWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    LRESULT lRes = DefSubclassProc(hUserInfoWnd, uMsg, wParam, lParam);
    if (uMsg == WM_SETFOCUS) // maybe?
        HideCaret(hUserInfoWnd);
    return lRes;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top