Fenster verschieben
-
Hallo Spezialisten,
ich habe ein Fenster ohne FormBorderStyle erzeugt und hier eine eigene Grafik verwendet. Inklusiv einer Titelleiste (alles in einer Grafik).
Da ich ohne BorderStyle arbeite, kann ich das Fenster nicht mit der Maus anfassen und verschieben.
Hat jemand eine Idee, wie man das trotzdem hinbekommt, dass das Fenster verschiebbar ist?
-
http://69.10.233.10/KB/miscctrl/Moving_Form.aspx
http://www.codeproject.com/KB/cs/csharpmovewindow.aspxSimon
-
Hallo Simon,
sieht eigentlich ganz nett aus, VC++ 2008 hat auch kaum etwas zu mekern, außer dann, wenn ich die Funktion aufrufen will, dann gibt es eine Fehlermeldung.
Ich habe den Code für VC++ angeasst, wie gelernt. Aber irgendetwas stimmt nicht.
Hier die Abschnitte:
using namespace System::Runtime::InteropServices;
const Int32 WM_NCLBUTTONDOWN = 0xA1;
const Int32 HT_CAPTION = 0x2;[DllImport("user32.dll")]
extern "C" Int32 SendMessage(IntPtr hWnd,Int32 Msg,Int32 wParam,Int32 lParam);
[DllImport("user32.dll")]
extern "C" Boolean ReleaseCapture();private: System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
if (e->Button == System::Windows::Forms::MouseButtons::Left){
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}}
Hiernach erhalte ich aber eine Fehlermeldung:
error C2661: 'System::Windows::Forms::Control::SendMessage': Keine überladene Funktion akzeptiert 4 Argumente
Der Fehler bezieht sich auf die Zeile wo die Funktion MessageSend aufgerufen wird.
Bin ich blind, sehe ich irgendwas nicht?
-
In C++/CLI brauchst Du P/Invoke (=DllImport) nicht.
Du kannst Die Funktionen direkt aufrufen (ev. mit ::SendMessage(..)).
Simon
-
Hallo Simon,
wie ich das auch drehe, das Problem bleibt das gleiche, auch ihne Dll Import.
Der Compilor hat immernoch Probleme mit der Funktion und den vier Argumenten.
Hast Du das mal in VC++ umgebaut?
-
Lass das DllImport Zeugs weg.
Dann probiers mit ::SendMessage (windows.h muss inkludiert sein).
Simon
-
Hallo Simon,
wie Du schon geschrieben hast, habe ich den DllImport weggelassen.
Wenn ich #include <windows.h> angebe, wird auch entlich die Funktion gefunden
(sorry, habe ich in der MSDN übersehen)!Soweit schon mal ok.
Jetzt kann ich aber die Konstanten von vorher nicht mehr nutzten, somit kann ich auch die Argumente nicht mehr übergeben.Was kann ich den der Funktion für Argumente übergeben?
Die Intellisence Funktion schlägt mir die vier Parameter vor, die auch in der MSDN angegeben sind, nur kann ich diese Werte ja nicht eins zu eins verwenden.
Muss ich hier eine Struktur anlegen?
Danke für Deine Hilfe.
-
Auf die Schnelle, mit P/Invoke:
Der Unterschied liegt bei den P/Invoke Dekl.using namespace System::Runtime::InteropServices; // ... static const int WM_NCLBUTTONDOWN = 0xA1; static const int HT_CAPTION = 0x2; [DllImportAttribute("user32.dll")] static int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImportAttribute("user32.dll")] static bool ReleaseCapture(); System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if (e->Button == System::Windows::Forms::MouseButtons::Left) { ReleaseCapture(); SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); } }
Simon
Edit:
Und so gehts ohne P/Invoke:#include <windows.h> #pragma comment (lib, "user32.lib") // ... System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { if (e->Button == System::Windows::Forms::MouseButtons::Left) { ::ReleaseCapture(); ::SendMessage((HWND) Handle.ToPointer(), WM_NCLBUTTONDOWN, HTCAPTION, 0); } }
-
Hallo Simon,
vielen herzlichen Dank. Nun funktionniert es.
Ich habe mal beide Varianten umgesetzt. Bei der ersten, gab es immernoch Probleme, der gleiche Fehler wie zuvor.
Die zweite Anweisung, die Kurze also, funktionierte dann aber auf Anhieb.
Was mir nicht klar ist, war zumindest nirgendwo nachzulesen, ist, welche Argumente man genau übergeben, und welcher Typ das sein muss.
Danke nochmals.