2017-10-17 4 views
1

J'ai quelques boutons poussoirs uniques et je veux seulement en montrer un à la fois. Je veux qu'ils soient centrés, donc j'ai le premier bouton-poussoir centré sur le dialogue. Si je veux montrer le 3ème bouton, je veux lui donner les coordonnées des premiers boutons et cacher le 1er bouton.Comment puis-je copier les coordonnées d'une boîte de dialogue dans une autre boîte de dialogue?

Comment puis-je copier des coordonnées de boutons et définir d'autres coordonnées de boutons pour les valeurs copiées?

Ex. Disons que je ...

PB_ONE 
PB_TWO 

Comment puis-je saisir les coordonnées de PB_ONE et de définir les coordonnées de PB_TWO à PB_ONE?

RECT rcButton; 

GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 

Le code ci-dessus saisit l'élément de la boîte de dialogue dont je souhaite copier les coordonnées. Y at-il une commande simple qui définit un autre bouton de dialogue pour les coordonnées de ce dialogue?

quelque chose comme SetDlgItem()?

MISE À JOUR AVEC LE NOUVEAU CODE I Tried BASÉ la réponse

GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 
ClientToScreen(hDlg, &p); 
OffsetRect(&rcButton, -p.x, -p.y); 
SetWindowPos(GetDlgItem(hDlg, PB_TWO), 0, rcButton.left, rcButton.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); 
ShowWindow(GetDlgItem(hDlg, PB_TWO), SW_SHOW); 

doivent remplacer en cours rcButton.left et rcButton.top avec px et une valeur difficile pour rcButton.top pour obtenir le bouton pour positionner sur l'écran de dialogue.

Ceci renvoie une erreur dans SetWindowPos où le paramètre 3 ne peut pas convertir un LONG * en INT.

+0

Assurez-vous que 'p.x = 0; p.y = 0; 'avant d'appeler' ClientToScreen'. Cacher également 'PB_ONE'. Vous avez dit que vous avez déjà changé '& rcButton.left' en' rcButton.left'? –

+0

Oui, je les ai changés. Cependant, ces coordonnées sont toujours hors de l'écran. Je dois utiliser px au lieu de rcButton.left pour obtenir les bonnes positions de boutons – user3622460

Répondre

3

GetWindowRect donne le rectangle en coordonnées d'écran. Vous pouvez convertir cela en coordonnées client en utilisant ScreenToClient(HWND hWnd, LPPOINT lpPoint).


Edit:

RECT rcButton; 
HWND hbutton1 = GetDlgItem(hDlg, PB_ONE); 
HWND hbutton2 = GetDlgItem(hDlg, PB_TWO); 

//if(!hbutton1 || !hbutton2) {error...} 

GetWindowRect(hbutton1, &rcButton); 

//Test 
char buf[50]; 
sprintf(buf, "%d %d", rcButton.left, rcButton.top); 
MessageBoxA(0, buf, "screen coord", 0); 

//Note, this will only convert the top-left corner, not right-bottom corner 
//but that's okay because we only want top-left corner in this case 
ScreenToClient(hDlg, (POINT*)&rcButton); 

//Test 
sprintf(buf, "%d %d", rcButton.left, rcButton.top); 
MessageBoxA(0, buf, "client coord", 0); 

ShowWindow(hbutton1, SW_HIDE); 
SetWindowPos(hbutton2, 0, rcButton.left, rcButton.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); 


Une façon un peu plus simple est d'utiliser ClientToScreen(HWND hWnd, LPPOINT lpPoint) comme suit:

RECT rcButton; 
GetWindowRect(GetDlgItem(hDlg, PB_ONE), &rcButton); 

POINT p{ 0 }; 
ClientToScreen(hDlg, &p); 
//p is now (0,0) of parent window in screen coordinates 
OffsetRect(&rcButton, -p.x, -p.y); 

rcButton est maintenant les coordonnées par rapport au coin supérieur gauche de la fenêtre parent . Vous pouvez l'utiliser dans SetWindowPos.

+0

Cela me donne une erreur avec l'appel SetWindowPos - Param 3 ne peut pas définir un LONG * à un INT – user3622460

+0

Ma faute - J'utilisais & - code fonctionne bien. Le bouton n'est pas à l'écran, je suppose qu'il est à 0,0? – user3622460

+0

Essayez la section * Modifier *. Vous devez utiliser les points de rupture de débogage ou 'OutputDebugString' pour voir les valeurs que vous obtenez. Si possible, déplacez la boîte de dialogue vers le coin supérieur gauche de l'écran du bureau, afin que les coordonnées de l'écran et du client soient à peu près les mêmes (ce qui est utile uniquement pour les tests). –