MSDN - "WM_NCHITTEST" - "HTSYSMENU: In a window menu or in a Close button in a child window."
Can somebody give the example of a child window with Close button in HTSYSMENU area?
An MDI child window is the only thing I can think of.
Related
I have an app with a popover that appears on a status bar item. The thing is, when you click on the icon while you're in a full screen app, then move the mouse away from the menu bar to click on something in the popup, the menu bar moves up, and so does the popup. It's annoying.
Anyone know of any way to solve this? I've tried attaching an invisible menu to the popup, but I can't get the menu to be invisible.
Screenshot for clarity, the annoying part is where I wave my mouse around:
The popover window is moving because its parent window is the status item window, and when the parent window moves, the child moves with it. (Before I investigated this, I didn't even know Cocoa had parent and child windows.) I solved the problem with this code immediately after showing the popover:
NSWindow *popoverWindow = self.popup.contentViewController.view.window;
[popoverWindow.parentWindow removeChildWindow:popoverWindow];
Now, the menu bar still moves up, but at least the popup stays in the same place.
Either use Carbon events or watch for things happening to the menu bar (window of type NSStatusBarWindow):
Notifications of type
NSWindowDidChangeOcclusionStateNotification
NSWindowDidMoveNotification
NSWindowWillCloseNotification
NSWindowDidCloseNotification
with an object of class NSStatusBarWindow should give you enough information about the menu bar showing or hiding to add proper handling.
Super-hacky approach:
Custom window with some super-high window level to make it appear over the menu bar, then add a transparent custom view to the new window that catches and handles/blocks mouse clicks according to your needs.
Or:
Get the window instance the popover is using to display and track/handle NSWindowWillMoveNotification / NSWindowDidMoveNotification.
I converted #tbodt's answer to Swift 4 and confirmed that is resolves this issue:
let popoverWindow = popup.contentViewController.view.window as? NSWindow
popoverWindow?.parent?.removeChildWindow(popoverWindow!)
You usually only have one button that looks like a "default button".
However, I made a child window and placed two buttons in it (with the child window as their parent). Then I put the child window inside a dialog and displayed it.
Suddenly, the buttons stay highlighted even when I click other buttons!
Why?
Your child window needs the WS_EX_CONTROLPARENT style, to allow the dialog to handle the notifications from its children.
I have an NS panel that is the child of an NS Window; the panel is set to floating window level. The parent window has an NSView that is in full screen mode, so the NSPanel, is floating on top of the full screened NSView. Anytime I click the panel, it brings the parent window into floating mode as well, such that it renders on top of the movie. Is there any way for me to prevent this?
Whenever you enter fullscreen mode, why don't you just remove the panel as a child window? It should still be displayed and function, but then it won't bring the other window forward. Then when you exit fullscreen mode, add it back as a child window.
in windows, how can make a 'child' window beyond the parent window, and the parent window always in active status (GetActiveWindow() return parent), just like the combobox dropdown window.
I think these are the main points when trying to do this:
The pop-up is a top-level window which has the same parent as the control. (i.e. The pop-up is not a child of the control. It's not a child-window at all; it's a top-level window, but one without a thick window border etc. so it doesn't look like a normal top-level window.) That's why it can extend outside of the control's boundaries.
When the pop-up is created it is shown using ShowWindow(hWndPopup, SW_SHOWNA) so that it does not take the input focus. This prevents the parent window from going inactive.
When the pop-up is created you capture the mouse using SetCapture. You then track where the mouse is and highlight items within the pop-up when the mouse overlaps them. When the mouse button is clicked you act on whatever is under the mouse (or cancel the pop-up if the mouse isn't over it at all). Remember to respond to WM_CAPTURECHANGED, in case something else captures the mouse. And remember to ReleaseCapture when you are done.
The popup should handle WM_MOUSEACTIVATE by returning MA_NOACTIVATEANDEAT.
Is it possible to remove the close window decoration from an mdi document taskbar flyout window? That is, remove the red "x" to prevent the user from closing the document via the taskbar.
Try this in your window:
CMenu* pSysMenu = this->GetSystemMenu(FALSE);
pSysMenu->RemoveMenu(SC_CLOSE,MF_BYCOMMMAND);