Visão geral do modo UILess
Como criar UILessMode
Tornar o thread sem interface do usuário: o aplicativo pode tornar um thread sem interface do usuário por ITfThreadMgrEx::ActivateEx com ITF_AE_UIELEMENTENABLEDONLY. Quando ThreadMgr é ativado com esse sinalizador, somente as TIPs que podem controlar seu elemento da interface do usuário são ativados no thread. O aplicativo precisa implementar a interface ITfUIElementSink e avisar a interface no gerenciador de threads. ITfUIElementSink::BeginUIElement é chamado quando a TIP mostra sua interface do usuário. O aplicativo pode retornar TRUE no parâmetro pbShow para permitir que a TIP mostre a interface do usuário original da TIP quando o aplicativo não quiser mostrar graficamente. Se o aplicativo não permitir a interface do usuário da TIP, poderá retornar FALSE no parâmetro pbShow (veja os diagramas abaixo). O próprio aplicativo pode mostrar graficamente a interface do usuário obtendo algumas informações do parâmetro pElement. Pode ser a lista de candidatos, o item da barra de idiomas ou a interface do usuário personalizada da TIP. O aplicativo pode conhecer o tipo de interface do usuário pela interface QIing ITfUIElement. Quando a interface do usuário é alterada, ITfUIElementSink::UpdateUIElement é chamado. O aplicativo pode comparar o GUID de pElement->GetGUID() para saber se o elemento é mostrado graficamente no momento pelo aplicativo.
Tornar a TIP menos sensível à interface do usuário: a TIP deve ser compatível com o modo sem interface do usuário se quiser ser executada no aplicativo que não deseja permitir a interface do usuário da TIP, como aplicativos de jogos ou aplicativos de tela inteira. Para tornar menos sensível à interface do usuário, a TIP precisa implementar a interface ITfTextInputProcessorEx. Se essa interface não for implementada, a TIP não será ativada no thread do modo sem interface do usuário. Além disso, a TIP deve chamar ITFUIElementMgr::BeginUIElement antes de mostrar uma interface do usuário visível na tela. Esse método faz uma chamada para ITfUIElementSink notificar o aplicativo. E o aplicativo decidirá se ele pode ser mostrado ou não. Quando a TIP chama BeginUIElement(), a TIP precisa ter a interface ITfUIElement para a interface do usuário correspondente. O aplicativo obterá a interface por QI a fim de obter outra interface específica da interface do usuário para recuperar mais informações para mostrar graficamente a interface do usuário. O sistema predefine ITfCandidateListUIElement e ITfReadingInformationUIElement para a TIP. Quando a TIP deseja mostrar a lista de candidatos no thread do modo sem interface do usuário, a TIP deve criar uma instância da interface ITfCandidateListUIElement e chamar ITFUIElementMgr::BeginUIElement. Quando ITfTextInputProcessorEx::ActivateEx é chamado, a TIP já sabe que o thread tem menos interface do usuário, portanto, pode eliminar a interface do usuário personalizada extra. No entanto, ela pode implementar sua própria interface, que pode ser usada como QI, e tentar criar uma notificação. Dessa forma, a TIP e o aplicativo ITfUIElement podem ter uma negociação para a interface do usuário personalizada da TIP.
TIP com suporte para UIElement
A TIP que tem suporte para o UIElement deve ser categorizada por GUID_TFCAT_TIPCAP_UIELEMENTENABLED. A TIP em GUID_TFCAT_TIPCAP_UIELEMENTENABLED deve usar ITfUIElementMgr para mostrar qualquer interface do usuário para que o aplicativo possa controlar a visibilidade da interface do usuário.
Status Show/Hide do UIElement: o status Show/Hide que é indicado pelo método ITfUIElement::Show ou ITfUIElement::IsShown é o status visível real. Não está relacionado à disponibilidade do UIElement. O UIElement deve estar sempre disponível quando o status mostrar existir. O status mostrar pode ser controlado no aplicativo. O aplicativo pode passar repentinamente para o modo UILess e começar a mostrar graficamente alguma interface do usuário por si só, chamando ITfUIElement::Show com FALSE para ocultar toda a interface do usuário da TIP. Em seguida, a TIP pode escolher uma entre algumas opções. 1) A TIP pode mover o UIElement para o status Hide e começar a gerar UpdateUIElement. 2) A TIP pode concluir o UIElement, pois o elemento da interface do usuário não é compatível com o status Hide e a TIP chama EndUIElement() para concluí-lo.
Elementos da interface do usuário predefinidos
A lista de candidatos: é um dos principais elementos da interface do usuário para entrada do EA. Esse elemento de interface do usuário fornece a lista de candidatos e o número correspondente das cadeias de caracteres do candidato para mostrar graficamente.
A janela de informações de leitura: é comum para a entrada do teclado chinês. Ela tem o estágio que não pode ser inserido no documento como a cadeia de caracteres de composição. Alguns processadores de entrada em chinês abrem uma pequena janela de informações de leitura que mostra as informações de leitura, fonética ou digitação.
O fluxograma de UILessMode
Depois que a TIP recebe TRUE em *pbShown por ITfUIElementMgr::BeginUIElement, a TIP não precisa chamar UpdateUIElement para o UIElement. Mas, a TIP precisa chamar EndUIElement() para que o ITfUIElementMgr e o aplicativo possam acompanhar o status de UIElement. A TIP deve chamar UpdateUIElement() depois que BeginUIElement() retornar FALSE em *pbShow. O aplicativo que deseja mostrar graficamente a interface do usuário não verifica o conteúdo em BeginUIElement(), apenas retorna o status show em BeginUIElement() e começa a verificar o conteúdo em UpdateUIElement(). Por exemplo, o sinalizador de atualização do UIElement da lista de candidatos tem todos os bits no primeiro UpdateUIElement(). Isso significa que o conteúdo de UIElement não precisa estar pronto em BeginUIElement().
O UIElement da lista de candidatos
Sobre PageIndex: o aplicativo que mostra graficamente a lista de candidatos calculará o número de cadeias de caracteres por página quando o conteúdo da lista for alterado (TF_CLUIE_STRING é definido). Não é bom alterar o índice da página enquanto a lista de candidatos está disponível para o modo UILess. Isso significa que a lista de candidatos da TIP deve manter a paginação, em vez de rolar quando a seleção é movida para a próxima página. Se a rolagem ocorrer nos movimentos de seleção, o índice da página será alterado e o aplicativo precisará recalcular o índice. O resultado pode não ser esperado pela TIP.
Sem seleção: ITfCandidateListUIElement::GetSelection retorna S_FALSE se a lista de candidatos não tem uma seleção. O valor retornado do primeiro parâmetro é inválido.