Position einese Dialogfeldelementes

McGil

Grünschnabel
Hallo,

ich möchte die genaue Postition eines Dialogfeldelementes auslesen.
Das Dialogfeldelement ist glaub ich eine PictureBox (in der Toolbox steht Picture Control) und Teil einer ganz einfachen dialogbasierenden MFC-Anwendung.

Mein bisheriger Code:
Code:
CRect chart_rect;
m_chart_ctrl.GetWindowRect(chart_rect);
m_chart_ctrl.ScreenToClient(chart_rect);
ich hatte irgendwo gelesen, dass ich aus die absolute Position (die ich mit GetWindowRect auslese) durch ScreenToClient in die Position im Dialogfenster umwandeln kann. Doch leider erhalte ich dadurch für chart_rect die selben Angaben (Größe des Dialogelemntes?) wie für chart_rect_size bei folgendem Code:
Code:
CRect chart_rect_size;
m_chart_ctrl.GetClientRect(chart_rect_size);
Ich hoffe es hat jemand von euch ein Lösung

McGil
 
Hi ...

Ich weiss nicht ob es eine elegantere Möglichkeit gibt (wahrscheinlich, aber ich bin einfach zu doof), aber ich habs so gelöst:

Code:
RECT rect_main,rect_client;

GetWindowRect(hwnd_main,&rect_main);
GetWindowRect(hwnd_client,&rect_client);

SetRect(&rect_client,
             rect_client.left - rect_main.left,
             rect_client.right - rect_main.right,
             rect_client.top - rect_main.top,
             rect_client.bottom - rect_main.bottom);

Hoffe das ist jetzt so richtig ausm Kopf ...
Natürlich auf Klasse CRect übertragen, aber sollte ähnlich funktionieren ...
 
Zuletzt bearbeitet:
Hallo,

GetWindowRect kann bei mir nur ein Argument aufnehmen (LPRECT lpRect)

ich hab dann folgendes ausprobiert:
Code:
CRect rect_main,rect_client;
GetDlgItem(IDD_TEST1_DIALOG)->GetWindowRect(&rect_main);
GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect_client);
Er hält dann aber in der ersten GetDlgItem Zeile an und ich bekomme eine Fehlermeldung:
Unhandled exception at 0x7c28e64a (mfc71d.dll) in Test1.exe: 0xC0000005: Access violation reading location 0x00000020.

woran könnte das denn liegen?
 
Mit GetDlgItem(IDD_TEST1_DIALOG)->GetWindowRect(&rect_main);
möchtest du die Koordinaten des Dialogs holen, nehm ich mal an.

Dann darfst du nicht GetDlgItem(IDD_TEST1_DIALOG) verwenden.

Mit GetWindowRect(&rect_main); allein erhältst du die Koordinaten des Dialogs, wenn du den Code in der Dialogklasse ausführst.
 
Du holst die Koordinaten des Elements mit GetWindowRect und rechnest diese dann in relative Koordinaten um mit ScreenToClient (von der Dialogklasse).

Code:
CRect chart_rect;
GetDlgItem(IDC_PICTURE)->GetWindowRect(&chart_rect);
ScreenToClient(&chart_rect);
 
Zurück