Zum Inhalt springen

Kampfkartoffel

Mitglieder
  • Gesamte Inhalte

    77
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Kampfkartoffel

  1. Ok, nur zur Info: Habe den Fehler begangen, die OnPaint-Funktion nicht automatisch erstellt zu haben, daher passte mein device context (dc) nicht. Für alle die dasselbe vorhaben (Bild aus Resource laden und auf dem PropSheet anzeigen) : benötigte Headerdatei: atlimage.h Einzufügen in stdafx.h Wo genau man das einfügen muss steht hier im unteren Teil (ist von Fall zu Fall unterschiedlich): http://msdn2.microsoft.com/zh-CN/library/bwea7by5.aspx Der Code einzutragen in die OnPaint-Funktion des Propsheet: Bitmap.Destroy(); Bitmap.LoadFromResource(AfxGetInstanceHandle(),IDB_BITMAP); Bitmap.Draw(dc.m_hDC,int Länge,int Tiefe); Länge: Wie weit vom linken Rand soll Bild angezeigt werden Tiefe: Wie weit vom oberen Rand soll Bild angezeigt werden oder ohne CImage so (Tutorial) : http://www.codeguru.com/cpp/controls/propertysheet/article.php/c621/ Gruß KK
  2. Ja, sorry hast Recht. Ergab sich zum Teil aus meinem ersten Post, passte aber nicht mehr zum Titel. Danke Gruß KK
  3. 2. Frage hat sich erübrigt, ich habe mit dem Debugger festgestellt, dass er OnPaint nie aufruft. Mit welcher Methode kann ich ihm sagen, er soll es auf dem Sheet zeichnen?
  4. Mmmh, ich habe nun einen Code der auf meinen Propertypages zwar läuft, aber mir bei meinem PropertySheet den Dienst verweigert. Folgende Situation: Ich habe PropertyPages und ein PropertySheet. Auf dem PropertySheet sind alle Button entfernt. Dort soll nun eine Grafik hin. Ich habe zum austesten in einer Propertypage geschrieben: CImage Bitmap; CClientDC dc(this); Bitmap.LoadFromResource(AfxGetInstanceHandle(),IDB_VOITH); Bitmap.Draw(dc.m_hDC,0,900); Damit es bei jedem Neuzeichnen immer wieder mitgezeichnet wird, habe ich in die OnPaint-Funktion geschrieben. Auf der Propertypage klappte das wunderbar, bei meinem PropertSheet nicht. 1. Frage: Wie kann ich am einfachsten den Rand, den PropertySheet unten für die Buttons gelassen hat, auslesen um die Position zu haben, wo das Image hin soll? 2.Frage: Ich habe erstmal versucht bei dem PropertySheet auch mit OnPaint zu arbeiten, ist das falsch? Gruß KK
  5. Hallo Guybrush, danke für die schnelle Antwort. Schade, dass das so einfach nicht geht. Dann werde ich mich da alleine durchwurschteln müssen. Ist vielleicht auch besser so, denn ich denke, als Dan in "the big Lebowski" sagte, "Bowling ist ein Ligaspiel", sprach er in Wirklichkeit von der Programmierung in C++.
  6. Hallo noch mal, ich hab noch mal eine Frage. Gibt es eine Datei, in der der Code für die grafisch erstellten Steuerelemente auftaucht. Soll heißen, wenn ich z.B. ein Bild-Feld erstelle, dieses auf meinem Dialog irgendwohin setze und die Größe mittels Maus verändere, so muss doch diese Information irgendwo auftauchen. Ich habe nämlich vor, ein Bitmap-Objekt zu erzeugen, die Größe zu bestimmen und diesem Bitmap-Objekt ein RessourcenBild zuzuweisen und dieses auf dem Dialog zu platzieren. Alles soll codemäßig erfolgen. Wenn ich nun wüsste wo der Code steht, wie intern mit den Steuerlementen umgegangen wird, könnte ich mich an dieser Struktur orientieren. Gruß KK
  7. Hallo Cleo, da hast du mich nun aber komplett falsch verstanden. Als ich schrieb, ich hätte keinen Einfluss drauf, meinte ich, dass ich keinen Einfluss darauf habe, weil ich das Programm für eine Firma schreibe, deren Vorgaben ich einzuhalten habe. Darüber hinaus werden die Ok- und Abbrechen-Button automatisch in dem PropertySheet erzeugt. Ich sehe sie also als Steuerelement nicht. Natürlich könnte ich code-mäßig die Eigenschaften ändern, aber so wie nun läuft es ja auch korrekt. Gruß KK
  8. Hallo Cleo, ich wollte Deinen Post nicht übergehen, ich bin ja froh, wenn Leute mir helfen möchten. Ich habe meinen Post auch nur mit einem Auge geschrieben, um kurz mitzuteilen, dass es läuft. Ich arbeite mit dem VisualStudio.net 2003. Das der Hinweis gerechtfertigt ist, weiss ich. Ich würde diese Funktionen für mein eigenes Programm auch nicht deaktivieren, aber wie gesagt, da habe ich in diesem Fall keinen Einfluss drauf. Gruß KK
  9. Hallo, habe mein Problem soeben gelöst. Wenn ich mit der PreTranslateMessage die Return-Taste und die Escape-Taste abfange und dann einen Wert ungleich Null zurückgebe, so überspringt er die Beendigung des Dialogs. Ich weiss, dass Klotzkopp davor warnt diese Tasten zu blockieren, aber wenn man das Programm für eine Firma schreibt, die darauf besteht, kann man nichts machen:D Gruß KK
  10. Hallo nochmal, Ich habe nochmal eine Frage. Ich finde weder in irgendwelchen Dateien meines Programms "BS_DEFPUSHBUTTON", um diese Styles zu entfernen, noch finde ich in der MSDN oder beim Programmieren den Befehl "RemoveStyle" um den Button unter InitDialog zu deaktivieren. Wie muss ich den Vorschlag einsetzen? Gruß KK
  11. Hallo Anybody, Danke für die schnelle Antwort. Das ist ja dann in der Tat das was ich gesucht habe. Ich werde es heute sofort ausprobieren, ich danke Dir und sapero für eure Hilfe. Gruß KK
  12. Hallo sapero, danke für Deine Antwort, ich habe zur Zeit nicht die Möglichkeit es auszuprobieren, aber es liest sich für mich, als ob ich so den OK-Button deaktivieren würde. Der OK-Button soll aber bestehen bleiben, ich möchte nur nicht, dass die Return-Taste den Ok-Befehl ausführt und den Dialog schließt. Kann ich mit deiner Idee die Return-Taste deaktivieren? Gruß KK
  13. Hallo an Alle, ich habe ein PropertySheet mit mehreren PropertyPages. Ich möchte, dass das Programm nur beendet wird, wenn ich auf OK "klicke". Zur Zeit beendet er auch mit einem Tastendruck von Return das Programm. Ich habe im Forum nach ähnlichen Beiträgen gesucht, auch einige gefunden, die Ansätze dort lösen jedoch nicht mein Problem. Im Grundsatz soll wenn Enter gedrückt wird gar nichts passieren. Hat jemand eine Idee? Gruß KK
  14. ES LÄUFT, ich danke Dir recht herzlich, Holzkopp, für Dein Engagement und Dein Interesse an meinem Problem. Endlich habe ich eine Lösung für mein Problem und die Art der Lösung hat mein Verständnis stark erweitert. Wenn mal Votings für Moderatoren stattfinden, sag mir Bescheid, meine Stimme hast Du! PS: Ja das mit dem Dialog ist ein Designfehler, ich war halt nur mit der Dialog-Klasse am vertrautesten und wählte deswegen diese. Kennst Du irgendeine MFC-Standardklasse mit der man meine Datenklasse einfacher erstellen kann? Gruß und herzlichen Dank KK
  15. Ich habe weiterhin das Problem, dass sobald ich die Data.h vor oder in der/die Programm2.h include ich die Fehler bekomme: error C2065: 'IDD_DIALOG1' : nichtdeklarierter Bezeichner //IDD_DIALOG1 ist der PseudoDialog der Datenklasse, den ich angelegt habe error C2057: Konstanter Ausdruck erwartet //bezieht sich auf dieselbe Zeile im Programm Beide Fehlermeldungen beziehen sich auf: public: CData(CWnd* pParent = NULL); // Standardkonstruktor // Dialogfelddaten //{{AFX_DATA(CData) ==> enum { IDD = IDD_DIALOG1 }; // HINWEIS: Der Klassen-Assistent fügt hier Datenelemente ein //}}AFX_DATA Kann es sein, dass es ein Problem ist, die Datenklasse als Basisklasse von CDialog zu nehmen? mein Code (Zur Info): Programm2.h #include "Data.h" #if !defined(AFX_PROGRAMM2_H__199936CB_F941_48C9_8013_8CC5B5E81F2F__INCLUDED_) #define AFX_PROGRAMM2_H__199936CB_F941_48C9_8013_8CC5B5E81F2F__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // Hauptsymbole class CProgramm2App : public CWinApp { public: CProgramm2App(); CData mData; ... Programm2.cpp #include "stdafx.h" #include "Programm2.h" #include "Parent.h" //PropertySheet #include "Programm2Dlg.h" //PropertyPage #include "Dialog2.h" //PropertyPage ... Data.cpp #include "stdafx.h" #include "Programm2.h" #include "Data.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ... und so sehen dann die Pages aus: z.B. Dialog1: #include "stdafx.h" #include "Programm2.h" #include "Programm2Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ... Kannst daran Du sehen, warum diese Fehlermeldung kommt? 2. Wenn ich mich nun in der PropertyPageklasse CProgramm2Dlg befinde, wie genau sage ich dann dem Pointer auf die Hauptklasse(CProgramm2App *Bezug), dass er sich die Adresse aus der Variable der Datenklasse nehmen soll (CData Daten;) , die in der Hauptklasse deklariert wurde? Das ist wahrscheinlich ziemlich simpel, weswegen Du es nicht weiter erwähnst, aber ich habe wirklich zur Zeit keine Ahnung wie ich das basteln soll. Gruß KK
  16. ok, wenn ich Data.h in die Programm2.h eintrage: Programm2.h: #include "Data.h" ... , dann brauche ich doch Data.h nicht mehr in der Programm2.cpp Datei einzubinden, oder? Sie wird doch doch beim Eintragen der Programm2.h miteingetragen. Zur Zeit sieht darüber hinaus meine Data.cpp so aus: #include Programm2.h #include Data.h Wenn CData eine Member Programm2 sein soll, kriege ich hier auch ein Problem, oder? Und zum letzten Punkt, mir fällt irgendwie kein Weg ein, wie ich an die Adresse der CData-Member rankommen sollte, da sie in einer anderen Klasse ist. Mit: PageX.h: CProgramm2App *Bezug, m_Bezug; und dann PageX.cpp: Bezug=&m_Bezug.m_Data; ist das wohl nicht getan, oder? Gruß KK
  17. 1. Fall: Wenn ich in der App-Klasse eine CData-Member haben möchte, so muss doch die Data.h vor der Programm2.h eingebunden werden, damit er die Klasse kennt. Wenn ich das tue, meldet mir der Compiler jedoch: error C2065: 'IDD_DIALOG1' : nichtdeklarierter Bezeichner error C2057: Konstanter Ausdruck erwartet (Ich habe als Basisklasse der Datenklasse einfach mal die Dialogklasse genommen) 2.Fall: Wenn ich, wie du in einem Deiner Vorposts sagtest, eine Vorwärtsdeklaration durchführe mit "class CData m_Data;" dann kommt die Fehlermeldung mit der undefinierten Klasse CData. Aber jetzt mal rein zum Verständnis. Wenn ich in der App-Klasse eine CData-Member habe, so hat diese Member eine Adresse. Wenn ich nun in meinen Pageklassen jeweils den erstellten Pointer der Datenklasse diese Adresse zuweise, so gehe ich immer auf dem selben Weg in die Datenklasse. Habe ich das so richtig verstanden? Gruß KK
  18. Hallo Holzkopp, @Fehlermeldung: ... class CProgramm2App : public CWinApp { public: CProgramm2App(); class CData *pData,mData; ... Dann erscheint die Fehlermeldung: 'mData' verwendet undefiniertes class 'CData', nur zur Info 1. Das Datenobjekt ist von der Lebensdauer der Hauptprogrammklasse abhängig, da ich im gesamten Verlauf des laufenden Programms auf die Datenklasse zugreifen möchte. Die Lebensdauer des Datenobjekts soll mit Programmende erlöschen. 2. Alle Seiten (PropertyPages) benötigen Verweise auf die Datenklasse, damit ich die Methoden in der Datenklasse aufrufen kann, sollen aber keinen Einfluss auf seine Lebensdauer haben. Nur nochmal zur Erinnerung, ich kann zur Zeit Daten, die von der einen Seite in die Datenklasse eingetragen werden auch wieder auslesen. Ich kann nur keine Daten auslesen, die von einer anderen Seite eingetragen wurden. (Jede Seite ruft unterschiedliche Methoden in unterschiedlichen Feldern der Datenklasse auf). Ich hoffe ich habe Deine Anfragen richtig verstanden. Gruß KK
  19. Hi Holzkopp, ich habe folgende Idee, ich erzeuge in meiner Headerdatei der Hauptklasse den Pointer zur Datenklasse: Programm2.h ... class CProgramm2App : public CWinApp { public: CProgramm2App(); class CData *pData; ... wenn ich die Variable gleich mit deklarieren möchte, sagt er: error C2079: 'mData' verwendet undefiniertes class 'CData' also deklariere ich mData in der cpp-Datei vom Hauptprogramm: Programm2.cpp #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CProgramm2Dlg Dialog1; CDialog2 Dialog2; CParent ParentSheet("Test"); CData m_Daten; pData=&m_Daten; ParentSheet.AddPage(&Dialog1); ParentSheet.AddPage(&Dialog2); m_pMainWnd = &ParentSheet; int nResponse = ParentSheet.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } return FALSE; } Ich möchte nun in meinen Seitenklassen Pointer zur Hauptklasse setzen: Programm2Dlg.h: (der Dialog dieser Klasse ist die erste Seite in meinem Programm) class CProgramm2Dlg : public CPropertyPage { public: CProgramm2Dlg(CWnd* pParent = NULL); // Standard-Konstruktor CProgramm2App *pProg,m_Prog; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung protected: HICON m_hIcon; virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() }; Einen Pointer (*pProg) auf die Hauptklasse kann ich so erzeugen, bei der Variablen (m_Prog) sartet er das Programm gar nicht erst sondern sagt: Debug assertion failed! Letzendlich möchte ich dann über den Pointer auf die Hauptklasse mit dem dort vorhandenen Pointer auf die Datenklasse Zugriff zu den Methoden der Datenklasse erhalten. Wenn ich das so bei allen Seiten mache, wäre dann sichergestellt, dass ich von allen Seiten auf alle Daten der Datenklasse zugreifen kann? Gruß KK
  20. Eeeehm sorry ich meinte natürlich Klotzkopp, ich hab jetzt versucht das Problem irgendwie zu lösen, ich kriegs aber nicht auf die Palette. Da das ganze seit mehreren Tagen so geht, drückt das doch ordentlich auf die Moral. Ich kann in der Headerdatei meiner Hauptprogrammdateien (Programm2.cpp und Programm.h) keine Variablen einer anderen Klasse einbinden, da alle Klassen in der cpp-Datei erst nach der Hauptprogrammdatei stehen müssen. z.B., so muss es sein: # include Programm2.h //Hauptprogrammklasse # include Daten.h //Datenklasse # include PropertySheet.h # include Page1.h # include Page2.h es geht nicht: # include Daten.h //Datenklasse # include Programm2.h //Hauptprogrammklasse # include PropertySheet.h # include Page1.h # include Page2.h da das so ist, kann ich keine Variable oder Pointer in der Programm2.h erzeugen, die zum Beispiel, wie in meinem gewollten Fall, auf die Datenklasse zeigen. Wenn ich aber nun den Pointer und die Variable nicht in der Headerdatei unterbringen kann, sondern nur lokal in der cpp-Datei, dann kann ich von den Seiten (Page1, Page2) mit Pointern auf die Hauptprogrammklasse CProgramm2 *Hauptklasse, m_Haupt) nicht auf den Pointer zur Datenklasse zugreifen, weil dieser nicht in der Headerdatei steht. Ich hatte dann als Idee eine neue Klasse zu erzeugen, die ich im Headerlisting vor die Datenklasse setzen kann und die dann den einzigen Pointer zur Datenklasse setzt. Aber dann hüpfe ich von meinen Seitenpointern über den NeuKlassenPointer auf die Methode der Datenklasse und erzeuge wieder unterschiedliche Objekte. Kurz gesagt, ich bin zur Zeit ratlos, wie ich das Anpacken muss. In den Büchern die ich habe, wird alles nur an simplen Beispielen erklärt, die auf die komplexeren Probleme nicht mehr anwendbar sind und ich habe als armer Student nicht das Geld mir neue Bücher zu kaufen, in der Hoffnung, dass das irgendwo mal erklärt wird. Daher hoffe ich, dass ein erfahrener Programmierer Licht ins Dunkel bringen kann. Gruß und Dank KK
  21. Hi Kampfklotz, da habe ich mich wohl missverständlich ausgedrückt. Als ich schrieb, Du mögest mir bei Deiner Idee unter die Arme greifen, meinte ich Deine Idee mit der Verbindung zur Datenklasse in dem Hauptprogramm und nicht den static-Variabeln. Auch wenn das mit den static-Variabeln wahrscheinlioch einfacher ist, kommt es mir doch unsauber vor. Könntest Du mir zeigen, wie ich nun in dem Hauptprogramm die Verbindung herstelle und sicherstelle, dass alle Seiten mit denselben Methoden auf dieselben Datenfelder und Variablen zugreifen?
  22. Hi, @Hexagon, ich habe in dem Hinschreiben schon fast alles ausprobiert. Es kommt aber immer eine Fehlermeldung, vermutlich wegen der Sache, die Klotzkopf schrieb. @Klotzkopf Ich bin bei der static-Methode geblieben, weil sie mir einfacher erschien. Wäre nett wenn Du mir bei deiner Idee ein bisschen unter die Arme greifen könntest. Ich habe eine PropertySheet-Klasse, über die die Pages einggliedert werden (Da die CPropertySheet nicht verändert, sondern einfach nur erstellt wird, poste ich sie nicht.) Mein Hauptprogramm, indem dann die Seiten erstellt werden, sieht so aus: Ich habe meinen Entwurf Programm2 genannt! Programm2.cpp #pragma once #include "stdafx.h" #include "Programm2.h" #include "Daten1.h" //Datenklasse #include "Parent.h" //CPropertySheet #include "Programm2Dlg.h" //CPropertyPage #include "Page2.h" //CPropertyPage #ifdef _DEBUG #define new DEBUG_NEW #endif BEGIN_MESSAGE_MAP(CProgramm2App, CWinApp) ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() CProgramm2App::CProgramm2App() { } CProgramm2App theApp; BOOL CProgramm2App::InitInstance() { InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen")); CProgramm2Dlg Dialog1; Page2 Dialog2; CParent Parentsheet("Test"); Parentsheet.AddPage(&Dialog1); Parentsheet.AddPage(&Dialog2); m_pMainWnd = &Parentsheet; int nResponse = Parentsheet.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } return FALSE; } Wenn ich dich richtig verstanden habe, muss ich im Hauptprogramm jetzt schon die Verbindung zur Datenklasse herstellen. Ich könnte also einem Pointer der Klasse CData die Adresse einer Variablen der Klasse CData zuweisen und dann von den Seiten auf den Pointer zugreifen. Dieses kann ich aber vermutlich nicht in der Headerdatei (Programm2.h) machen, da dafür im Anfang von Programm2.cpp die Daten-Headerdatei (Daten.h) vor der Hauptprogrammheaderdatei (Programm2.h) reingeschrieben werden müsste, was nicht geht. Wie erzeuge ich nun eine eindeutige Verbindung zur Datenklasse? Gruß und Dank KK
  23. Hallo Hexagon, das habe ich auch schon probiert, da kommen dann folgende Fehlermeldungen: Daten.obj : error LNK2001: Nichtaufgeloestes externes Symbol "protected: static class CString CDaten::Titel" (?Titel@CDaten@@1VCString@@A) TestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol "protected: static class CString CDaten::Titel" (?Titel@CDaten@@1VCString@@A) Debug/Test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise In den Tutorials und Erklärungen stand drin, dass man die Variable genau so (CString CData::Titel="XXX")definieren muss. Leider gibt er dann bei mir die Fehlermeldung vom Vorpost raus. Gruß KK
  24. Hallo Klotzkopf, hier meinen Code der Headerdatei: class CDaten : public CDialog { // Konstruktion public: CDaten(CWnd* pParent = NULL); // Standardkonstruktor static void SetValue(CString Value){Titel=Value;} static CString GetValue(){return Titel;} // Dialogfelddaten //{{AFX_DATA(CDaten) enum { IDD = IDD_DIALOG1 }; //}}AFX_DATA // Überschreibungen // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(CDaten) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: // Generierte Nachrichtenzuordnungsfunktionen //{{AFX_MSG(CDaten) // HINWEIS: Der Klassen-Assistent fügt hier Member-Funktionen ein //}}AFX_MSG DECLARE_MESSAGE_MAP() static CString Titel; }; und hier meine cpp-Datei Fehlermeldung: error C2655: 'Titel' : Definition oder Neudeklaration im aktuellen Gueltigkeitsbereich unzulaessig Das ist natürlich nicht das eigentlich Programm, an dem ich arbeite, sondern nur ein kleines Programm um an dem Problem zu arbeiten. In meinem richtigen Programm habe ich mehrere Datenfelder, doch wenn das hier funktioniert, kann ich es 1:1 in meinem Programm adaptieren. Was habe ich falsch gemacht? Gruß KK
  25. Hi Trux, danke für die Antwort, dein Vorschlag hört sich gut an. Ich habe nur noch ein Problem. static läst sich unter VC++ nicht so einbinden wie unter C++. In einem Tutorial stand, dass man zu der Variablen (static CString Text; ) auch noch die Definition der static-Variablen vornehmen muss (CString CData::Text=""; ). In VC++, deklariere ich die Variable in der Headerdatei. In der cpp-Datei initialisiere ich dann im Konstruktor die Variablen, wenn ich dort aber nun die Definition für die static-Variable Text eintrage, meckert der Compiler verständlicherweise, weil ich Text nochmal CString zuweise. Diese Schreibweise um eine static-Variable zu definieren stand aber in mehreren c++Tutorials. Kannst du mir sagen, was ich bei VC++ anders machen muss? Gruß KK

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...