Invalidate wohin wenn Fenster nach Focusverlust nicht neu zeichnet?
-
Hi zusammen ich hab ein Problem, das mich schon ne Weile nervt. Ich hab eine CHtmlView in der ich pdf-Dokumente anzeige. Wenn mein Programm von einem anderen überdeckt wird, verschwindet an dieser Stelle das Dokument. Also sollte ich spätestens (besser früher schon) wenn mein Programm wieder den Focus bekommt "neu zeichnen". Wenn mich nicht alles täuscht muss ich dann
Invalidate(TRUE);
machen. Aber kann mir einer sagen wo ich das mach? Hier mal der Vollständigkeit halber mein Code:
//der Anfang halt ganz normal vom Klassenassi erstellt (CHtmlView) und dann ///////////////////////////////////////////////////////////////////////////// // CDokumenteView message handlers ///////////////////////////////////////////////////////////////////////////// // In OnInit den Pfad aus EinstellungenView holen und zum Dokument navigieren void CDokumenteView::OnInitialUpdate() { CEinstellungenView Path; CString ganzerPfad = Path.getPath("", ""); Navigate2(_T(ganzerPfad),NULL,NULL); Invalidate(TRUE); } ///////////////////////////////////////////////////////////////////////////// // Erstellt ein Fenster (für SwitchView) void CDokumenteView::CreateWnd(CWnd* f_pParent, CCreateContext& f_rCreateContext) { VERIFY(Create(0, 0, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), f_pParent, AFX_IDW_PANE_FIRST, &f_rCreateContext)); SendMessage(WM_INITIALUPDATE, 0, 0); } void CDokumenteView::OnUpdateDokumente(CCmdUI* pCmdUI) { pCmdUI->Enable(FALSE); } void CDokumenteView::OnUpdateFilePrintPreview(CCmdUI* pCmdUI) { pCmdUI->Enable(TRUE); }
Vielen Dank schon im Voraus
-
Ich bin mir nicht sicher, aber WM_SETFOCUS hört sich gut an:
Indicates when a window has gained input focus.
EDIT: Vielleicht solltest du aber versuchen, dein Fenster beim Verlieren des Fokus zu speichern. Da könnte vielleicht WM_KILLFOCUS in Frage kommen.
In WM_SETFOCUS kann man das dann vielleicht einfach nur drüber blitten.
-
hört sich wirklich gut an, aber was muss ich tun damit das mir neu gezeichnet wird?? Denn Invalidate geht nicht.
meint ihr ich kann sowas machen wie jetzt mall sinngemäß sowas?MöchtegernCode schrieb:
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
CFrameWnd::OnSetFocus(pOldWnd);
if (activeView = HTMLView)
navigate2(dahin wo ich halt eh schon war);
}meint ihr das könnte klappen??
Dann sollte ich doch alles wieder haben, oder?? Weil das Menü und so bleibt stehen!
-
Dann hast du es wieder - bist aber wieder gaaaanz oben auf der Seite.
Wenn ich jetzt aber unten was gucke, schnell was vergleichen will und - schwupps isses weg.Wieso geht Invalidate nicht?
Wie hast du es versucht?
-
Warum Invalidate nicht geht weiß ich nicht. Leider
probiert hab ich es so:void CMainFrame::OnSetFocus(CWnd* pOldWnd) { CFrameWnd::OnSetFocus(pOldWnd); Invalidate(TRUE); //und so hab ich auch probiert // CDokumenteView DokuView; // DokuView.Invalidate(TRUE); }
Aber das Pdf ist trotzdem wenn ich den Focus wieder bekomme eine einfache weiße Fläche (weiß ist mein Programmhintergrund) das normale Programmmenü ist da, aber das PDF-Menü ist auch weg! (und bleibt es). An die Stelle komm ich auf jeden Fall wieder also MessageBoxen haben gezeigt die WM_SETFOCUS scheint schon richtig zu sein. Das mit dem oben auf der Seite sein ist echt doof, aber nicht so schlimm wie wenn ich mein Dokument nicht mehr bekomm!
Wie kann ich die ActiveView mit der gewünschten View vergleichen? (in ner if)???
Danke schon mal ganz herzlichst
-
// CDokumenteView DokuView; // DokuView.Invalidate(TRUE);
Wieviele Diskussionen hatten wir beide zu DEM Fehler?
Wie kann ich die ActiveView mit der gewünschten View vergleichen? (in ner if)???
Wie wäre es damit, dass du dynamic_cast nutzt? Wenns der falsche ist, kommt NULL raus.
-
estartu_de schrieb:
// CDokumenteView DokuView; // DokuView.Invalidate(TRUE);
Wieviele Diskussionen hatten wir beide zu DEM Fehler?
[/quote]
Hm schon aber dieser Fehler steckt sehr tief in mir, als ich das Assert gesehen hab war mir gleich alles klaraber halt erst da
wollte es aber der Vollständigkeit halber auch posten, damit du weißt, mit was für nem Trottel du es zu tun hast
estartu_de schrieb:
[Wie wäre es damit, dass du dynamic_cast nutzt? Wenns der falsche ist, kommt NULL raus.
Hm so??
CDokumenteView* DokuView = dynamic_cast<CDokumenteView*>(AfxGetMainWnd()); if (DokuView) Invalidate(TRUE);
geht auch nicht Fehlerbeschreibung s.o.
was ist daran falsch??
-
Hmmm, was gibt dir AfxGetMainWnd()?
Jedenfalls keinen View - aber was, was dir GetActiveView anbietet.
-
Hm OK, dann hätte ich jetzt vermutet:
CDokumenteView* DokuView = dynamic_cast<CDokumenteView*>(AfxGetMainWnd()); if (DokuView==GetActiveView()) Invalidate(TRUE);
Aber es ist immer noch das gleiche Problem weil er mir gar nicht in die if rein kommt!
Krieg ich noch einen Tip? *liebschau*
-
ich würde lieber versuchen den fehler zu finden als irgendwelche komischen workarounds zu benutzen.
-
na Danke für den Prima Tip! Wenn ich den Fehler innerhalb 3 Werktage finden würde, würde ich das ja machen, außerdem ist es kein workaround, wenn ich das neuzeichnen in der SetFocus mache!!
Es ist ja wohl definitiv konstruktive Fehlerbeseitigung!
-
Meinst du diese Situation wie auf folgendem Screenshot?
-
CDokumenteView* DokuView = dynamic_cast<CDokumenteView*>(AfxGetMainWnd()->GetActiveView());
So sollte es gehen, ist aber nicht getestet...
-
Also ich hab auch mal Screenshots gemacht:
Bild 1: so sollte es immer sein!
Bild 2: Fenster drüber auch noch OK
Bild 3: Fenster weg scheiße Loch!
Bild 4: wenn ich maximiertes Fenster drüber liegen hatte
Bild 5: wenn ich mit der Maus übers PDF Menü geh tauchen die einzelnen Buttons wieder aufsieht doch scheiße aus oder??
@Estaru hm leider Fehler:
error C2039: 'GetActiveView' : is not a member of 'CWnd'
-
Dann musste einfach noch nen Mainframe draus machen:
CDokumenteView* DokuView = dynamic_cast<CDokumenteView*>(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
-
Also das sieht ja aus wie auf meinem Screenshot.
Aber bei mir ist das Problem nicht. Lass dir doch ne minimale CHTMLView Anwendung vom Assistenten erstellen und lad da dein PDF rein. (so hab ich es gemacht)
-
Tut mir leid hatte Donnerstag und Freitag frei
öhm @Estartu er scheint jetzt neu zu zeichnen, aber selbst wenn ich ein kleines Fenster drüber lege verschwindet jetzt der komplette Screen wie auf Bild 4 (s.o.)
@pdf: das mach ich eigentlich! Zeig mal bitte wie du das da rein lädst. Auch mit navigate2 ??
Vielen Dank schon mal euch beiden
-
Also vom Assistenten wird ja alles schon komplett fertiggstellt. Hab nur die URL bei Navigate auf ein PDF Dokument geändert.
-
@pdf: kannste mir die Klasse mal posten? dürfte ja nicht all zu groß sein!
@Estartu: noch ne Idee? Was könnte denn sonst noch sein?
-
Nein, ich habe keine Idee mehr.
Die ganze Zeichnerei ist ja eh nicht so mein Gebiet.Was du nochmal versuchen könntest, ist ein UpdateAllViews von dem passenden Doc aufzurufen.
Wie das mit dem Casten geht, müsstest du ja beim View abgucken können.
-
naja aber ein Update all Views glaube ich nicht dass es mich weiter bringt, aber ich werde mal ein wenig damit rum spielen, vielleicht ergibt sich hja noch was, falls jemand noch ne Idee hat ich bin für alles offen!!