أفكار حول كيفية عرض مربع رسالة مشروط كما تلميح

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأحتاج لعرض مربع رسالة مشروط عندما يمر أحد المستخدمين على أحد عناصر القائمة. لا يمكنني استخدام messagebox.show (...) لأنه غير مشروط. وذلك ما فعلته كان إنشاء نموذج نوافذ منفصلة وعرض النموذج باستخدام الحدث تحوم على عنصر القائمة. لدي مشاكل 2:

1) عندما يعرض شكل النوافذ القائمة يفقد وضوحه.
2) لا يظهر شكل النوافذ بجانب عنصر القائمة مثل كيف تلميح شأنه.

وأي أفكار عن كيف يمكن custmize تلميح الأدوات والمكون من شأنها أن تجعل الامر يبدو ويتصرف مثل شكل النوافذ؟

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

المحلول

للرد على المشكلة الثانية الخاصة بك:

إذا قمت بتعيين الخاصية form.StartPosition إلى FormStartPosition.Manual ثم يمكنك وضع النموذج في المؤشر (على سبيل المثال):

form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(Cursor.Position.X - 1, Cursor.Position.Y - 1);

وهذا قد يساعد مع المشكلة الأولى أيضا.

إذا كنت تريد النموذج إلى تتصرف مثل تلميح الأدوات ثم إذا قمت بإضافة التعليمات البرمجية التالية معالج الأحداث أنه قد يعطي تريد تريد:

    private void Form_MouseLeave(object sender, EventArgs e)
    {
        // Only close if cursor actually outside the popup and not over a label
        if (Cursor.Position.X < Location.X || Cursor.Position.Y < Location.Y ||
            Cursor.Position.X > Location.X + Width - 1 || Cursor.Position.Y > Location.Y + Height - 1)
        {
            Close();
        }
    }

وهذا ما يفسر -1 في تحديد موقف النموذج. ومن يضمن أن المؤشر هو في الواقع على شكل عندما يعرض الأولى.

نصائح أخرى

ومنذ فئة النموذج هو مجرد التفاف حول نافذة الأصلي، يمكنك استخدام المقتطف التالي على إنشاء النموذج المنبثقة الخاصة، التي تبدو تقريبا كما نافذة تلميح:

public class PopupForm : Form
{
    private const int SWP_NOSIZE = 0x0001;
    private const int SWP_NOMOVE = 0x0002;
    private const int SWP_NOACTIVATE = 0x0010;

    private const int WS_POPUP = unchecked((int)0x80000000);
    private const int WS_BORDER = 0x00800000;

    private const int WS_EX_TOPMOST = 0x00000008;
    private const int WS_EX_NOACTIVATE = 0x08000000;

    private const int CS_DROPSHADOW = 0x00020000;

    private static readonly IntPtr HWND_TOPMOST = (IntPtr)(-1);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    public PopupForm()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
        Visible = false;
    }

    protected virtual void InitializeComponent()
    {
        FormBorderStyle = FormBorderStyle.None;
        StartPosition = FormStartPosition.Manual;
        ShowInTaskbar = false;
        BackColor = SystemColors.Info;

        // ...
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= WS_POPUP;
            cp.Style |= WS_BORDER;
            cp.ExStyle |= WS_EX_TOPMOST | WS_EX_NOACTIVATE;
            //if (Microsoft.OS.IsWinXP && SystemInformation.IsDropShadowEnabled)
            //    cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }

    protected override bool ShowWithoutActivation
    {
        get { return true; }
    }

    public new void Show()
    {
        SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);    
        base.Show();
    }

    public void Show(Point p)
    {
        Location = p;
        Show();
    }
}

والسيطرة على هذا النموذج مع عرض () وإخفاء () الأساليب من رمز الخارجي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top