Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Координаты иконки в трее

536
22 июня 2010 года
alex-kniaz
382 / / 07.08.2008
Вот решил [COLOR="Silver"]вспомнить молодость[/COLOR] потренироваться и сделать типа читалку RSS на C# (студия 2008)
Проблема в чём.
При нажатии на иконку в трее над ней надо показать меню. Что-то типа меню подключения к сети в Windows 7, если видели. Можно припязать всё к координатам мыи, но они врядли будут точно соотвествоать координатам иконки (ну если оченю постараться :D )

В общем как узнать точные координаты иконки в трее, не извращаясь особо? :confused:
5
22 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: alex-kniaz

При нажатии на иконку в трее над ней надо показать меню.

Так винды же сами меню показывают (свойство NotifyIcon.ContextMenu)?

5
22 июня 2010 года
hardcase
4.5K / / 09.08.2005
А, понял в чем проблема.
Примитивное решение:
1) обрабатываем клик - получаем координаты мыши
2) вычислям дисплей на котором находится мышь (у меня их например четыре)
3) определяем квадрант рабочей зоны этого дисплея (WorkingArea - чтобы не перекрыть таскбар)
4) оторбажаем в этом углу наше кастомное окошко
536
22 июня 2010 года
alex-kniaz
382 / / 07.08.2008
Т.е. как узнать координаты собственно иконки неясно - только мыши... Ладно, обойдусь и так :)
5
22 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: alex-kniaz
Т.е. как узнать координаты собственно иконки неясно - только мыши... Ладно, обойдусь и так :)


Вот примерный вариант реализации (форма пустая):

Код:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication21 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            icon = new NotifyIcon();
            icon.Click += new EventHandler(icon_Click);
        }

        NotifyIcon icon;

        private void Form1_Load(object sender, EventArgs e) {
            icon.Icon = this.Icon;
            icon.Visible = true;
        }


        void icon_Click(object sender, EventArgs e) {
            var pos = Cursor.Position;
            Rectangle area;
            if (GetActiveWorkingArea(pos, out area)) {
                Rectangle coords;
                if (GetWindowCoords(pos, area, out coords)) {
                    SetBounds(coords.X, coords.Y, coords.Width, coords.Height, BoundsSpecified.All);
                }
            }
        }


        static bool GetActiveWorkingArea(Point pos, out Rectangle area) {
            foreach (var screen in Screen.AllScreens) {
                if (screen.Bounds.Contains(pos)) {
                    area = screen.WorkingArea;
                    return true;
                }
            }
            area = Rectangle.Empty;
            return false;
        }

        static bool GetWindowCoords(Point pos, Rectangle area, out Rectangle coords) {
            var win_height = 150;
            var win_width = 150;

            var half_width = area.Width / 2;
            var half_height = area.Height / 2;

            // top left
            if (new Rectangle(area.Location + new Size(-half_width, -half_height), area.Size).Contains(pos)) {
                coords = new Rectangle(
                    area.X,
                    area.Y,
                    win_width,
                    win_height);
                return true;
            }

            // top right
            if (new Rectangle(area.Location + new Size(half_width, -half_height), area.Size).Contains(pos)) {
                coords = new Rectangle(
                    area.X + area.Width - win_width,
                    area.Y,
                    win_width,
                    win_height);
                return true;
            }

            // bottom left
            if (new Rectangle(area.Location + new Size(-half_width, half_height), area.Size).Contains(pos)) {
                coords = new Rectangle(
                    area.X,
                    area.Y + area.Height - win_height,
                    win_width,
                    win_height);
                return true;
            }

            // bottom right
            if (new Rectangle(area.Location + new Size(half_width, half_height), area.Size).Contains(pos)) {
                coords = new Rectangle(
                    area.X + area.Width - win_width,
                    area.Y + area.Height - win_height,
                    win_width,
                    win_height);
                return true;
            }

            coords = Rectangle.Empty;
            return false;
        }

    }
}
На моих 4-х дисплеях работает.


З.Ы. Узнать в принципе можно, но зачем такой изврат (когда-то тема подымалась... решалось через задницу)?
536
23 июня 2010 года
alex-kniaz
382 / / 07.08.2008
Цитата:
З.Ы. Узнать в принципе можно, но зачем такой изврат (когда-то тема подымалась... решалось через задницу)?


Нашёл рекомендацию как делать на MSDN[COLOR="Silver"] (ура! я так и не разучился искать инфу)[/COLOR] и решил так же :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог