C++Builder: How to dynamically create a control using (HWND ParentWindow) constructor?

The documentation says that the ParentWindow constructor is used when the control, say a TButton, is parented by a non-VCL window.

What I really wanna do is to put a TButton on a MS Visuall C++ CDialog.
But even when I try to dynamically create a TButton on my TForm within C++Builder using (HWD ParentWindow), I cannot get the button to show.

I know that normally we have to set the parent for the control for it to show. But when using ParentWindow, what do I need to do?

Thanks for a quick answer.

Who is Participating?
intheConnect With a Mentor Commented:

to find window class names you can use several differen utilities:
spy++ from microsoft (comes with some of there apps(ms visual c++ etc)
you can create your own program to do it in vb:

you can use winsight32 that comes with some versions of delphi & c++ builder.
or you can use sinfo :
(sinfo is very useful utility that i really recommend)

to use findwindow there are a few ways.
{note im not sure off hand but nil may be null in c++ builder}
if you know theclassname of window:
if you know the caption of the window:
if you know both :

this is not so good because notepads main classname is the same as the program name(this is unusual) anyway here an example:
h : hwnd;
h := findwindow('notepad','notepad - untitled document');

note if you want to get to the text control inside notepad this is second window level down so you start using findwindowex() passing like:
h : hwnd;
h := findwindow('notepad',nil);
h := findwindowex(h,0,'edit',nil);

('edit' is class name of the text control of notepad again a bad example not to be confused with TEdit ,i guess you understand ;-)
we passed the parent hwnd first,next param is always 0 (in delphi so you have to test that in c++)but then the class name were after and you could also pass last param as window caption if one exists but usualy not on child windows so again an nil/null is passed

if the window your after is 4-5 levels down you can keep using the findwindowex until proper window is found.
here is from win32.hlp:

HWND FindWindowEx(

    HWND hwndParent,      // handle to parent window
    HWND hwndChildAfter,      // handle to a child window
    LPCTSTR lpszClass,      // pointer to class name
    LPCTSTR lpszWindow      // pointer to window name



Identifies the parent window whose child windows are to be searched.
If hwndParent is NULL, the function uses the desktop window as the parent window. The function searches among windows that are child windows of the desktop.


Identifies a child window. The search begins with the next child window in the Z order. hwndChildAfter must be a direct child window of hwndParent, not just a descendant window.
If hwndChildAfter is NULL, the search begins with the first child window of hwndParent.
Note that if both hwndParent and hwndChildAfter are NULL, the function searches all top-level windows.


Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpszClass; the high-order word must be zero.


Points to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.


Return Values

If the function succeeds, the return value is the handle to the window that has the specified class and window names.

well hope that explained ok,
ignore if its a bit erratic in places.
if you download sinfo it will help you understand the class name stuff better as it adds every windows class name to a tree view and when a window is selected via mouse it gives you the details etc..

Regards Barry
it is Delphi Forum. sorry I can't answer now before I study CB.
it might be just the order in which events are done,look at this delphi example:
it will be easy enough to change to c++ builder,it puts a tbutton on the taskbar (by the clock).
so as long as you know correct hwnd of this dialog you should be able to do it.

procedure TForm1.FormCreate(Sender: TObject);
var h,hc : HWND;
h := FindWindow('Shell_TrayWnd',nil);
hc := FindWindowEx(h,0,'TrayNotifyWnd',nil);
cc := TEdit.Create(nil);
cc.Width := 60;
cc.Height := 30;
cc.Ctl3D := true;
cc.Visible := true;
cc.ParentWindow := hc;
cc.OnClick := myClick;

procedure tform1.myClick(Sender : tobject);

Regards Barry
Cloud Class® Course: Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

sorry it puts a tedit on the taskbar not a tbutton,but shouldnt matter both should work similar.
chrisyapAuthor Commented:
Thanks, Barry.
At least now I know that I'm on the right path.

One more thing:
How the heck do you use FindWindow?
Where can we find class names like 'Shell_TrayWnd'?
What class name should I use if I wanna find my form or my CDialog?

chrisyapAuthor Commented:
sorry, Barry. Didn't mean to reject your answer like that. Now only if you could answer me again....apologies.

chrisyapAuthor Commented:
Thanks Barry. Will try it out!

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.