Dialog-Fenster beim Draufklicken in den Vordergrund

So, ich hab es. Drecks-MFC. Rumfluch.

Fenster verhalten sich so wie gehabt, wenn sie einen Owner haben. Der Owner kann nur beim Erstellen eines Fensters angegeben, danach aber nicht mehr geändert werden.

MFC nimmt natürlich Rücksicht auf Blödbatze und setzt bei NULL als Parent IMMER sein TopLevelWindow (in deinem Fall der HauptDialog) ein. Vielen Dank auch. Hat mich nur 2 Stunden gekostet.

Einfachste Abhilfe, eine eigene Dialog-Create erstellen, die den Owner auf NULL setzt. Diverse MFC-Verschachtelungen entfernt sieht das dann so aus:

Code:
BOOL CMeinLogShow::CreateSpezial( DWORD dwID )
{

  HINSTANCE hInst = AfxFindResourceHandle( MAKEINTRESOURCE( dwID ), RT_DIALOG );

  HRSRC hResource = ::FindResource( AfxGetInstanceHandle(), MAKEINTRESOURCE( dwID ), RT_DIALOG );
  HGLOBAL hTemplate = LoadResource( AfxGetInstanceHandle(), hResource );


  LPCDLGTEMPLATE lpDialogTemplate = (LPCDLGTEMPLATE)LockResource( hTemplate );

  BOOL bResult = CreateDlgIndirect( lpDialogTemplate, NULL, AfxGetInstanceHandle() );

  UnlockResource( hTemplate );
  FreeResource(hTemplate);

  return bResult;

}

Statt CDialog->Create heisst es dann halt CDialog->CreateSpezial. Benenn es ruhig um.

Nachteil: Die Methode muss ein Member des jeweiligen Dialoges sein, weil es auf CDialog:: -Basisfunktionen zugreift. Evtl. könnte man hier ja eine generelle Dialog-der-auch-hinter-dem-Hauptdialog-liegen-kann-Klasse machen von der man dann einzelne Dialoge ableitet.

Viel Spass! :)


[edit:böses MFC, böses MS, da waren Tabs drin]
 
Zuletzt bearbeitet:
Millionenfachen Dank, das ist wirklich großartig!
Danke, danke, danke! Und da wär ich vor allem niemals jemals ;) drauf gekommen, echt danke schön!
:)

Grüßle
Marei
 
Zurück