No XCode, a adição desses métodos à sua subclasse NSView pode impedir que a janela se torne ativa ao clicar nela:
- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent {
return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent )theEvent {
return YES;
}
- (void)mouseDown:(NSEvent )theEvent {
[[[NSApp]] preventWindowOrdering];
}
Na plataforma Windows, é feito com este código simples:
HWND hWnd = FindWindowW((String("FM") + fmxForm->ClassName()).c_str(),
fmxForm->Caption.c_str());
SetWindowLong(hWnd, GWL_EXSTYLE,
GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
Como posso subclassificar o NSView para impedir que meu FMX TForm se torne ativo ao clicar nele?
Como posso criar o formulário " No Activate " no firemonkey ?
macos
delphi
delphi-xe2
c++builder
firemonkey
mh taqia
fonte
fonte
Respostas:
É possível usar o NSPanel com o sinalizador NSNonactivatingPanelMask . O formulário NSView do fmx deve se tornar filho do NSPanel. Eu escrevi uma classe auxiliar que funciona para as plataformas Windows e Mac ( Works on XE4 ):
Uso da unidade acima:
Se frmKeyboard for seu formulário principal, não coloque o código acima no construtor de formulários, é recomendável colocá-lo no OnShow.
Nota : WindowHandleToPlatform parece não existir no XE3, para que a linha possa ser substituída por
fonte
Você pode desativar a manipulação do mouse de formulários para impedir que ele seja focado. Supondo que seu formulário seja chamado myform:
Há um pequeno problema, pois ele não para com o botão direito do mouse. Se isso for um problema, você terá que responder ao evento de redução do mouse no formulário e chamar os principais formulários de redução do mouse para que não perca o evento do mouse. Como o botão direito do mouse para baixo capturará os eventos do mouse, você também precisará responder aos eventos de movimentação e movimentação do mouse também - encaminhando-os para o formulário principal. Embora capture o mouse com o botão direito, ele ainda não focalizará o formulário.
Dave Peters Software de DP
fonte