![]() |
[MASM] GetClientRect funktioniert nicht richtig
Hallo,
also ich bin mit meinem Latein am Ende, ich habe ein Fenster + einen Button in MASM erstellt. Jetzt will ich die Größe & Position des Buttons auslesen. Dafür gibt es die API Funktion GetClientRect. ![]() ![]() Das komische ist: Breite und Höhe werden richtig zurückgegeben, aber Left und Top nicht und ich habe leider keine Ahnung warum (Beides ist 0). Hat wer vielleicht Rat?
Code:
Danke,
.386
.model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib .data? hInstance HINSTANCE ? h_window HWND ? h_button HWND ? .data AppNameDefault db "FD3",0 ; Classen Namen btnClass db "BUTTON",0 .code START: Window proc LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL CoordRect: RECT invoke GetModuleHandleA, NULL mov hInstance,eax mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET EVENTS mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE + 1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET AppNameDefault invoke LoadIconA,hInstance,500 mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursorA,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassExA, addr wc INVOKE CreateWindowExA, NULL, ADDR AppNameDefault, ADDR AppNameDefault, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL mov h_window,eax INVOKE ShowWindow, h_window, SW_SHOW INVOKE UpdateWindow, h_window ; ERSTELLE BUTTON invoke CreateWindowExA, NULL, ADDR btnClass, NULL, WS_CHILD or WS_VISIBLE, 150, 150, 150, 150, h_window, ebx, hInstance, NULL mov h_button, eax invoke GetClientRect, h_button, ADDR(CoordRect) ;cmp CoordRect.bottom,0 --> Richtig! cmp CoordRect.left,0 ;--> why NULL??? je @exit_program @infinite_loop: INVOKE GetMessageA, ADDR msg, NULL, 0, 0 ; falls Benutzer Fenster schließt cmp eax, 0 je @exit_program INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessageA, ADDR msg jmp @infinite_loop @exit_program: invoke ExitProcess, 0 Window ENDP EVENTS PROC hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret EVENTS ENDP END START Ferby |
Re: [MASM] GetClientRect funktioniert nicht richtig
Hallo ferby,
hast du die Dokumentation richtig gelesen? Zitat:
![]() ![]() Gruß Hawkeye |
Re: [MASM] GetClientRect funktioniert nicht richtig
Hello,
also das hätte ich nicht gedacht... was hat das wohl für einen Sinn das diese Funktion Left & Top nicht zurückgibt... Also bleibt mir wohl nichts anderes übrig als mit GetWindowRect Button & Form zu hohlen und Form links oben minus Button links oben müssten dann der gesuchte Fehlende Punkt sein. Oder? EDIT: Okay es funktioniert so. Danke. Aber ein Problem habe ich noch, und zwar mit dem Punkt TOP. Weil da ist ja die Titelleiste zwischen den beiden Koordinaten. Also wenn der Button auf Top 0 ist, und sagen wir ich weiß das nicht, dann führe ich GetWindowRect aus und bekomme für das Fenster Position 100 für den Button 110 110 - 100 = 10, obwohl eigentlich 0 rauskommen müsste. Diese 10 sind die Titelleiste. Allerdings weiß ich erstens nicht ob die immer 10px hoch ist (nehm mal an es wird ausnahmen geben) und zweitens kann da ja auch noch ein Menü sein. Wie muss ich hier vorgehen? |
Re: [MASM] GetClientRect funktioniert nicht richtig
Hallo ferby,
Zitat:
Delphi-Quellcode:
Gruß Hawkeye
procedure TForm1.ButtonClick(Sender: TObject);
var R : TRect; begin GetWindowRect(Button.Handle, R); MapWindowPoints(0, Self.Handle, R, 2); // in R.Left und R.Top stehen nun die relativen Koordinaten des Buttons, // falls der Button direkt auf dem Fenster liegt end; |
Re: [MASM] GetClientRect funktioniert nicht richtig
Hallo,
sry, ich hatte die MapWindowPoints funktion nicht ganz kapiert wie ich die genau einsetze. Jetzt funktioniert alles so wie ich will und der quellcode ist sogar kurz geblieben. Vielen Dank
Code:
; Hohle die Controll Points in CoordRect relativ zum linken oberen Fenster Punkt
; h_control = Handle vom Controll ; h_window = Handle vom Window ; CoordRect und CoordRect2 = RECT GET_CONTROL_POINTS macro h_control push eax push ebx ; für top und left invoke GetWindowRect, h_control, ADDR(CoordRect) ; zu relativen coordinaten mappen invoke MapWindowPoints, 0, h_window, ADDR(CoordRect), 2 ; für right (width) und bottom (heigh) invoke GetClientRect, h_control, ADDR(CoordRect2) mov eax, CoordRect2.right mov CoordRect.right, eax mov eax, CoordRect2.bottom mov CoordRect.bottom, eax pop ebx pop eax endm |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz