views:

89

answers:

1

I'm writing a custom TreeView from ScrollableControl. I decided to show tooltips when the mouse hovers over nodes with text too long to display.

I find that when tooltips are shown, the user is not able to click the node to select it because (I think) he's clicking the tooltip window, not my control.

Is there any easy solutions? As far I can see, System.Windows.Forms.TreeView don't have this problem. Thanks!

A: 

You need to override WndProc in your tooltip form and return HT_TRANSPARENT in response to the WM_NCHITTEST message.

For example:

protected override void DefWndProc(ref Message m) {
    switch (m.Msg) {
        case 0x84://WM_NCHITTTEST
            m.Result = new IntPtr(-1);  //HT_TRANSPARENT
            return;
    }
    base.DefWndProc(ref m);
}

This will make Windows believe that your from is invisible to the mouse, causing any mouse events to be passed to the window underneath it. (But only if both windows are from the same process)

SLaks
I'm using System.Windows.Forms.Tooltip class to show tooltip, seems I can't override wndproc of the tooltip window.
deerchao
I managed to use my own form as tooltip windows. Your answer, and http://stackoverflow.com/questions/156046/show-a-form-without-stealing-focus-in-c helped a lot.
deerchao
If you use the `Tooltip` class, you shouldn't have this issue at all.
SLaks
I've tried that before walking to the hard way, but Tooltip class has its own issues.
deerchao