Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > как написать текст поверх всех окон


Автор: vladd 24.5.2012, 12:14
Здравствуйте!
Возник такой вопрос. Как написать текст поверх всех окон? Что то на подобии как  делает Mega Motivator. 

Автор: diadiavova 24.5.2012, 12:29
Не очень понятно, что это значит. В принципе текст надо писать в отдельном окне, задай ему TransparencyKey такой же, как цвет окна, убери все границы ( смотри свойство BorderStyle), растяни окно на весь экран и установи TopMost в true. Это все примерно, поскольку точно не помню, но думаю куда копать ты понял.

Автор: vladd 24.5.2012, 12:37
На с# нашел такой код
Код

 using System.Drawing.Drawing2D;
    using System.Threading;
 
    public partial class Form1 : Form
    {
         int i = 0;
         string PATH_STRING ;
        const int FONT_SIZE = 100;
        const FontStyle FONT_STYLE = FontStyle.Bold;
         SizeF stringSize;
        Timer stateTimer;   
        public Form1()
        {
            InitializeComponent();
 
           
            this.TopMost = true;
            // здесь интервал таймера 100 мс
            stateTimer = new Timer(delegate { myMethod(); }, null, 0, 100);
 
        }
 
        void myMethod()
        {
            // вот здесь устанавливай нужное значение строки
            PATH_STRING = String.Format("{0:d4}", i);
            ++i;
 
            //Получаем оконные координаты верхней левой точки клиентской области
            Point origin = new Point(SystemInformation.Border3DSize.Width, SystemInformation.CaptionHeight);
            //При помощи GraphicsPath создаем Region в виде строки
            GraphicsPath path = new GraphicsPath();
           
            path.AddString(PATH_STRING, Font.FontFamily, (int)FONT_STYLE, FONT_SIZE, origin, StringFormat.GenericDefault);
            this.BeginInvoke(new Action(() =>
                {
                    //Устанавливаем регион для формы
                    Region = new Region(path);
                    //Вычисляем размеры прямоугольника, занимаемого строкой
                    stringSize = CreateGraphics().MeasureString(PATH_STRING, new Font(Font.FontFamily, FONT_SIZE, FONT_STYLE));
                    Width = (int)Math.Ceiling(stringSize.Width);
                }));
           
            
        }
        protected override void OnPaint(PaintEventArgs e)
        {           
 
            LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, Color.Yellow, Color.Blue, 10);
            e.Graphics.FillRectangle(brush, 0, 0, stringSize.Width, stringSize.Height);
        }
 
        //Чтобы наше окно можно было "тягать" мышью, "скажем" системе что вся его область является заголовком,
        //захватив который, как известно, можно перемещать окно
        const int WM_NCHITTEST = 0x0084;
        const int HTCAPTION = 2;
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCHITTEST)
            {
                m.Result = (IntPtr)HTCAPTION;
                return;
            }
            base.WndProc(ref m);
        }
    }


Теперь перевести его на VB net, да знаний не хватает.

Добавлено через 13 минут и 6 секунд
Так например ошибка на строку 11
Код

Timer stateTimer; 


Пишет что "Timer" - неоднозначная ссылка между "System.Windows.Forms.Timer" и "System.Threading.Timer". А как её исправить знаний и не хватает.

Автор: diadiavova 24.5.2012, 15:25
Цитата(vladd @  24.5.2012,  13:37 Найти цитируемый пост)
Пишет что "Timer" - неоднозначная ссылка между "System.Windows.Forms.Timer" и "System.Threading.Timer". А как её исправить знаний и не хватает. 

В твоем случае это первый вариант. Просто напиши имя класса полностью System.Threading.Timer

Не очень понятно при чем тут таймер, и почему вместо того, чтобы разбирать чужой код, который делает неизвестно что, не попробовать то, что тебе посоветовали. Ну да ладно, дело хозяйское.

Автор: vladd 24.5.2012, 16:23
Я просто хочу сначала понять как вообще люди решают подобные задачи на примере, а потом уже сделать свою.
Цитата(diadiavova @ 24.5.2012,  12:29)
Не очень понятно, что это значит. В принципе текст надо писать в отдельном окне, задай ему TransparencyKey такой же, как цвет окна, убери все границы ( смотри свойство BorderStyle), растяни окно на весь экран и установи TopMost в true. Это все примерно, поскольку точно не помню, но думаю куда копать ты понял.

А по вашему предложению надо сделать сначало MDI форму. Сделать её прозрачной и писать в неё текст. Я все правильно понял? 

Автор: diadiavova 24.5.2012, 16:44
Цитата(vladd @  24.5.2012,  17:23 Найти цитируемый пост)
А по вашему предложению надо сделать сначало MDI форму. Сделать её прозрачной и писать в неё текст. Я все правильно понял?  

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

Автор: vladd 24.5.2012, 19:37
Timer нужен для создания эффекта 25 кадра. Чтобы надпись показывать через настраиваемое определенное количество времени и определенной  длительности.

Автор: diadiavova 24.5.2012, 20:47
25-й кадр - бред. Бросай это дело smile 

Автор: vladd 25.5.2012, 05:24
Цитата(diadiavova @ 24.5.2012,  20:47)
25-й кадр - бред. Бросай это дело smile

Вот и хочу проверить сам. 

Автор: irinazanuda 28.5.2012, 08:46
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)