AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [MASM] GetClientRect funktioniert nicht richtig
Thema durchsuchen
Ansicht
Themen-Optionen

[MASM] GetClientRect funktioniert nicht richtig

Ein Thema von ferby · begonnen am 14. Feb 2009 · letzter Beitrag vom 14. Feb 2009
Antwort Antwort
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

[MASM] GetClientRect funktioniert nicht richtig

  Alt 14. Feb 2009, 00:18
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.
GetClientRect Function
RECT Structure

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:
.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
Danke,
Ferby
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: [MASM] GetClientRect funktioniert nicht richtig

  Alt 14. Feb 2009, 00:39
Hallo ferby,

hast du die Dokumentation richtig gelesen?

Zitat von MSDN:
Pointer to a RECT structure that receives the client coordinates. The left and top members are zero. The right and bottom members contain the width and height of the window.
Vielleicht möchtest du ja die Funktionen GetWindowRect und MapWindowPoints verwenden.

Gruß Hawkeye
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#3

Re: [MASM] GetClientRect funktioniert nicht richtig

  Alt 14. Feb 2009, 01:16
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?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: [MASM] GetClientRect funktioniert nicht richtig

  Alt 14. Feb 2009, 11:47
Hallo ferby,

Zitat:
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?
Deshalb habe ich dir ja die Funktion MapWindowPoints empfohlen:

Delphi-Quellcode:
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;
Gruß Hawkeye
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#5

Re: [MASM] GetClientRect funktioniert nicht richtig

  Alt 14. Feb 2009, 14:59
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz