[Visual C++.NET 2003] MDI->neue View vom Dialog aus erstellen

FlyingHuman

Mitglied
Hallo,
dank Eurer Hilfe bin ich mittlerweile so weit das mein Progamm nun zum Grundlegenden Teil steht ;)
Ich habe allerdings jetzt noch 2 Große Probleme:

1. Wie ändert man die Größe des Fensters, das entsteht, wenn man bei einer MDI - Anwendung auf "NEU" geht? Also das ChildFenster im MainWnd.
-> wenn ich da this->SetWindowPos(...) in der Klasse CChildFrm aufrufe, kommt ein Assert-Fehler :(

2. (wichtiger) Wie kann man aus einem Dialog (implementiert in einer Registerkarte, diese ist wiederum in einer CFormView drinn) eine CView erstellen?
-> ich möchte also beim Click auf einem Button ein neues Child-Fenster erstellen, wo ich dann drinn malen kann.
Ziel: in dieser neuen CView möchte ich eine Druckvorschau anbieten.

-> sind in dieser CView dann die Standard-Druckfunktionen funktionsfähig?
-> Das ich also in der View das Zeichne was zu drucken ist (also die Vorschau) und dann über das Menue des MainWnd die Standart-Druckfunktionen nehme?
->Wie müsste ich dann den Seitenumbruch gestalten?

...hmm, das sind ja doch mehr als 2 Probleme :(

wenn jemand Rat hat, dann immer her damit!
Ich freu mich auf jede Antwort!

MfG
 
Hi, zu deinem beiden wichtigsten Fragen habe ich leider keine Antwort. Aber was das Drucken angeht:

Wenn deine neu erstellte View die aktive View ist, sollten auch die Standard-Druckfunktionen darüber arbeiten. Gedruckt wird dann alles genauso, wie es in OnDraw gezeichnet wird. Denke aber auch an den MapMode, man kann auch in MM_TEXT drucken, aber meist wird der Druck dann unbrauchbar - weil jeder Bildschirmpunkt als ein Druckerpunkt betrachtet wird - und das sind dann bei z.B. 1024 x 768 Bildschirm und einer Druckerauflösung von 300 dpi gerade mal etwas über drei Zentimeter im Ausdruck.
Außerdem geht das nur, wenn deine Bildschirmausgabe einer Druckseite entspricht, also z.B. einer A4-Seite. Wenn das nicht der Fall ist, mußt du die Funktion OnPrint überschreiben, vorher ausrechnen, wieviel Seiten du brauchst und was auf eine Seite soll, dann in OnPreparePrinting festlegen, wieviel Seiten gedruckt werden sollen und dann jede Seite einzeln über den Drucker ausgeben. Ich mache es so, daß ich dann für jede Seite eine eigene Zeichenroutine schreibe, die ich in OnDraw zur Bildschirmausgabe zusammensetze und beim Drucken anhand der gerade zu druckenden Seite auswähle und an den Drucker sende.

Mfg

langer
 
Zuletzt bearbeitet:
hmm, naja ich dachte mir schon, das es nicht so leicht werden würde.

wegen der View:

anders gefragt: Wie bekomme ich die View beim Programmstart als 2.Fenster mit angezeigt?
man könnte dann doch, wenn sie einmal initialisiert ist, sie nur noch ausblenden und dann bei bedarf mit ShowWindow(SW_SHOW) (oder so..) anzeigen?
nur wie komme ich zu der View? wie kann ich die anzeigen?
ich werd aus der msdn irgendwie nicht schlau oder finde das nicht ...
 
Brauchst du denn überhaupt ein MDI-Projekt? Selbst Microsoft hat seine in der Vergangenheit propagierte MDI-basierte Programmierung relativiert und die neue MTI-Basis geschaffen. Wenn deine Views in allen Ansichten dieselbe Basis-Klasse haben und du doch immer nur eine anzeigen kannst, kommst du ohne Probleme mit SDI aus. Ich habe viele Ansichten in meinen Dokumenten - aber immer nur SDI. Ich gebe jeder meiner Ansicht eine Nummer und teile dann der View-Klasse einfach die Nummer mit - und dann weiß sie, was sie gerade zeichnen soll, indem der Programmteil aufgerufen wird, der dafür zuständig ist. Anders ist es natürlich, wenn die Ansichten unterschiedliche Basis-Klassen brauchen, aber auch dafür gibt es SDI-Lösungen. Allerdings weiß ich nicht, ob man da nicht auch in MDI-Anwendungen Klimmzüge machen muß.
Das ist aber nur meine Meinung und mein Programmierstil, so komme ich aber problemlos klar und habe bisher alle meine Projekte ohne MDI realisiert.

Mfg

langer
 
Zuletzt bearbeitet:
ja, ich brauch MDI, weils im Pflichteheft steht und ichs auch übersichlicher finde, da der user die Fenster so anordnen kann wie er es haben will.
zudem habe ich ja registerkarten, und da kann man dann, falls gewünscht mehrere Fenster mit jeweils einen anderen Tab aufmachen und bequem und übersichtlich arbeiten ;)

also von daher wäre es schon schön, wenn mir jemand sagen könnte, wie ich da ein neues Fenster reinkriege.

kennt jemand da ein Tutorial?

-> was muss ich denn bei CreateFrame(...) beachten?

ich bin wirklich für jede Antwort Dankbar!

MfG
 
ah, jetzt ja! ;)

also ich werde bei gelegenheit mal den code posten, wie es geht.
ich habs jetzt hinbekommen ein neues MDIChildWnd zu öffnen und darin zu zeichen.

--> was jetz noch fehlt ist: problem 1: wie verändere ich die größe des ChildFensters beim öffnen der Anwendung?

Help :confused:
 
Zuletzt bearbeitet:
OK, jetzt hab ich mal zeit und poste mal den Code:

1. im Dialog die Header-Datei der neuen View einbinden.
2. in der View die Create funktion überschreiben oder so belassen wie sie ist (ich habe sie überschrieben)
Code:
--> neues_fenster.h

BOOL Create(LPCTSTR szTitle, LONG style = 0,
				const RECT& rect = rectDefault,
				CMDIFrameWnd* pParent = NULL);

--> neues_fenster.cpp

BOOL CName_der_Klasse::Create(LPCTSTR szTitle, LONG style /* = 0 */,
	const RECT& rect /* = rectDefault */,
	CMDIFrameWnd* parent /* = NULL */)
{

	//eigenes ICON laden
	LPCTSTR lpszDruckChildWndClass =
		  AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
			LoadCursor(NULL, IDC_ARROW),
			(HBRUSH) (COLOR_WINDOW+1),
			LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_DRUCK)));

	return CMDIChildWnd::Create(lpszDruckChildWndClass, szTitle, style, rect, parent);
}

3. in dem Dialog dann die Create Funktion aufrufen:

Code:
#include "Name_der_Klasse.h"
void CXYZDlg::OnBnClickedDrucken()
{
	CName_der_Klasse *pDruck = new CName_der_Klasse;
	CRect myrect(300,0,900,600);
	if (!pDruck->Create(_T("Druckvorschau"),
		WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, myrect, NULL))
		return;
}

... dann hab ich versucht eine CView einzufügen. geht auch wunderbar (auch mit ner Create-Funktion) aber da hätte ich dann immer einen Rand den man dann immer an das MDIChildWnd anpassen müsste.
Da man aber bereits im oben erzeugten Fenster zeichnen kann, ist es nicht notwendig noch ne View einzufügen, es sei denn man braucht die Standard-Druckfunktionen der CView Klasse.

--> wenn ich jetzt Allerdings das Fenster mit einem anderen überdecke und dann den Fokus wieder zurückgebe, dann ist da wo das andere Fenster es überdeckte alles Weiß.
wie kann ich den das Fenster (CMDIChildWnd) zum neuzeichnen anregen ohne es zu schließen und es wieder zu öffnen?

--> wie kann man die Fenstergröße eines Child-Frame-Windows ändern? in der welcher Klasse muss ich SetWindowPos() eintragen und welche Parameter brauche ich dazu?

Danke.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück