Keien Variable für PictureBox anlegen, aber trotzdem über ID zugreifen können



  • Hallo,

    ich habe ein Programm, in dem ich 200 PictureBoxen hab. Ich benutze eine Klasse CpictureCtrl die von CStatic abgeleitet ist. Daher sind die PictureBoxen eigentlich CStatic Text.

    Ich habe in einer Struktur einen Zeiger CPicture angelegt. Mit diesem will ich nun über ein Array die 200 Felder über eine for - Schleife initialisieren. Das ganze ist kein Problem und funktioniert solange ich für die einzelnen Felder vorab eine Variable angelegt habe und die PictureBoxen in DoDataExchange() auftauchen. Jetzt möchte ich aber nicht für alle 200 Felder eine extra Variable anlegen, da ich die später sowieso nicht mehr brauche. Ist aber keine Variable angelegt, kann das Feld nicht initialisiert werden. Ich denke also, das Problem liegt darin, dass das Feld nicht in DoDataExchange() als DDX_Control auftaucht.

    Weiß jemand wie ich das Problem lösen kann, ohne dass ich für alle 200 PictureBoxen eine Variable anlegen, die ich dann später sowieso nicht mehr brauche?

    Vielen Dank im Vorraus!!!



  • schau dir GetDlgItem() an, damit kannst du über die ID des Ctrl drauf zu greifen, nur entsprechend den Zeiger den du zurückbekommst, auf deine Ctrl-Klasse casten. Würde natürlich sinnvoll sein wenn die ID´s deiner Ctrl´s hintereinander liegen, an sonnsten würde ich das über ein Array lösen und dort die ID´s der 200 Ctrl´s eintragen



  • Hallo,

    vielen Dank für deine Antwort. Ich benutze GetDlgItem() schon. Und mach es dann genauso wie du gesagt hast. Das funktioniert aber bei mir nur, wenn die Felder als DDX_Control in DoDataExchange() auftauchen. Ich poste einfach mal:

    void CSchiffeversenkenTestView::DoDataExchange(CDataExchange* pDX)
    {
    	CFormView::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_STATIC1, m_picture1);
    	DDX_Control(pDX, IDC_STATIC10, m_picture2);
    	DDX_Control(pDX, IDC_STATIC3, m_picture3);
    	DDX_Control(pDX, IDC_STATIC4, m_picture4);
    	DDX_Control(pDX, IDC_STATIC5, m_picture5);
    	DDX_Control(pDX, IDC_STATIC6, m_picture6);
    	DDX_Control(pDX, IDC_STATIC7, m_picture7);
    	DDX_Control(pDX, IDC_STATIC8, m_picture8);
    	DDX_Control(pDX, IDC_STATIC9, m_picture9);
    }
    
    void CSchiffeversenkenTestView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    	CString file = _T("wasser.jpg");
    	int i = 0;
    	for (i = 0; i<9; i++)
    	{
    		felddaten[i].clicked = 0;
    		felddaten[i].schiff = false;
    		felddaten[i].treffer = false;
    		felddaten[i].m_picture = (CPictureCtrl*) GetDlgItem(IDC_STATIC1 + i);
    		felddaten[i].m_picture->LoadFromFile(file);
    		felddaten[i].anzahlSchiffFelder = 0;
    	}
    }
    

    So funktioniert das ganze. Ist jetzt ein kleines Testprogramm. In meinem richtigen Programm sind das wie gesagt 200 Felder.
    Wenn ich nun die Zeilen in DoDataExchange() auskommentiere, stürzt er an der Stelle, an der ich das Bild laden will auf die Nase, da er vorher keinen brauchbaren Handle zurück bekommt.



  • das ist ja ganz klar, durch deine Members die du mit DDX_Control und so weiter nutzt wird eine Klasse entsprechenden Typs angelegt, also hast du dann auch im Headerfile CPictureCtrl m_picture1 stehen, also existiert dann auch die Klasse, wenn du das jetzt weg lässt, existiert die klasse nicht und der geht beim LoadFile (erste Funktion die aus der klasse genutzt wird) an die Wand.
    Erzeug für jedes der 200 CPictureCtrl eine entsprechendes Objekt und die sache wird auch ohne DDX und Membervariable laufen, Subclassing niucht vergessen.


Anmelden zum Antworten