كيف يمكنني أن يسبب لوحة للتمرير برمجيا لفضح picturebox AutoSize لها

StackOverflow https://stackoverflow.com/questions/1803191

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي مربع صورة لتعيين AutoSize بحيث قوات الصورة لتنمو إلى حجم الصورة كاملة.

ومربع الصورة في لوحة مع التمرير التلقائي = صحيح، بحيث تظهر أشرطة التمرير عند الصورة أكبر من لوحة.

وكيف يمكنني برمجيا التمرير لوحة كما ينقر المستخدم على المؤثرات السلبية على الصورة، وبالتالي اعادة تموضع الصورة.

ولقد حاولت استخدام الحدث MouseMove، واستولت على X الماضي والمواقف Y من الفأرة، وحساب مقدار تحرك الماوس، وتعديل القيم عمودي وأفقي التمرير من لوحة.

وهذا لا نقل الصورة حولها، ولكنه يقفز في كل مكان، ومخطوطات لا يمكن التنبؤ به.

وكيف يمكنني تحقيق ذلك؟

وهنا ما قلته في أحداث الماوس بلدي ...

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        if (e.Button == MouseButtons.Left)
        {
            // move the image inverse to direction dragged
            int horizontalChange = (e.X - startingX) * -1;  
            int newHorizontalPos = panel1.HorizontalScroll.Value + horizontalChange;

            if (newHorizontalPos < panel1.HorizontalScroll.Minimum)
            {
                newHorizontalPos = panel1.HorizontalScroll.Minimum;
                horizontalChange = 0;
            }

            if (newHorizontalPos > panel1.HorizontalScroll.Maximum)
            {
                newHorizontalPos = panel1.HorizontalScroll.Maximum;
                horizontalChange = 0;
            }

            panel1.HorizontalScroll.Value = newHorizontalPos;

            int verticalChange = (e.Y - startingY);
            // move the image inverse to direction dragged
            int newverticalPos = panel1.VerticalScroll.Value + verticalChange * -1;  

            if (newverticalPos < panel1.VerticalScroll.Minimum)
            {
                newverticalPos = panel1.VerticalScroll.Minimum;
                verticalChange = 0;
            }

            if (newverticalPos > panel1.VerticalScroll.Maximum)
            {
                newverticalPos = panel1.VerticalScroll.Maximum;
                verticalChange = 0;
            }

            panel1.VerticalScroll.Value = newverticalPos;
        }
    }

    startingX = e.X;
    startingY = e.Y;
}

هل لي منطق خاطئ أو أفهم من وظائف التمرير لوحة في الخطأ؟

هل كانت مفيدة؟

المحلول

وأعتقد غريزة الخاص بك هو الصحيح ولكن الخطأ هو محاولة لضبط التمرير بدلا من تحريك PictureBox في لوحة للتمرير.

ويجب أن اعتراض MouseMove وضبط خاصية الموقع في PictureBox من قبل دلتا حركة الماوس - أشرطة التمرير يجب تلقائيا إلى تعكس موقع الصورة الجديد في داخلها

تحديث من شأنه أن الشفرة تبدو شيء من هذا القبيل ثو التالية (غير مجربة):

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        if (e.Button == MouseButtons.Left)
        {
            int horizontalChange = (e.X - startingX) * -1;  // move the image inverse to direction dragged

            int verticalChange = (e.Y - startingY);

            pictureBox1.Left += horizontalChange;
            pictureBox1.Top += verticalChange;
        }
    }

    startingX = e.X;
    startingY = e.Y;
}

و(أيضا، وسأكون يميل لتسجيل الماوس البداية ومواقع PictureBox في بداية السحب وتحديثها النسبي لهذا المنصب ابتداء على كل حدث MouseMove بدلا من إجراء تغييرات تدريجية كما رمز أعلاه (ورمز الأصلي . لا) والسبب في ذلك هو أنه إذا كان هناك أي قيم غير متوقعة، لأي سبب من الأسباب، فإن هذا سوف يسبب سوى تأثير عابر - حالة جيدة المقبل على تصحيح ذاتي)

.

نصائح أخرى

ومن القفز لأن فعل من التمرير لوحة ورمي قبالة موضع الماوس بمقدار التمرير. يمكنك الحصول على "الحقيقي" موقف الماوس (النسبي من الزاوية العلوية اليسرى من لوحة) مثل هذا:

  Point realPos = new Point(e.X + panel1.AutoScrollPosition.X,
    e.Y + panel1.AutoScrollPosition.Y);

وعلى افتراض مربع صورة "خاصية الموقع هي (0، 0). أفضل طريقة للتمرير لوحة هي لتعيين الخاصية AutoScrollPosition لها.

ويمكنك تعيين AutoScrollPosition لوحة في الحدث MouseMove. اختبارها ويعمل بشكل جيد.

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top