Wizard Dialog erst anzeigen, wenn alles geladen ist
-
Hi,
Hab noch eine Frage zum Thema Wizards: wenn ich den ersten Wizard-Dialog anzeigen lasse, dann sieht man wie dieser aufgebaut wird (Wizard-Dialog und danach der Subdialog).
Wo muss ich angreifen und vor allem wie, dass der gesamte Wizard erst dann gezeigt wird, wenn alle Bilder (Navigation next, back etc.) genauso wie der Subdialog geladen sind?
//maindialog BOOL CWizardStartDialog::OnInitDialog() { SetPlaceholderID(IDC_STAT_WIZ_DLG_FRAME); CWizardDialog::OnInitDialog(); //load navigation images myBackButton.LoadImage(IDB_PNG_BACK, _T("PNG")); return FALSE; } //subdialog BOOL CMyFirstSubDialog::OnInitDialog() { SetPlaceholderID(IDC_STAT_WIZ_DLG_FRAME); CWizardPage::OnInitDialog(); //load images etc. in dem subdialog myBtn.LoadImage(IDB_PNG_BTN_TEST, _T("PNG")); return TRUE; } BOOL CWizardPage::OnInitDialog() { CDialog::OnInitDialog(); return TRUE; } BOOL CWizardDialog::OnInitDialog() { CDialog::OnInitDialog(); ModifyStyleEx (0, WS_EX_CONTROLPARENT); // make the first page of the wizard active SetFirstPage(); return TRUE; } BOOL CWizardDialog::SetFirstPage() { CWizardPage* pPage = GetFirstPage(); if (ActivatePage(pPage)) return TRUE; return FALSE; } BOOL CWizardDialog::ActivatePage(CWizardPage* pPage) { ASSERT(m_nPlaceholderID != 0); ASSERT(pPage != NULL); ASSERT(::IsWindow(m_hWnd)); // if the page has not been created, then create it if (pPage->m_bCreated == FALSE) { if (pPage->Create(pPage->m_nDialogID, this) == FALSE) return FALSE; pPage->m_bCreated = TRUE; pPage->m_pParent = this; if (pPage->OnCreatePage() == FALSE) return FALSE; } CRect rect; CWnd *pWnd = GetDlgItem(m_nPlaceholderID); ASSERT(pWnd != NULL); ASSERT(IsWindow(pWnd->m_hWnd) != FALSE); pWnd->GetWindowRect(&rect); ScreenToClient(&rect); pPage->SetWindowPos(NULL, rect.left, rect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE ); pPage->ShowWindow(SW_SHOW); pPage->EnableWindow(TRUE); pPage->OnSetActive(); pPage->m_bActive = TRUE; return TRUE; }
Mfg
Damian
-
Füge doch mit AddPage die Seite erst hinzu wenn Du sie benötigst. BTW: Die Seiten werden in einem Wizard immer erst erzeugt, wenn diese angesprungen werden. Nicht vorher!
Dein verzögretes Erzeugen nützt also eigentlich nichts.
-
Martin Richter schrieb:
Füge doch mit AddPage die Seite erst hinzu wenn Du sie benötigst. BTW: Die Seiten werden in einem Wizard immer erst erzeugt, wenn diese angesprungen werden. Nicht vorher!
Dein verzögretes Erzeugen nützt also eigentlich nichts.
Da hast du Recht Martin, mit dem verzögerten Erzeugen, das bringt gar nichts, außer das alles verzögert wird.
Ich hab dieses Problem auch nur beim ersten Dialog, also wenn der Wizard sowie der erste Subdialog erzeugt werden muss. Wenn ich dann auf Weiter drücke, dann muss ja nur noch der Subdialog erzeugt werden (da ist dann alles gut).
Beim Starten des Wizards werden einige Bilder geladen (all diese Bilder gehören zum Wizard-Dialog nicht zum Subdialog) und diese werden alle nacheinander erst angezeigt, was etwas nervig ist.
Ich hab z.B. vier Button-Bilder für die Navigation (Weiter, Abbrechen etc.) erstellt sowie ein Banner-Bild, welches in ein Picture Control reingeladen wird. Alle Bilder sind als Resourcen im Projekt abgespeichert.
Super wäre es, wenn man irgendwie all diese Bilder vorladen könnte, so dass man beim Erzeugen des Dialogs nur noch auf "Visible" schalten muss und alles wird "gleichzeitig" angezeigt.
Mfg
Damian
-
Hast Du mal Dein Dialog-Template auf Invisible gestellt.
Windows zeigt Dialoge, die nicht visible sind, erst nach dem OnInitDialog an. Dialoge, die visible in der Ressource gesetzt bekommen, werden sofort visible erzeugt.
Ich weiß nicht ob das auch für Wizards gilt.
Vielleicht hilft das!
-
Ich glaub eher, dass vielleicht etwas mit meiner CtlColor Zeichenfunktion falsch ist bzw. optimiert werden muss...
HBRUSH CPictureCtrl::CtlColor(CDC* pScreenDC, UINT nCtlColor) { //ist zu Beginn auf FALSE gesetzt im Construktor if(!m_bHaveImage) { CBitmap bmp, *pOldBitmap; CRect rect; GetClientRect(rect); // do everything with mem dc CMemDC pDC(pScreenDC, rect); Gdiplus::Graphics graphics(pDC->m_hDC); if (m_dcStd.m_hDC == NULL) { //m_pImage beinhaltet das darzustellende Bilde graphics.DrawImage(*m_pImage, 0, 0); //m_dcStd ist ein CDC, welcher als Membervariable ist m_dcStd.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); pOldBitmap = m_dcStd.SelectObject(&bmp); m_dcStd.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY); bmp.DeleteObject(); //DeleteDC(m_dcStd); } m_bHaveImage = TRUE; } return NULL; }
OnPaint(), OnDraw() oder OnEraseBackground() hab ich alles nicht verwendet.
Bis jetzt ist es bei diesem Picture Control so,dass zuerst die Größe des Bildes im Dialog weiß dargestellt wird, und nach 1sec ungefähr das Bild dargestellt wird.
-
Habs jetzt auch mal versucht die Bilder mit CImage zu laden CImage.Load(pStream), aber anscheinend dauert das Laden solange, dass die Bilder stets nacheinander mit größerem Abstand angezeigt werden...
LoadBitmap() geht da um einiges schneller. Allerdings fehlt mir dann die Information, welche Farbe transparenz sein soll.
-
1. Warum die Bilder nicht gleich im Konstruktor laden?
2. LoadImage verwenden. Das kann auch Farben ersetzen. Dito CImageList
3. OnCtlColor ist IMHO auch der falsche Moment um zu Zeichnen. OnEraseBkGnd wäre korrekt, oder eben OnPaint.