Erhalten Sie die Koordinaten einer WM_NCHITTEST-Nachricht?

7

Wie bekomme ich die Koordinaten einer WM_NCHITTEST Nachricht in C # -Code?
Ich würde gerne den schnellsten Weg gehen, weil Leistung eine Voraussetzung ist.

    
Vercas 17.12.2010, 14:12
quelle

3 Antworten

11

Von MSDN:

  

wParam
    Dieser Parameter wird nicht verwendet.

     

lParam
  Das niederwertige Wort gibt an   die X-Koordinate des Cursors. Das   Koordinate ist relativ zu   obere linke Ecke des Bildschirms.
  Das höherwertige Wort spezifiziert das   Y-Koordinate des Cursors. Das   Koordinate ist relativ zu   obere linke Ecke des Bildschirms.

Sie müssen also nur die Wörter niedrigerer und höherer Ordnung aus dem lParam der Nachricht extrahieren:

%Vor%

Ich würde mir keine Sorgen über die Leistung machen, da diese Operationen nur Bit-Level-arithmetisch sind ...

Beachten Sie, dass diese Koordinaten relativ zum Bildschirm sind. Wenn Sie Koordinaten relativ zu einem Steuerelement (oder Formular) möchten, können Sie die Methode PointToClient verwenden:

%Vor%     
Thomas Levesque 17.12.2010, 14:16
quelle
12

Bis heute Morgen hätte ich 100% mit Thomas Levesques geantwortet, ich habe die gleiche Information von msdn übernommen und der Code (scheinbar) hat perfekt funktioniert. Aber es gibt einen Fall, in dem dich das beißen wird. Ich brauchte drei Stunden, um den Grund für diesen Nachmittag zu finden.

Das Symptom, das ich hatte, war, dass mein Steuerelement auf einer meiner Entwicklungsmaschinen innerhalb der VS2010-IDE nur durch Anklicken ausgewählt werden konnte, wenn ich es an einer bestimmten y-Position anklickte. Sehr kleine Steuerelemente am oberen Rand des Formulars konnten durch Klicken überhaupt nicht ausgewählt werden. Die Größe der Region, die nicht anklickbar war, sah identisch mit der Größe der IDE um den Windows Forms-Designer aus, so dass ich zuerst dachte, ich hätte ein seltsames wenig bekanntes DesignMode-Problem. Das verwirrendste Bit war, dass genau das gleiche Projekt (aus TFS auf einem anderen Computer ausgecheckt) dieses Verhalten nicht zeigen würde.

Folgendes geschieht:

Stellen Sie sich vor, Sie haben ein Doppelmonitor-Setup wie hier gezeigt (Entschuldigung für den deutschen Screenshot, ich habe kein englisches Betriebssystem zur Hand):

Wie Sie sehen können, befindet sich die obere linke Ecke von Monitor 2 in Koordinaten (1280, -256). Wenn Sie die oben gezeigte Lösung verwenden, erhalten Sie ein y von etwa 65505, wenn die Maus wirklich bei -30 ist. Dies liegt daran, dass die Positionen als hohe und niedrige Ordnung WORD von LParam gespeichert sind. Wenn Sie also (lParam.ToInt32() & 0xFFFF0000) >> 16 eingeben, erhalten Sie die korrekten Bits für die y-Position. Wenn Sie dies in int umwandeln, ergibt dies 65505, da Sie in den falschen Datentyp umgewandelt haben.

Lösung:

%Vor%

Casting to short gibt Ihnen die richtigen Positionswerte. Ich habe auch das x gewirkt, da Sie Ihre Monitore so anordnen können, dass der zweite Monitor von dem Hauptmonitor übrig bleibt und somit die x-Position das gleiche Problem hat.

Ich habe kürzlich festgestellt, dass einer der Konstruktoren von Point für Sie arbeiten wird. Also, die kurze Version ist:

%Vor%     
takrl 17.06.2011 16:16
quelle
7

Ich weiß, dass diese Frage schon beantwortet wurde und alles andere als ...

%Vor%

System.Drawing.Point verfügt jetzt über einen Konstruktor, der speziell entworfen wurde, um diesen genauen Wert zu akzeptieren. Streng genommen denke ich, dass dies wahrscheinlich der einfachste Weg ist.

Um ganz ehrlich zu sein, ich habe keine Ahnung, ob dieser Konstruktor überhaupt existierte, als die anderen Antworten gepostet wurden.

Dass alles gesagt wird, ist wahrscheinlich nicht schneller , weil takrls Antwort fast sicher ist, was der oben erwähnte Konstruktor ohnehin intern tut.

    
Joshua Pech 29.11.2014 21:22
quelle

Tags und Links