Erster Parameter von SetWindowPos
-
Hi Leutz,
ich bin hab grad n Dialogfeld erstellt und darauf 2 Buttons montiert (Button 1 und Button 2).
Wenn ich auf Button1 klicke möchte ich die Position und Grösse von Button 2 verändern.
Dazu benutze ich SetWindowPos.
Wenn ich in der onClichfunktion von Button 1 den 1. Parameter von SetWindowPos auf NULL setze ändert sich die Position und die Grösse von Button 1.
Als 1. Parameter erwartet SetWindowPos >>> const CWnd* pWndInsertAfter <<<, wenn ich das richtig verstehe also einen Pointer auf das zu ändernde Objekt also in meinem Falle eigentlich Button 2.
Aber wo kriege ich den denn her und wie muss das aussehen dass es klappt.Vielen Dank schon mal vorab
ShadowEater
-
Nein! Der erste Parameter ist das Fensterelement nachdem dieses Fenster eingefügt wird.. Es gibt eine Reihenfolge von Fenster. In einem Dialog ist dies die Tab-Folge. Den ersten Parameter gibst du also NULL an und SWP_NOZORDER wenn Du die Folge der Controls nicht ändern möchtest.
Andernfalls gibst Du das Fenster an, dass in der Folge vor Deinem zu positioniernden Fenster liegen soll.
-
Hi Thomas,
hmmmmmmmmmalso das mit der Tabreihenfolge ist klar, aber kann ich mit SetWindowPos nicht die Position eines x-beliebigen Controls in meinem Steuerelement ändern ?
Soweit die MSDN:BOOL SetWindowPos(
HWND hWnd, <<<----------- Muss hier nicht der HANDLE des betr. zu ändernden Fensters(Controls stehen)
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags);
hWnd
[in] Handle to the window.Meine Funktion:
void CTestLschenDlg::OnTest() { m_ctlTest.SetWindowText ("TestText"); m_ctlTest.SetWindowPos (NULL,50,60,20,20,NULL); }
|
|
Handle auf Control das geändert werden soll?Vielen Dank schon mal vorab
ShadowEater
-
Es gibt zwei Funktionen mit dem Namen SetWindowPos(), die du sorgfältig unterscheiden mußt*:
::SetWindowPos(HWND,HWND,...);
die bekommt als ersten Parameter das Handle auf das Fenster, das verschoben werden soll.CWnd::SetWindowPos(const CWnd*,...);
hier entfällt der erste Parameter - die Methode verschiebt das Fenster, für das sie aufgerufen wurde
(Anmerkung: Dabei zählen auch deine Dialog-Elemente als "Fenster")
Die CWnd-Methode nimmt sich das eigene Fenster-Handle und das Handle des übergebenen CWnd-Objekts und ruft mit diesen Werten die globale Funktion auf.(übrigens solltest du als letzten Parameter nicht NULL übergeben, sondern SWP_NOZORDER - sonst hast du Probleme, wenn dein Control hinter dem NULL-Fenster eingereiht werden soll)
* die MFC-Klassen sind ein Wrapper um die WinAPI, dmit gilt das gesagte für fast alle WinAPI-Klassen.
-
Hi CStoll,
danke, so langsam klärt sich einiges
Es ist also von der Funktionalität (...bei klick aut Button 1 wird Button 2 verschoben) ziemlich egal welche fnkt ich benutze?::SetWindowPos(HWND,HWND,...);
die bekommt als ersten Parameter das Handle auf das Fenster, das verschoben werden soll.*Aber wie komm ich denn an den Handle von Button 2 ?
Vielen Dank schon mal vorab
ShadowEater
-
Den brauchst du doch gar nicht, solange du die Z-Order deiner Dialogelemente nicht ändern willst:
void CTestLschenDlg::OnTest() { m_ctlTest.SetWindowText ("TestText"); m_ctlTest.SetWindowPos (NULL,50,60,20,20,SWP_NOZORDER); }
Wenn du ihn unbedingt benötigst, findest du ihn als Membervariable m_hWnd in jedem CWnd-Objekt.
-
Sry aber ich tret auf der Stelle
,
ich brauch doch den handle von Button 2 um diesen im onklick Ereignis von Button 1 zu ändern ???.
...ratlos und verwirrt...
ShadowEater
-
Du hast deine Buttons m_btn1 und m_btn2, soweit richtig? Also ist es doch kein Problem, aus dem BTN1-Handler heraus Methoden beider Buttons aufzurufen (und das schließt die von CWnd geerbten Methoden mit ein).
Nochmal langsam:
Der erste Parameter der globalen Funktion bzw. der this-Zeiger der CWnd-Methode gibt das Fenster an, das du verschieben willst.
Der zweite Parameter der globalen Funktion bzw. der erste Parameter der CWnd-Methode gibt an, wo in der Z-Order dieses Fenster eingeordnet werden soll (da du die logische Reihenfolge der Buttons nicht ändern willst, übergibst du hier einfach NULL und als letzten Parameter SWP_NOZORDER).
-
OHHHH GOTT,
D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*KE
*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*
D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E
*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E*D*A*N*K*E
CStoll for President, ehrlich, noch besser CStoll for Chairman of Microsoft
Sorry dass ich so aufm Schlauch gestanden hab aber jetzt klappts, Danke für Deine Geduld und Mühe
ShadowEater