Pergunta

Estou tentando fazê-lo para que um usuário possa selecionar o texto em uma caixa de edição somente leitura, mas ele não verá o atendimento piscando. Consegui fazer o alvo desaparecer da edição, mas ainda pode ser visto por um instante.

Este é o meu código para a subclasse:

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);

}

É um pouco modesto de código, eu sei, mas quase faz o que eu quero.

Então, o que acontece é que, quando clico na edição, o cuidador pode ser visto por um instante (50ms?). Eu quero que isso não apareça. Como posso fazer isso? Quero que o usuário ainda possa selecionar o texto na edição.

Foi útil?

Solução

Você poderia tentar mover o HideCaret() Ligue para depois do DefSubclassProc(), pois no momento se uma mensagem aciona o cuidador, não será até próximo mensagem de que está escondido novamente.

Além disso, eu acho que a única mensagem que desencadeia o cuidador a ser mostrado é WM_SETFOCUS, então você pode querer testar apenas essa mensagem. Por exemplo,

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top