Buttons nach OnPaint an neuer Stelle erscheinen lassen

fh_study

Erfahrenes Mitglied
Hallo zusammen,

als erstes muss ich anmerken, dass ich mich erst heute in ms vc++ eingearbeitet habe. Also bitte über ganz dumme Fehler hinweg sehen.
Ich bin grad dabei ein kleines Übungsprogramm (für's Studium) zu schreiben, welches eigentlich nichts anderes können soll als dieses berühmte Verschiebespiel darzustellen, sprich: in einer 4 mal 4 Matrix sind 15 Button's und 1 Feld frei. In das freie Feld sollen die Button's "hineingeschoben" werden können.

Nun mein Problem:
Habe zunächst eine Funktion geschrieben, die die 15 Buttons willkürlich anordnet:
Code:
void buttons()
{
	tempx = 75;
	tempy = 60;
	srand((unsigned)time(NULL));
	for(n=0;n<16;n++)
		{
		btn_number = 1 + rand() % 16;
		while(btn_pos_x[btn_number])
			{
			btn_number = 1 + rand() % 16;
			}
		btn_pos_x[btn_number] = tempx;
		btn_pos_y[btn_number] = tempy;
		tempx = tempx + 40;
		if(n == 3) { tempy = tempy+40; tempx = 75; }
		if(n == 7) { tempy = tempy+40; tempx = 75; }
		if(n == 11) { tempy = tempy+40; tempx = 75; }
		}
}

dann eine, die die neue Position des zu verschiebenden Buttons und die neue Position des leeren Feldes nach einem Klick auf den entsprechenden Button berechnet.
Code:
void CSpielFrame::move(int x)
{
	//Überprüfung auf Verschiebbarkeit
	verschiebbar = 0;
	//anzahl++;
	if((btn_pos_x[x]-40) == btn_pos_x[16] && btn_pos_y[x] == btn_pos_y[16]) //verschiebung nach links möglich?
	{
		verschiebbar = 1;
	}
	if((btn_pos_x[x]+40) == btn_pos_x[16] && btn_pos_y[x] == btn_pos_y[16]) //verschiebung nach rechts möglich?
	{
		verschiebbar = 1;
	}
	if(btn_pos_x[x] == btn_pos_x[16] && (btn_pos_y[x]-40) == btn_pos_y[16]) //verschiebung nach oben möglich?
	{
		verschiebbar = 1;
	}
	if(btn_pos_x[x] == btn_pos_x[16] && (btn_pos_y[x]+40) == btn_pos_y[16]) //verschiebung nach unten möglich?
	{
		verschiebbar = 1;
	}
	//wenn verschiebung möglich, dann führe Funktion aus
	if(verschiebbar == 1)
	{
		btn_pos_x[0] = btn_pos_x[16]; //Zwischenspeicherun Position x des leeren Feldes
		btn_pos_y[0] = btn_pos_y[16]; //Zwischenspeicherun Position y des leeren Feldes
		btn_pos_x[16] = btn_pos_x[x]; //Position des Buttons an leeres Feld
		btn_pos_y[16] = btn_pos_y[x];
		btn_pos_x[x] = btn_pos_x[0]; //Position des leeren Feldes an Button
		btn_pos_y[x] = btn_pos_y[0];
	}
}

dann wird das ganze Fenster mit Buttons erzeugt:
Code:
CSpielFrame::CSpielFrame()
{
	if(btn_pos_x[1]) { } //hier wird geprüft, ob das spiel neu gestartet wurde
	else { buttons(); } //wenn ja rufe Funktion buttons auf
	anzahl++;
	Create(NULL, "Verschiebespiel",
			WS_OVERLAPPEDWINDOW - WS_THICKFRAME,
			CRect (CPoint(100,100),CSize(320,320)));
	CBtnSpiel1.Create("1",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[1],btn_pos_y[1]), CSize (40,40)),
						this, IDC_BTN_SPIEL1);
	CBtnSpiel2.Create("2",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[2],btn_pos_y[2]), CSize (40,40)),
						this, IDC_BTN_SPIEL2);
	CBtnSpiel3.Create("3",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[3],btn_pos_y[3]), CSize (40,40)),
						this, IDC_BTN_SPIEL3);
	CBtnSpiel4.Create("4",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[4],btn_pos_y[4]), CSize (40,40)),
						this, IDC_BTN_SPIEL4);
	CBtnSpiel5.Create("5",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[5],btn_pos_y[5]), CSize (40,40)),
						this, IDC_BTN_SPIEL5);
	CBtnSpiel6.Create("6",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[6],btn_pos_y[6]), CSize (40,40)),
						this, IDC_BTN_SPIEL6);
	CBtnSpiel7.Create("7",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[7],btn_pos_y[7]), CSize (40,40)),
						this, IDC_BTN_SPIEL7);
	CBtnSpiel8.Create("8",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[8],btn_pos_y[8]), CSize (40,40)),
						this, IDC_BTN_SPIEL8);
	CBtnSpiel9.Create("9",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[9],btn_pos_y[9]), CSize (40,40)),
						this, IDC_BTN_SPIEL9);
	CBtnSpiel10.Create("10",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[10],btn_pos_y[10]), CSize (40,40)),
						this, IDC_BTN_SPIEL10);
	CBtnSpiel11.Create("11",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[11],btn_pos_y[11]), CSize (40,40)),
						this, IDC_BTN_SPIEL11);
	CBtnSpiel12.Create("12",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[12],btn_pos_y[12]), CSize (40,40)),
						this, IDC_BTN_SPIEL12);
	CBtnSpiel13.Create("13",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[13],btn_pos_y[13]), CSize (40,40)),
						this, IDC_BTN_SPIEL13);
	CBtnSpiel14.Create("14",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[14],btn_pos_y[14]), CSize (40,40)),
						this, IDC_BTN_SPIEL14);
	CBtnSpiel15.Create("15",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
						CRect (CPoint (btn_pos_x[15],btn_pos_y[15]), CSize (40,40)),
						this, IDC_BTN_SPIEL15);
	text = "Verschiebespiel";
	text2 = "Bringe die Felder in die richtige Reihenfolge!";
	mstr = "";
	astr = "Anzahl der Züge: 1";
};

und zu guter letzt das OnPaint:
Code:
void CSpielFrame::OnPaint()
{
	CSpielFrame();
	CPaintDC dc(this);
	dc.Rectangle (73,58,237,222);
	dc.TextOut (103,10,text);
	dc.TextOut (10,25,text2);
	dc.TextOut (20,240,mstr);
	dc.TextOut (20,265,astr);
}

Die Funktionen laufen auch alle, das Fenster mit den Buttons wird auch angezeigt, aber leider verschieben sich die BUTTONS NICHT !
Ach so, die Funktion move() wird durch einen ON_BN_CLICKED ... ausgelöst und das passt soweit auch alles, nur die Buttons werden nicht neu gezeichnet.

HILFE
 
Zuletzt bearbeitet:
Es reicht nicht, die Koordinaten im Array zu ändern, die betroffenen Buttons dann mittel SetWindowPos auf die neue Position setzen.
 
...hmm - bin ich zu blöd zu

hab mal testweise diese Zeile in meiner OnPaint ergänzt:

bool SetWindowPos(CBtnSpiel1);

aber bringt nix...

wobei ich als Beschreibung von SetWindowPos folgendes gefunden habe:

Die SetWindowPos Funktion ändert die Größe, die Position und die Reihenfolge der untergeordneten Fenster. Kind-, Pop-up- und Top-Level-Fenster werden nach ihrer Darstellung auf dem Bildschirm geordnet. Das oberste Fenster erhält den höchsten Rang und ist das erste Fenster in der Z-Ordnung

?
 
SetWindowPos ist etwas unübersichtlich, wahrscheinlich ist MoveWindow einfacher (gibt's aber nur unter MFC).

Sieht dann so aus:

CBtnSpiel2.MoveWindow( x, y, breite, hoehe );
 
It works, danke! Hab mir vor lauter verzweiflung gestern ein Buch bestellt, aber das brauche ich eh noch, schlimm wenn man keine Ahnung hat ;)
 

Neue Beiträge

Zurück