2011-01-02 10 views
9

मैं उस विंडो को कैसे स्थानांतरित करूं जिसमें सीमा नहीं है। आवेदन पर कोई खाली जगह नहीं है, जो उपलब्ध है वह एक वेबब्रोसर और मेनस्ट्रिप है। मैं चाहता हूं कि उपयोगकर्ता मेनू स्ट्रिप खींचकर विंडो को स्थानांतरित करने में सक्षम हों। मैं इसे कैसे कोड करूं? मैंने कुछ कोड ब्लॉक किए हैं जिन्हें मैंने ऑनलाइन पाया है, लेकिन उनमें से कोई भी काम नहीं करता है।सीमा के बिना विंडो ले जाएं

+5

शायद क्योंकि यह आवेदन (या उपयोगकर्ता) के लिए असंभव है 'MenuStrip' पर एक क्लिक के आवेदन स्थानांतरित करने के लिए करना है कि क्या भेद करने के लिए या एक मेनू खोलें। एक कारण है कि खिड़कियों की सीमाएं हैं- आपके डिजाइन पर पुनर्विचार करें। –

उत्तर

14

This कोड प्रोजेक्ट आलेख को पूरा करने में आपकी सहायता करनी चाहिए। मैंने इसे स्वयं किसी समस्या के साथ उपयोग नहीं किया है। यह बात के jist है:

public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HT_CAPTION = 0x2; 

[DllImportAttribute("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 
[DllImportAttribute("user32.dll")] 
public static extern bool ReleaseCapture(); 

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
{  
    if (e.Button == MouseButtons.Left) 
    { 
     ReleaseCapture(); 
     SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
    } 
} 

यह होगा मूल रूप से "चाल" यह सोच कर कि यह WinForm की शीर्षक पट्टी हथियाने है में विंडो प्रबंधक।

इसे अपनी प्रोजेक्ट पर लागू करने के लिए, बस मेनूस्ट्रिप से माउसडाउन ईवेंट का उपयोग करें।

+1

यह वास्तव में बहुत अच्छा काम करता है। आप किसी भी माउसडाउन ईवेंट में विधि की सामग्री जोड़ सकते हैं, उदाहरण के लिए एक तस्वीर ... – Otiel

+0

यह लगभग बहुत आसान था :) धन्यवाद! पूरी तरह से सी # समाधान के लिए –

0

आप अपने मेनस्ट्रिप को नकली बना सकते हैं, उदाहरण के लिए लेबल के साथ एक पैनल का उपयोग कर सकते हैं। और फिर आप इसे मैन्युअल रूप से संभाल सकते हैं: जब उपयोगकर्ता लेबल पर क्लिक करता है, तो एक पॉपअप मेनू खुल जाएगा, और जब उपयोगकर्ता लेबल को ड्रैग करेगा, तो विंडो चली जाएगी। लेकिन मैं इस तरह के कामकाज के खिलाफ सलाह दूंगा, क्योंकि यह एक मानक जीयूआई व्यवहार नहीं है, और आप अपने उपयोगकर्ताओं को उलझन में डाल सकते हैं।

+1

* कृपया * ऐसा न करें। न केवल यह एक पूरी तरह से गैर मानक उपयोगकर्ता इंटरफ़ेस है, लेकिन यह अभी भी एक क्लिक की व्याख्या करने की समस्या का समाधान नहीं करता है। याद रखें कि एक क्लिक के बाद * "ड्रैग" होता है *।क्या एक मेनू को मेनू खोलना चाहिए, या इसे ड्रैग शुरू करने के रूप में व्याख्या किया जाना चाहिए? टाइम मशीनों को अभी तक परिपूर्ण नहीं किया गया है। –

+0

@Cody एक क्लिक तब होता है जब आप माउस बटन छोड़ते हैं। देखें कि यह विंडोज एक्सप्लोरर के फ़ोल्डर्स फलक में कैसे काम करता है: यदि आप किसी फ़ोल्डर पर क्लिक करते हैं, तो यह दाएं फलक में खुलता है, लेकिन यदि आप फ़ोल्डर खींचते हैं, तो यह नहीं खुलता है, यह सिर्फ खींच लिया जाता है। –

+2

समझा। लेकिन समझें कि आप "क्लिक" ईवेंट को अलग-अलग तरीके से परिभाषित कर रहे हैं कि मेन्यू नियंत्रण विंडोज़ में इसका अर्थ कैसे देता है। जैसे ही मैं विंडोज़ में किसी भी एप्लिकेशन में किसी भी मेनू पर माउस बटन दबाता हूं, मेनू नीचे गिर जाता है। यह तब नहीं होता जब माउस बटन जारी किया जाता है। मुझे लगता है कि यह तय करना महत्वपूर्ण है कि डिजाइन निर्णय जो नाटकीय रूप से अपेक्षित व्यवहार को बदलते हैं, विशेष रूप से सावधानी से विचार किया जाना चाहिए। –

0

मैं इसे करने की कोशिश नहीं की है, लेकिन अगर आप "OnMouseDown" और मेनू पट्टी पर "onMouseUp" घटनाओं को संभाल कर सकते हैं:

  • माउस पर नीचे - माउस आंदोलन के अनुसार खिड़की ले जाएँ
  • माउस पर माउस आंदोलन को ट्रैक करना बंद करें, या
0

आप एक पैनल का उपयोग कर रहे हैं, तो आप

YourForm.Designer.cs

this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); 

और इस

YourForm.cs में में इस जोड़ने के लिए

public const int WM_NCLBUTTONDOWN = 0xA1; 
     public const int HT_CAPTION = 0x2; 

     [DllImportAttribute("user32.dll")] 
     public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 
     [DllImportAttribute("user32.dll")] 
     public static extern bool ReleaseCapture(); 

     private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       ReleaseCapture(); 
       SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
      } 
     } 
9

नेट नेट

private bool dragging = false; 
    private Point dragCursorPoint; 
    private Point dragFormPoint; 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     dragging = true; 
     dragCursorPoint = Cursor.Position; 
     dragFormPoint = this.Location; 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (dragging) 
     { 
      Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint)); 
      this.Location = Point.Add(dragFormPoint, new Size(dif)); 
     } 
    } 

    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 
     dragging = false; 
    } 

यह है।

+3

+1। –

0

Mbithi Kioko सही रास्ते पर है लेकिन मैं इसे इस तरह से करूँगा।

bool dragging = false; 
    int xOffset = 0; 
    int yOffset = 0; 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     dragging = true; 

     xOffset = Cursor.Position.X - this.Location.X; 
     yOffset = Cursor.Position.Y - this.Location.Y; 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (dragging) 
     { 
      this.Location = new Point(Cursor.Position.X - xOffset, Cursor.Position.Y - yOffset); 
      this.Update(); 
     } 
    } 

    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 
     dragging = false; 
    } 
0

मैं System.Runtime.InteropServices.DllImportAttribute का इस्तेमाल किया था - बस सोचा था कि मैं टिप्पणी की और आप सभी जानते हैं।

0

बस इस तरह एक 2 डी सरणी में प्रारंभ बिंदु डाल:

public partial class mainForm : Form 
{ 
    //Global variables for Moving a Borderless Form 
    private bool dragging = false; 
    private Point startPoint = new Point(0, 0); 


    public mainForm() 
    { 
     InitializeComponent(); 
    } 

    private void mainForm_MouseDown(object sender, MouseEventArgs e) 
    { 
     dragging = true; 
     startPoint = new Point(e.X, e.Y); 

    } 

    private void mainForm_MouseUp(object sender, MouseEventArgs e) 
    { 
     dragging = false; 
    } 

    private void mainForm_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (dragging) 
     { 
      Point p = PointToScreen(e.Location); 
      Location = new Point(p.X - this.startPoint.X, p.Y - this.startPoint.Y); 

     } 

    } 
}