Подсказка, которая не связана с каким-либо конкретным элементом управления - PullRequest
4 голосов
/ 05 февраля 2010

Я пытаюсь сделать что-то вроде проверки орфографии, которая будет перечислять возможные слова в текущей позиции каретки. Я думал, что сделаю это, создав подсказку, переместив ее в соответствии с местоположением каретки и изменив текст внутри подсказки.

У меня проблемы.

Я пытаюсь показать всплывающую подсказку с tip.Show(form, x, y);

Тем не менее, это приложение работает с systray. У этого нет никаких элементов GUI кроме этого? Что я использую в качестве параметра form? notifyIcon1, Form1 и т. д. не работают.

Я бы начал с примера, который отображал статическую подсказку, которая двигалась вместе с моим курсором мыши или чем-то еще. Может ли кто-нибудь указать мне правильное направление?

Спасибо

Ответы [ 4 ]

2 голосов
/ 05 февраля 2010

Вы можете сделать это, но не используя класс всплывающей подсказки, поскольку это довольно ограниченно, есть фантастический помощник всплывающей подсказки под названием VXPLib, использующий форматирование html (которое, я полагаю, даст вашему списку слов преимущество - скажем, по-разному). цвета). VXPLib - это COM-объект (написанный на C ++), но доступный из языка .NET, и есть обертка, которая может сделать это для вас вместе с примерами кода. Я попробовал их, и они на самом деле работают и делают это красиво ... См. здесь для получения дополнительной информации.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 08 февраля 2010

Я разместил ответ в этой теме, в котором используется прозрачный максимизированный формат для имитации рисования всплывающей подсказки в любом месте экрана, включая рабочий стол. Может быть, это поможет: Создание всплывающей подсказки из приложения только в системном трее

Редактировать: Скопировал код из связанного поста для удобства чтения: -)

Вот, пожалуйста, используйте прозрачную развернутую форму, которую вы BringToFront() покажете ToolTip

Форма 1 Код:

using System;
using System.Windows.Forms;

namespace SO_ToolTip
{
    public partial class Form1 : Form
    {
        Random _Random = new Random();
        ToolTip _ToolTip = new ToolTip();

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            BringToFront();
            _ToolTip.Show("Blah blah... Blah blah... Blah blah...", this, _Random.Next(0, Width), _Random.Next(0, Height), 10000);
        }
    }
}

Form1 Designer Code: Итак, вы можете видеть свойства форм:

namespace SO_ToolTip
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.timer1 = new System.Windows.Forms.Timer(this.components);
            this.SuspendLayout();
            // 
            // timer1
            // 
            this.timer1.Enabled = true;
            this.timer1.Interval = 1000;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.ControlBox = false;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "Form1";
            this.Opacity = 0;
            this.ShowIcon = false;
            this.ShowInTaskbar = false;
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Timer timer1;

    }
}

Обновление: С ControlBox = false; и Opacity = 0; форма не только визуально прозрачна, но и защищена от ввода данных пользователем. Это даже когда Form1 выше, если самое верхнее окно, щелкающее в его области, падает до следующего окна / рабочего стола. Как будто формы там не было. BringToFront () перед отображением всплывающей подсказки требуется, потому что в противном случае всплывающая подсказка может быть нарисована под другими окнами, а это не то, что вам нужно.

1 голос
/ 07 февраля 2010

Если в вашем приложении нет графического интерфейса, то в каком приложении вы предлагаете проверку орфографии?

Если вы интегрируете свое приложение с другим существующим приложением (даже приложениями, отличными от .NET), вам необходимо получить дескриптор (HWND) другого приложения и преобразовать его в System.Windows.Forms. IWin32Window . После этого вы можете использовать этот дескриптор в качестве form в методе ToolTip.Show .

Вот код, который вам нужен:

using System.Diagnostics;

//...

public class MyWindow : System.Windows.Forms.IWin32Window
{
    private IntPtr _hwnd;

    public IntPtr Handle
    {
        get
        {
            return _hwnd;
        }
    }

    public MyWindow(IntPtr handle)
    {
        _hwnd = handle;
    }

    //...

    public static MyWindow GetWindowFromName(string processName)
    {
        Process[] procs = Process.GetProcessesByName(processName);
        if (procs.Length != 0)
        {
            return new MyWindow(procs[0].MainWindowHandle);
        }
        else
        {
            throw new ApplicationException(String.Format("{0} is not running", processName));
        }
    }
}


//...

tip.Show("this worked...", MyWindow.GetWindowFromName("Notepad"), 0, 0, 2000);
0 голосов
/ 18 ноября 2016

Я работал над созданием всплывающей подсказки, которая «не связана с каким-либо конкретным элементом управления», потому что я хотел заменить один из моих сценариев AutoHotkey, который использует команду ToolTip.

Мой код хранится по адресу: https://bitbucket.org/tahir-hassan/dotnettooltip

Все, что вам нужно сделать, - создать экземпляр элемента управления, установить отображаемый текст, установить координаты и вызвать Show метод:

var tooltip = new ToolTipLib.ToolTip() 
{
    Text = "this is a nice toolTip",
    LocationX = 100,
    LocationY = 200
};

tooltip.Show();
...