Ao integrar SDL com SOUI para desenvolvimento de players de vídeo, a supressão da área não cliente padrão do sistema causava cintilação durante o redimensionamento de janelas. Ativar a área não cliente nativa do Windows resolve esse problema comum em bibliotecas de enterface.
Para unificar a experiência visual, o SOUI4 implementa um sistema de desenho personalizado na área não cliente utilizando sua estrutura de controles. Isso permite tratamento consistente entre áreas cliente e não cliente, especialmente útil em aplicações com conteúdo multimídia.
Implementação
Desative o atributo de transparência no elemento soui:
<soui translucent="false">
Adicione o elemento ncpainter com a configuração:
<ncpainter
system="false"
borderWidth="5dp"
titleHeight="30dp"
skinBorder="skin_borda_janela"
skinActive="skin_titulo_ativa"
skinInactive="skin_titulo_inativa"
colorActiveTitle="@color/branco"
colorInactiveTitle="@color/branco"
layout="hbox"
gravity="center">
<icon id="sysid_icone" src="ICONE_APLICATIVO:16"/>
<text id="sysid_titulo">@string/titulo_aplicacao</text>
<window size="0,0" weight="1"/>
<imgbtn id="sysid_minimizar" skin="skin_botao_minimizar" animate="1"/>
<window>
<imgbtn id="sysid_maximizar" skin="skin_botao_maximizar" animate="1"/>
<imgbtn id="sysid_restaurar" skin="skin_botao_restaurar" show="0" animate="1"/>
</window>
<imgbtn id="sysid_fechar" skin="skin_botao_fechar" tip="fechar" animate="1"/>
</ncpainter>
Atributos Específicos
- system: Habilita (true) ou desabilita (false) a área não cliente nativa
- borderWidth: Espessura da borda redimensionável
- titleHeight: Altura da barra de título
- skinBorder: Skin para bordas da janela
- skinActive/skinInactive: Skins para fundo do título em estado ativo/inativo
- colorActiveTitle/colorInactiveTitle: Cores do texto do título
Restrições
Evite incluir controles que requerem entrada de teclado (como caixas de texto) na área não cliente, pois eventos de teclado não são processados nesta região.
IDs do Sistema
Controles pré-definidos usam IDs específicos para replicar comportamantos nativos:
enum {
IDC_SYS_ICONE = 100,
IDC_SYS_TITULO = 101,
IDC_SYS_FECHAR = 102,
IDC_SYS_MINIMIZAR = 103,
IDC_SYS_MAXIMIZAR = 104,
IDC_SYS_RESTAURAR = 105
};
O mapeamento é realizado via:
int SNcPainter::MapearID(const SStringW & nome) {
if (nome.IsEmpty()) return 0;
static std::map<SStringW, int> mapeamento = {
{L"sysid_icone", IDC_SYS_ICONE},
{L"sysid_titulo", IDC_SYS_TITULO},
{L"sysid_fechar", IDC_SYS_FECHAR},
{L"sysid_minimizar", IDC_SYS_MINIMIZAR},
{L"sysid_maximizar", IDC_SYS_MAXIMIZAR},
{L"sysid_restaurar", IDC_SYS_RESTAURAR}
};
auto it = mapeamento.find(nome);
return (it != mapeamento.end()) ? it->second : 0;
}
Os controles da área não cliente funcionam de forma idêntica aos demais componantes SOUI, garantindo consistência visual e eliminação de cintilação durante operações de redimensionamento.