Datei öffnen bei Programmstart/Kommandozeile (Anwendungsassistent)
-
Ich verstehe in keiner Form was Du willst.
- Ein CView ist von einem CDocument unabhängig. Punkt.
- Die Daten liegen im Document und werden vom CView dargestellt.
- Ein CView existiert immer erst nachdem ein CDocument angelegt wurde.
- Ein CDocument kann auch ohne CView leben.
- Ob Ein View existiert oder zerstört wurde erfährst Du über OnChangedViewListDein Problemist einfach, dass Du hier alle Objekte wild durcheinander würfelst und auf die entsprechende Datentrennung nicht achtest.
Für was hast Du Daten bitte im CMainFrame?
-
Das ist mir alles klar. Stimmt, die Document-Klasse habe ich ziemlich aussen vor gelassen; da PlayEnhMetaFile das Öffnen halt selbständig übernimmt. Und diese Funktionen habe ich im View geschrieben wo die Daten angezeigt werden.
Da ich es nicht schaffte Variablen für die Handles etc. global zu deklarieren schaute ich in einem Forum, wo ich diese Idee fand diese in MainFrm anzulegen; dort ist nun das Handle und die Auswahl der Anzeigegrösse. Wäre ja wunderbar, so sind sie von der Document-Klasse zugänglich um den Handle beim ÓnNewDocument anzulegen dass er beim Paint-Event des Views verfügbar ist wenn eine Datei über die Kommandozeile geöffnet wird. Nun gibt es aber genau da eine Zugriffsverletzung...
Von anderen Programmiersprachen und Frameworks (Assembler/win32 bis C#/VB) bin ich mir gewohnt diese DInge im WM_Create oder Form_Load zu erledigen was aber anscheinend in diesem Sinn mit MFC nicht geht.
-
Anzeigegrößen Auswahl? Gehört in den View?
Es gibt alle diese Events CMainFrame/CView::OnCreate, CView::OnInitialUpdate.
Die Frage ist nur was paltziert man wohin und das ist die Crux bei Dir....
-
So wie ich gelesen habe gehört alles was mit einer alternativen Ansicht des selben Dokuments zu Tun hat ins View?
Ich versuchte eben die OnCreate-Methode hinzuzufügen auf WM_Create. Nun meldet mir Visual Studio "Hinzufügen/entfernen nicht möglich da das Codeelement.... schreibgeschützt ist"
-
Keine Ahnung. Setzt Du Source COntrol ein?
Im CView ist OnInitialUpdate der richtige Ansatz. OnCreate wäre wirklich nur für Basis-Dinge wichtig.
-
Vielen Dank; ja in der InitialUpdate hatte ich den Code schonmal und das gab auch eine Zugriffsverletzung; aber wahrscheinlich habe ich da einen Fehler drin. Die Dokumentklasse sollte ja von dort aus zugänglich sein und das Paint-Ereignis wird nacher ausgelöst.
-
Source Control kenne ich gar nicht, nein; ist das ein Dokumentations/Überprüfungswerkzeug?
-
Dann zeig mal Code.
Source Control Systeme verwalten den Sourcecode und bieten Versionierung und Historien an. Erlauben meistens auch ein Arbeiten im Team am Code.
-
Der Code welcher ausgeführt werden sollte wäre dieser:
CEMFBetrachter_MFCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; HENHMETAFILE H; H=GetEnhMetaFile(pDoc->GetPathName()); (((CMainFrame *)AfxGetMainWnd())->hMFile)=H; ENHMETAHEADER Metaheader; GetEnhMetaFileHeader(H, sizeof(ENHMETAHEADER), &Metaheader); (((CMainFrame *)AfxGetMainWnd())->MFileHeader)=Metaheader; (((CMainFrame *)AfxGetMainWnd())->viertelgr)=true; (((CMainFrame *)AfxGetMainWnd())->Originalgr)=false; (((CMainFrame *)AfxGetMainWnd())->Fenstergr)=false;
Irgendwie kann ich keine Funktionen hinzufügen und OnInitialUpdate ist nicht vorhanden.
Ach so, danke. Nein so etwas verwende ich nicht
-
Jetzt hat's geklappt! Heute ging die Überschreibung von OnInitialUpdate und darin habe ich den Code jetzt und läuft. Jetzt lässt sich das Programm sinnvoll verwenden.
Danke !
-
C. M. Obrecht schrieb:
CEMFBetrachter_MFCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; HENHMETAFILE H; H=GetEnhMetaFile(pDoc->GetPathName()); (((CMainFrame *)AfxGetMainWnd())->hMFile)=H; ENHMETAHEADER Metaheader; GetEnhMetaFileHeader(H, sizeof(ENHMETAHEADER), &Metaheader); (((CMainFrame *)AfxGetMainWnd())->MFileHeader)=Metaheader; (((CMainFrame *)AfxGetMainWnd())->viertelgr)=true; (((CMainFrame *)AfxGetMainWnd())->Originalgr)=false; (((CMainFrame *)AfxGetMainWnd())->Fenstergr)=false;
Merke: Wenn Du soviele Cast zum Zugriff auf andere Objekte benötigst ist etwas grundsätzlich falsch!
Warum stehen diese Daten/Objekte nicht im View!
-
Ja das ist mir klar. Ich hatte bloss Mühe mit dem globalen Deklarieren und bin dann im Internet darauf gestossen es so zu tun... Wie könnte ich so eine Variable normal im View deklarieren? In C# wäre mir klar wie, aber die Doc/View-Architektur wollte es nicht so wie ich...
Das Programm habe ich in Assembler zuerst geschrieben und dort ist es fast so gross wie die Casts alleine
Allerdings kann diese Version nicht zu BMP konvertieren.
-
mammamia;
-
jtsfds283 schrieb:
mammamia;
biste jetzt der große guru, der da shinbekommt Restpeckt, so viel dummheit auf einen haufen ahb ich auch noch net gesehen. Ich bin mal wieder dafür dass das Forum für unregistrierte geschlossen wird.
MFG Matthias