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

Posted on 2000-03-09
Last Modified: 2010-04-04
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.

Question by:chrisyap
  • 3
  • 3

Expert Comment

ID: 2603287
it is Delphi Forum. sorry I can't answer now before I study CB.
LVL 17

Expert Comment

ID: 2603368
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
LVL 17

Expert Comment

ID: 2603372
sorry it puts a tedit on the taskbar not a tbutton,but shouldnt matter both should work similar.
Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center


Author Comment

ID: 2603752
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?


Author Comment

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

LVL 17

Accepted Solution

inthe earned 200 total points
ID: 2605881

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

Author Comment

ID: 2610619
Thanks Barry. Will try it out!


Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question