Hi all,

I'm struggling with something I thought would be simple. I
need to build a combo box from scratch as I need to do
more alterations than an owner draw combo box will allow.
I was always told a combo box was just a textbox and a
listbox. Well, that's fine but the listbox is bound by the
clipping region of the form. Thus if the combo is
positioned near the bottom of the form, the listbox gets
chopped off.

I've tried creating a form for the listbox to sit on, and
then move both to the relevant location. This is still
buggy though as when you click in the listbox, the host
form loses focus - and I also suspect creating a whole
form just for this feature is not very efficient.

There must be a way surely to do this in .NET through GDI+
or something. Essentially all I want is to fool .NET into
drawing the listbox where I specify on the screen, without
being bound by a forms drawing area.

Any ideas?

Thanks,

Andrew Cuthbert

Re: Building a combo box - can't get listbox to draw outside the form by Ulrich

Ulrich
Wed Sep 10 11:49:14 CDT 2003

Hi Andrew,

why not make the form a bit larger at the bottom? Perhaps at runtime if the listbox dropps down? Or move the combobox a bit up?

I am writing the glue logic to make a combo from a textbox, a button and listbox for use in a datagrid column to avoid exactly this
problem. Not easy, I can say... I expect it to be done during the next week, you may have a look at

http://www.i-syn.gmxhome.de/devcom/colstyles/intro.htm

then.
Ulrich


"Andrew Cuthbert" <acuthbert@gcdtech.com> schrieb im Newsbeitrag news:5fba01c37776$91d6b700$a501280a@phx.gbl...
> Hi all,
>
> I'm struggling with something I thought would be simple. I
> need to build a combo box from scratch as I need to do
> more alterations than an owner draw combo box will allow.
> I was always told a combo box was just a textbox and a
> listbox. Well, that's fine but the listbox is bound by the
> clipping region of the form. Thus if the combo is
> positioned near the bottom of the form, the listbox gets
> chopped off.
>
> I've tried creating a form for the listbox to sit on, and
> then move both to the relevant location. This is still
> buggy though as when you click in the listbox, the host
> form loses focus - and I also suspect creating a whole
> form just for this feature is not very efficient.
>
> There must be a way surely to do this in .NET through GDI+
> or something. Essentially all I want is to fool .NET into
> drawing the listbox where I specify on the screen, without
> being bound by a forms drawing area.
>
> Any ideas?
>
> Thanks,
>
> Andrew Cuthbert



Re: Building a combo box - can't get listbox to draw outside the form by Andrew

Andrew
Wed Sep 10 12:15:59 CDT 2003

Ulrich,

thanks for the reply. I've taken a look at your code on the site, and I
think you've taken a very different approach. You are inheriting from
Forms.ComboxBox which will handle the display of the listbox for you. What I
want is to draw the listbox above everything, not only in my
application/form but outside the form. If you put a combo box at the bottom
of a form and open the drop down - you will notice the list pops out over
the edge of the form. It is this behaviour I'm trying to reproduce but for
various reasons I can't inherit from combobox - not least because it'll
really bug me if a Microsoft .NET component can do things I can't in my
components!!

Thanks for your help - any futher thoughts?

Andrew

"Ulrich Sprick" <nospam.ulrich.sprick@gmx.de> wrote in message
news:Obzb5t7dDHA.2312@TK2MSFTNGP12.phx.gbl...
> Hi Andrew,
>
> why not make the form a bit larger at the bottom? Perhaps at runtime if
the listbox dropps down? Or move the combobox a bit up?
>
> I am writing the glue logic to make a combo from a textbox, a button and
listbox for use in a datagrid column to avoid exactly this
> problem. Not easy, I can say... I expect it to be done during the next
week, you may have a look at
>
> http://www.i-syn.gmxhome.de/devcom/colstyles/intro.htm
>
> then.
> Ulrich
>
>
> "Andrew Cuthbert" <acuthbert@gcdtech.com> schrieb im Newsbeitrag
news:5fba01c37776$91d6b700$a501280a@phx.gbl...
> > Hi all,
> >
> > I'm struggling with something I thought would be simple. I
> > need to build a combo box from scratch as I need to do
> > more alterations than an owner draw combo box will allow.
> > I was always told a combo box was just a textbox and a
> > listbox. Well, that's fine but the listbox is bound by the
> > clipping region of the form. Thus if the combo is
> > positioned near the bottom of the form, the listbox gets
> > chopped off.
> >
> > I've tried creating a form for the listbox to sit on, and
> > then move both to the relevant location. This is still
> > buggy though as when you click in the listbox, the host
> > form loses focus - and I also suspect creating a whole
> > form just for this feature is not very efficient.
> >
> > There must be a way surely to do this in .NET through GDI+
> > or something. Essentially all I want is to fool .NET into
> > drawing the listbox where I specify on the screen, without
> > being bound by a forms drawing area.
> >
> > Any ideas?
> >
> > Thanks,
> >
> > Andrew Cuthbert
>
>



Re: Building a combo box - can't get listbox to draw outside the by Joe

Joe
Thu Sep 11 00:46:01 CDT 2003

Put your listbox onto a separate Form with FormBorderStyle.None and
TopMost=true, and position it so its top-left corner (in screen
coordinates) is the same as the bottom-left corner of the combo box.
That's essentially the way the standard ComboBox control works.


Andrew Cuthbert wrote:
> Ulrich,
>
> thanks for the reply. I've taken a look at your code on the site, and I
> think you've taken a very different approach. You are inheriting from
> Forms.ComboxBox which will handle the display of the listbox for you. What I
> want is to draw the listbox above everything, not only in my
> application/form but outside the form. If you put a combo box at the bottom
> of a form and open the drop down - you will notice the list pops out over
> the edge of the form. It is this behaviour I'm trying to reproduce but for
> various reasons I can't inherit from combobox - not least because it'll
> really bug me if a Microsoft .NET component can do things I can't in my
> components!!
>
> Thanks for your help - any futher thoughts?
>
> Andrew
>
> "Ulrich Sprick" <nospam.ulrich.sprick@gmx.de> wrote in message
> news:Obzb5t7dDHA.2312@TK2MSFTNGP12.phx.gbl...
>
>>Hi Andrew,
>>
>>why not make the form a bit larger at the bottom? Perhaps at runtime if
>
> the listbox dropps down? Or move the combobox a bit up?
>
>>I am writing the glue logic to make a combo from a textbox, a button and
>
> listbox for use in a datagrid column to avoid exactly this
>
>>problem. Not easy, I can say... I expect it to be done during the next
>
> week, you may have a look at
>
>> http://www.i-syn.gmxhome.de/devcom/colstyles/intro.htm
>>
>>then.
>>Ulrich
>>
>>
>>"Andrew Cuthbert" <acuthbert@gcdtech.com> schrieb im Newsbeitrag
>
> news:5fba01c37776$91d6b700$a501280a@phx.gbl...
>
>>>Hi all,
>>>
>>>I'm struggling with something I thought would be simple. I
>>>need to build a combo box from scratch as I need to do
>>>more alterations than an owner draw combo box will allow.
>>>I was always told a combo box was just a textbox and a
>>>listbox. Well, that's fine but the listbox is bound by the
>>>clipping region of the form. Thus if the combo is
>>>positioned near the bottom of the form, the listbox gets
>>>chopped off.
>>>
>>>I've tried creating a form for the listbox to sit on, and
>>>then move both to the relevant location. This is still
>>>buggy though as when you click in the listbox, the host
>>>form loses focus - and I also suspect creating a whole
>>>form just for this feature is not very efficient.
>>>
>>>There must be a way surely to do this in .NET through GDI+
>>>or something. Essentially all I want is to fool .NET into
>>>drawing the listbox where I specify on the screen, without
>>>being bound by a forms drawing area.
>>>
>>>Any ideas?
>>>
>>>Thanks,
>>>
>>>Andrew Cuthbert


Re: Building a combo box - can't get listbox to draw outside the form by Ulrich

Ulrich
Thu Sep 11 05:49:51 CDT 2003

Hey Joe,

this is a very interesting idea. I'll give that a try!

Thanks,
Ulrich

"Joe White" <ip255@hotmail.com> schrieb im Newsbeitrag news:3F600C19.7080806@hotmail.com...
> Put your listbox onto a separate Form with FormBorderStyle.None and
> TopMost=true, and position it so its top-left corner (in screen
> coordinates) is the same as the bottom-left corner of the combo box.
> That's essentially the way the standard ComboBox control works.
>
>
> Andrew Cuthbert wrote:
> > Ulrich,
> >
> > thanks for the reply. I've taken a look at your code on the site, and I
> > think you've taken a very different approach. You are inheriting from
> > Forms.ComboxBox which will handle the display of the listbox for you. What I
> > want is to draw the listbox above everything, not only in my
> > application/form but outside the form. If you put a combo box at the bottom
> > of a form and open the drop down - you will notice the list pops out over
> > the edge of the form. It is this behaviour I'm trying to reproduce but for
> > various reasons I can't inherit from combobox - not least because it'll
> > really bug me if a Microsoft .NET component can do things I can't in my
> > components!!
> >
> > Thanks for your help - any futher thoughts?
> >
> > Andrew
> >
> > "Ulrich Sprick" <nospam.ulrich.sprick@gmx.de> wrote in message
> > news:Obzb5t7dDHA.2312@TK2MSFTNGP12.phx.gbl...
> >
> >>Hi Andrew,
> >>
> >>why not make the form a bit larger at the bottom? Perhaps at runtime if
> >
> > the listbox dropps down? Or move the combobox a bit up?
> >
> >>I am writing the glue logic to make a combo from a textbox, a button and
> >
> > listbox for use in a datagrid column to avoid exactly this
> >
> >>problem. Not easy, I can say... I expect it to be done during the next
> >
> > week, you may have a look at
> >
> >> http://www.i-syn.gmxhome.de/devcom/colstyles/intro.htm
> >>
> >>then.
> >>Ulrich
> >>
> >>
> >>"Andrew Cuthbert" <acuthbert@gcdtech.com> schrieb im Newsbeitrag
> >
> > news:5fba01c37776$91d6b700$a501280a@phx.gbl...
> >
> >>>Hi all,
> >>>
> >>>I'm struggling with something I thought would be simple. I
> >>>need to build a combo box from scratch as I need to do
> >>>more alterations than an owner draw combo box will allow.
> >>>I was always told a combo box was just a textbox and a
> >>>listbox. Well, that's fine but the listbox is bound by the
> >>>clipping region of the form. Thus if the combo is
> >>>positioned near the bottom of the form, the listbox gets
> >>>chopped off.
> >>>
> >>>I've tried creating a form for the listbox to sit on, and
> >>>then move both to the relevant location. This is still
> >>>buggy though as when you click in the listbox, the host
> >>>form loses focus - and I also suspect creating a whole
> >>>form just for this feature is not very efficient.
> >>>
> >>>There must be a way surely to do this in .NET through GDI+
> >>>or something. Essentially all I want is to fool .NET into
> >>>drawing the listbox where I specify on the screen, without
> >>>being bound by a forms drawing area.
> >>>
> >>>Any ideas?
> >>>
> >>>Thanks,
> >>>
> >>>Andrew Cuthbert
>



Building a combo box - can't get listbox to draw outside the form by Iulian

Iulian
Thu Sep 11 09:25:37 CDT 2003

Hi, I also needed for various reasons to create controls
that draw outside the form, like a tool tip or something.
So I figured that the only way is to create an inherited
form which I called FloatingWin and don't provide any
painting in it. Than a listbox like the one you want to
draw can basically be derived from here. One trick to
make sure that the parent form doesn't loose focus is to
override the OnActivate for the floating window and there
set the focus back on the main form, after you do some
processing...
This is the constructor for the floating window:

public FloatingWin(Form owner) : base()
{
this.windowHeight = 0;
this.windowWidth = 0;
this.ownerTop = false; (*)
base.Visible = false;
base.ShowInTaskbar = false;
base.StartPosition = 0;
base.FormBorderStyle = FormBorderStyle.None;
base.Owner = owner;
if (owner != null)
{
this.ownerTop = owner.TopMost;
}
}

You can see that this form is always owned by another
form and I also need to keep track if the owner form is
on top (*), because if the owner form goes under you
should make the floating windows that belong to it
invisible too...


I hope this helps,

Iulian

>-----Original Message-----
>Hi all,
>
>I'm struggling with something I thought would be simple.
I
>need to build a combo box from scratch as I need to do
>more alterations than an owner draw combo box will
allow.
>I was always told a combo box was just a textbox and a
>listbox. Well, that's fine but the listbox is bound by
the
>clipping region of the form. Thus if the combo is
>positioned near the bottom of the form, the listbox gets
>chopped off.
>
>I've tried creating a form for the listbox to sit on,
and
>then move both to the relevant location. This is still
>buggy though as when you click in the listbox, the host
>form loses focus - and I also suspect creating a whole
>form just for this feature is not very efficient.
>
>There must be a way surely to do this in .NET through
GDI+
>or something. Essentially all I want is to fool .NET
into
>drawing the listbox where I specify on the screen,
without
>being bound by a forms drawing area.
>
>Any ideas?
>
>Thanks,
>
>Andrew Cuthbert
>.
>

Re: Building a combo box - can't get listbox to draw outside the form by Ulrich

Ulrich
Fri Sep 12 04:56:16 CDT 2003

> I hope this helps,

Very!
Thanks, Ulli

"Iulian Ionescu" <iulian.ionescu@world-link.net> schrieb im Newsbeitrag news:17e201c37870$920e5930$a601280a@phx.gbl...
> Hi, I also needed for various reasons to create controls
> that draw outside the form, like a tool tip or something.
> So I figured that the only way is to create an inherited
> form which I called FloatingWin and don't provide any
> painting in it. Than a listbox like the one you want to
> draw can basically be derived from here. One trick to
> make sure that the parent form doesn't loose focus is to
> override the OnActivate for the floating window and there
> set the focus back on the main form, after you do some
> processing...
> This is the constructor for the floating window:
>
> public FloatingWin(Form owner) : base()
> {
> this.windowHeight = 0;
> this.windowWidth = 0;
> this.ownerTop = false; (*)
> base.Visible = false;
> base.ShowInTaskbar = false;
> base.StartPosition = 0;
> base.FormBorderStyle = FormBorderStyle.None;
> base.Owner = owner;
> if (owner != null)
> {
> this.ownerTop = owner.TopMost;
> }
> }
>
> You can see that this form is always owned by another
> form and I also need to keep track if the owner form is
> on top (*), because if the owner form goes under you
> should make the floating windows that belong to it
> invisible too...
>
>
> I hope this helps,
>
> Iulian
>




Re: Building a combo box - can't get listbox to draw outside the form by Kevin

Kevin
Sat Sep 13 09:38:28 CDT 2003

"Andrew Cuthbert" <acuthbert@gcdtech.com> wrote in message
news:5fba01c37776$91d6b700$a501280a@phx.gbl...
> I'm struggling with something I thought would be simple. I
> need to build a combo box from scratch as I need to do
> more alterations than an owner draw combo box will allow.
> I was always told a combo box was just a textbox and a
> listbox. Well, that's fine but the listbox is bound by the
> clipping region of the form. Thus if the combo is
> positioned near the bottom of the form, the listbox gets
> chopped off.


The ListBox needs to be a child of the desktop rather then the Form. To see
this, create a new Windows Forms application, add a ListBox (set Visible to
False and BorderStyle to FixedSingle), place a Button in the bottom right
and add the following code:

Private Declare Auto Function SetParent Lib "user32.dll" _
(childHwnd As IntPtr, parentHwnd As IntPtr) As IntPtr

Private m_lst As DropDownListBox

Private Sub Button1_Click(sender As Object, e As EventArgs) _
Handles Button1.Click

If m_lst Is Nothing Then
m_lst = New DropDownListBox()
m_lst.BorderStyle = BorderStyle.FixedSingle
m_lst.Location = _
PointToScreen( _
New Point(Button1.Left, Button1.Top + Button1.Height))
SetParent(m_lst.Handle, IntPtr.Zero)
m_lst.Visible = True
Else
m_lst.Visible = False
m_lst.Dispose()
m_lst = Nothing
End If

End Sub

Private Class DropDownListBox
Inherits ListBox

Public Sub New()
MyBase.New()
End Sub

Protected Overrides ReadOnly Property CreateParams() As CreateParams

Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H80 ' WS_EX_TOOLWINDOW
Return cp
End Get

End Property

End Class

Ideally the code for setting the parent should be done in the
DropDownListBox class, however for some reason setting CreateParams.Parent
to IntPtr.Zero doesn't achieve the desired result so some further
investigation will be required.

--
Kevin Westhead



Re: Building a combo box - can't get listbox to draw outside the form by Kevin

Kevin
Sat Sep 13 09:56:59 CDT 2003

[snip]

> The ListBox needs to be a child of the desktop rather then the Form. To
see
> this, create a new Windows Forms application, add a ListBox (set Visible
to
> False and BorderStyle to FixedSingle), place a Button in the bottom right

[snip]

I should clarify that you don't need to add a ListBox to the From; just use
the DroppedDownListBox in code as shown. If you call SetParent on a regular
ListBox then Windows will create a TaskBar entry for it since any unowned
windows (i.e. immediate children of the desktop) automatically get a TaskBar
entry unless WS_EX_TOOLWINDOW is specified.

--
Kevin Westhead