Home » U++ Library support » Menus&Toolbars » Menubar rendering problem when navigating with keyboard
Menubar rendering problem when navigating with keyboard [message #16968] |
Wed, 23 July 2008 21:47 |
cas_
Messages: 20 Registered: July 2008 Location: Poland
|
Promising Member |
|
|
Hello!
I've observed a weird bug in menu bar rendering -- triggered when one navigates through the menu using keyboard arrow keys. The problem is that when you press left arrow key to open menu to the left of currently active menu, then only about a half of the menu label is correctly highlighted. This does not happen if you use mouse or right arrow key. I'm attaching a small pdf file that illustrates what I've just described (screenshots are from TheIDE, but the same applies to other menu bars, for example those in UWord).
-
Attachment: menubar.pdf
(Size: 66.32KB, Downloaded 576 times)
[Updated on: Wed, 23 July 2008 21:48] Report message to a moderator
|
|
|
Re: Menubar rendering problem when navigating with keyboard [message #17059 is a reply to message #16968] |
Sat, 26 July 2008 20:04 |
|
mirek
Messages: 13975 Registered: November 2005
|
Ultimate Member |
|
|
Thanks, fixed.
Quick fix:
bool MenuBar::Key(dword key, int count)
{
LLOG("KEY " << GetKeyDesc(key));
bool horz = IsChild();
if((horz ? key == K_RIGHT : key == K_DOWN)) {
Ctrl *ctrl = GetFocusChildDeep();
LLOG("MenuBar::Key(" << key << ") -> IterateFocusForward for " << UPP::Name(ctrl) << ", pane " << UPP::Name(&pane));
if(HasMouseDeep())
GetMouseCtrl()->Refresh();
if(ctrl && IterateFocusForward(ctrl, &pane, false, false, true))
return true;
Ctrl *f = pane.GetFirstChild();
if(!f) return true;
if(f->IsEnabled()) {
f->SetFocus();
return true;
}
if(IterateFocusForward(pane.GetFirstChild(), &pane, false, false, true)) return true;
}
else
if((horz ? key == K_LEFT : key == K_UP)) {
Ctrl *ctrl = GetFocusChildDeep();
LLOG("MenuBar::Key(" << key << ") -> IterateFocusBackward for " << UPP::Name(ctrl) << ", pane " << UPP::Name(&pane));
if(HasMouseDeep())
GetMouseCtrl()->Refresh();
if(ctrl && IterateFocusBackward(ctrl, &pane, false, true))
return true;
Ctrl *f = pane.GetLastChild();
if(!f) return true;
if(f->IsEnabled()) {
f->SetFocus();
return true;
}
if(IterateFocusBackward(pane.GetLastChild(), &pane, false, true)) return true;
}
else
if(parentmenu && !parentmenu->IsChild() && key == K_LEFT || key == K_ESCAPE) {
if(HasMouseDeep())
GetMouseCtrl()->Refresh();
if(parentmenu && parentmenu->submenu)
parentmenu->submenuitem->SetFocus();
else
if(IsChild() && HasFocusDeep()) {
if(restorefocus)
restorefocus->SetFocus();
doeffect = true;
return true;
}
if(IsPopUp()) {
SubmenuClose();
return true;
}
doeffect = true;
}
if(parentmenu && parentmenu->IsChild() && parentmenu->GetActiveSubmenu() &&
parentmenu->pane.GetFirstChild() && parentmenu->submenuitem) {
Ctrl *smi = parentmenu->submenuitem;
Ctrl *q = smi;
q->Refresh();
if(key == K_RIGHT)
for(;;) {
q = q->GetNext();
if(!q)
q = parentmenu->pane.GetFirstChild();
if(q == smi)
break;
if(PullMenu(q)) {
q->Refresh(); // This is the fix (1/2)
SyncState();
return true;
}
}
if(key == K_LEFT)
for(;;) {
q = q->GetPrev();
if(!q)
q = parentmenu->pane.GetLastChild();
if(q == smi)
break;
if(PullMenu(q)) {
q->Refresh(); // This is the fix (2/2)
SyncState();
return true;
}
}
}
return HotKey(key);
}
Mirek
|
|
|
|
Goto Forum:
Current Time: Sat Apr 20 05:00:46 CEST 2024
Total time taken to generate the page: 0.02692 seconds
|