2009-04-18 7 views
0

Ich muss einige Probleme beheben und Formular-Designer, die vor langer Zeit für ein Datenbankprojekt geschrieben wurden, verzaubern. Klassencode In Design Platte begegnete ich diese ZeilenBenutzerdefinierter Formulardesigner, Steuerelemente verschieben/Größe ändern unter Verwendung von WinAPI

private void DesignPanel_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     (sender as Control).Capture = false; 
     switch (FMousePosition) 
     { 
     case MousePosition.mpNone: 
      SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF009, 0); 
      break;// Move 
     case MousePosition.mpRightBottom: 
      SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF008, 0); 
      break;//RB 
     case MousePosition.mpLeftBottom: 
      SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF007, 0); 
      // ... here are similar cases ... 
     case MousePosition.mpLeft: 
      SendMessage((sender as Control).Handle, WM_SYSCOMMAND, 0xF001, 0); 
      break;//L 
     } 
    } 
} 

FMousePosition zeigt an, ob die Maus über jede Kante der ausgewählten Kontrolle.

Was mich verwirrt ist diese Windows-Nachrichten: Es scheint, es gibt keine Dokumentation auf WM_SYSCOMMAND mit Parametern 0xF001-0xF009 (vielleicht startet es eine Art 'Drag/Resize-Sequenz'). Irgendwelche Ideen?

Wenn mein Vorschlag richtig ist, wie kann ich diese Sequenzen dann abbrechen?

Antwort

2

Sie sind undocumented Parameter. Nach der Suche habe ich diese Liste gefunden.

  • 0xF000 (Mitte Cursor auf dem Formular)
  • 0xF001 (Resize von links)
  • 0xF002 (Resize von rechts)
  • 0xF003 (Resize von oben)
  • 0xF004 (Sperren Sie die untere rechte Ecke des Formulars, die oben links cor ner Schritt für Resize)
  • 0xF005 (Same von unten links)
  • 0xF006 (Lock-up-rechten und linken Rand, die Größe anderer)
  • 0xF007 (Lock-up und rechten Rand, die Größe anderer Grenze)
  • 0xF008 (Lock-links und oben Rand und die Größe andere)
  • 0xF009 (Drag von überall)
  • 0xF010 (Cursor an der oberen Ordnung zentriert Put)
  • 0xF020 (Auto-Minimieren Form)
  • 0xF030 (Auto-Maximize Formular)

Referenz: http://www.delphi3000.com/articles/article_1054.asp#Comments

1

Basierend auf meinem Win32 Programmierung (Rector und Newcomer) p902-903 erklärt WM_SYSCOMMAND wird gesendet, wenn der Benutzer ein Element aus dem Systemmenü auswählt (anstatt das normale WM_COMMAND zu senden).

Die MSDN help sagt SC_SIZE = 0xF000 und es und Win32-Programmierung sagen auch Windows verwendet die vier Bits niedriger Ordnung der vordefinierten Systemmenü IDs intern aber nicht weitergehen, deren Nutzung zu klären. Danke stukelly für die Klärung.

Verwandte Themen