|
I've had a similar problem in the past.
I used the following article to solve it:
http://secure.codeproject.com/KB/cpp/enumleafclasses.aspx[^]
I created a common ancester for the dialogs
class CMyDialog : public CDialog
{
...
DECLARE_ROOT_CLASS (CMyDialog);
...
};
and then a bunch of inheriting dialogs:
class CMyDialog1 : public CMyDialog
{
...
DECLARE_LEAF_CLASS (CMyDialog);
...
}
Then I could add new child classes to my hearts content - and loop through and create them.
int n, nCount = CMyDialog::GetRegisteredManufacturingPlantCount ();
CBootStrapper<cmydialog> *pBS;
CMyDialog *pSub;
for (n = 0; n < nCount; n++)
{
pBS = CMyDialog::GetRegisteredManufacturingPlant (n);
pSub = pBS->CreateObject ();
....
}
</cmydialog>
You'll need to read the article for fine detail, but I've used the concept a few times, and it worked nicely for me.
I hope that helps,
Iain.
|
|
|
|
|
Thank you.
It is a good solution.
Yes it could help me to some extent in my code.
Because the dialogs are already being implemented.
And i cannot change them from my side.
I can only create the dialogs.
As i discussed in earlier post that i was searching for some different technique instead of using if-else/switch for new operator.
But as part of education/knowledge the technique used is mind blowing.
Thanks & Regards,
K. Sushilkumar.
|
|
|
|
|
If the dialogs are already implemented somewhere else, and out of your control, then the article I pointed you at is of little use.
I don;t think you have any alternative to brute force sadly. You can make it more or less elegant, but at some point you are going to have to match option with dialog...
Maybe populate a map between option DWORD, and CDialog *? then you can iterate a biiiiit.
Iain.
|
|
|
|
|
You need to implement a class factory.
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Hello,
I'm writting a C++ DLL Hook to read any message to any program, so I'm using
SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, handleInstance, 0);
Then, in my CallWndProc, I need to filter the data coming so I can read the messages from the window I want, but it's not working as expected. During my tests, I wanted to read the messages from the HWND 0x00020afa, so if I put in the CallWndProc:
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
return CallNextHookEx(handleHook, nCode, wParam, lParam);
CWPSTRUCT* cwpstruct = (CWPSTRUCT*)lParam;
if((HWND)0x00020afa == cwpstruct->hwnd)
{
MessageBox(NULL, "TEST","LOL",MB_OK);
}
return CallNextHookEx(handleHook, nCode, wParam, lParam);
}
I would get the message boxes popping like crazy, but then I decided to add a global HWND to my dll:
HWND hWindow;
And then a stupid function to set it:
VOID __stdcall HookHwnd(HWND hWnd)
{
hWindow = hWnd;
}
So I can choose which HWND i want to track with
if(hWindow == cwpstruct->hwnd) instead of if((HWND)0x00020afa == cwpstruct->hwnd)
... But it doesn't work. Am I doing something wrong here? I'm new to the dll world. Also, is this the correct way to read the messages from a window?
Thanks!
|
|
|
|
|
Hi Tony_P
Whenever you install a hook, the DLL gets injected into the process' memory. So, each process will have all together different global variable 'hWindow'. To avoid this you'll have to use the concept of data sharing among the DLLs/Process. Following links may help you.
Data Sharing Among DLL/Process[^]
Hooking Sample[^]
- Malli...!
|
|
|
|
|
Even if each process has a different hWindow, wouldn't the function "HookHwnd" I created set every hWindow to the same value?
Anyway, thank you for the links, I'm going to try this
|
|
|
|
|
Tony_P wrote: wouldn't the function "HookHwnd" I created set every hWindow to the same value
You could actually make it work this way. You use the RegisterWindowMessage Function[^] to create a unique window message and broadcast it using HWND_BROADCAST[^]. Just make sure that your window message is unique and its not in the WM_USER range so it will not conflict with custom window messages used internally in other applications. RegisterWindowMessage will return something in the range of MAXINTATOM-MAXWORD so you should be safe.
In your DLL you could handle this custom message and set the local variable to a target window handle. And since you have both WPARAM and LPARAM this means you could target both PID and window handle. Essentially instructing the DLL "Process with PID x please monitor window n".
This is a sort of hackish way of doing it in my opinion, the shared-data segment in my earlier post would probably be a better choice. You could instruct each DLL there also using a similar technique. The great thing about engineering software is there is always many paths to reach the goal.
Best Wishes,
-David Delaune
|
|
|
|
|
Wow! Thank you for sharing all this valuable information to me. Now back on Visual C++ :p
|
|
|
|
|
Tony_P wrote: Am I doing something wrong here?
Yes. Think of it this way... your DLL is being mapped into multiple applications each of which is executing inside its own Virtual Address Space[^]. This essentially means that each copy of the DLL has a different value for your global variable named hWindow.
You need to implement a shared data section:
How To Share Data Between Different Mappings of a DLL[^]
This will allow all applications to read from the shared data section.
Best Wishes,
-David Delaune
|
|
|
|
|
Well it seems like this shared memory is the solution. I'm going to try it. Thank you!
|
|
|
|
|
Hi,
In FAT file system I can access "System Volume Information" folder but in NTFS I can't.
How can I access it?
|
|
|
|
|
By ensuring that the user trying to access the folder has appropriate permissions.
Right-click the folder then sort out the user access permissions from the Sharing/Security context menu item. Pick the Security tab, then ensure the user belongs to one of the groups that has access, or create a new group that has access and add the user to it.
|
|
|
|
|
I want to do this programtically
|
|
|
|
|
Hello,
I am having the following routine which handles my menu options and directs them to the appropriate functions.Now if I want to divert these functions through keyboard handlers that ALT F,ALT D etc.
How should I go about?
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
if(HIWORD(wParam) == 0)
{
switch(LOWORD(wParam)) //LOWORD of wParam identifies the control
{
//ids from menu options
case MENUINVENTORY :
{OnInventory();break;}
case MENUJOB :
{OnJob();break;}
case MENUCAPCONTRACT :
{OnCapContract();break;}
}
}
Thanks,
Prithaa
|
|
|
|
|
I hope, the only thing you've to do is provide keyboard accelerator to your menu option. To provide keyboard accelerator use '&' character before the alphabet you like to use in combination with 'Alt' key. E.g if you've the menu with caption "Help", to provide 'Alt H' combination, set the caption as "&Help". The 'Alt H' combination will accelerate the menu select option, and you need not to worry about the routine handlers.
- Malli...!
|
|
|
|
|
Hi All
How can set the satic text size?I want to set the static text which is written by ne.Plz help me
|
|
|
|
|
You can use of CreateFont and after make your font you can use of SetFont.(you need change id of staticfont).
|
|
|
|
|
can you give me some line of example.
|
|
|
|
|
CFont m2;
m2.CreateFontA(20,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,_T("System"));
GetDlgItem(IDC_STATIC2)->SetFont(&m2);
|
|
|
|
|
|
|
one little problem it's showing char highlited and i want show in nornal font.
|
|
|
|
|
NewVC++ wrote: one little problem it's showing char highlited and i want show in nornal font.
Not sure what you mean but if your looking for the default dialog font it can be obtained by changing the font face to: _T("MS Shell Dlg 2") which is a Logical Font[^] that maps to default font used throughout the operating system on Windows 2000 and later.
Best Wishes,
-David Delaune
|
|
|
|
|
Can you more explain what is highlited ?
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|