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;
}
}
}
Координаты иконки в трее
Проблема в чём.
При нажатии на иконку в трее над ней надо показать меню. Что-то типа меню подключения к сети в Windows 7, если видели. Можно припязать всё к координатам мыи, но они врядли будут точно соотвествоать координатам иконки (ну если оченю постараться :D )
В общем как узнать точные координаты иконки в трее, не извращаясь особо? :confused:
Цитата: alex-kniaz
При нажатии на иконку в трее над ней надо показать меню.
Так винды же сами меню показывают (свойство NotifyIcon.ContextMenu)?
Примитивное решение:
1) обрабатываем клик - получаем координаты мыши
2) вычислям дисплей на котором находится мышь (у меня их например четыре)
3) определяем квадрант рабочей зоны этого дисплея (WorkingArea - чтобы не перекрыть таскбар)
4) оторбажаем в этом углу наше кастомное окошко
Т.е. как узнать координаты собственно иконки неясно - только мыши... Ладно, обойдусь и так :)
Цитата: alex-kniaz
Т.е. как узнать координаты собственно иконки неясно - только мыши... Ладно, обойдусь и так :)
Вот примерный вариант реализации (форма пустая):
Код:
З.Ы. Узнать в принципе можно, но зачем такой изврат (когда-то тема подымалась... решалось через задницу)?
Цитата:
З.Ы. Узнать в принципе можно, но зачем такой изврат (когда-то тема подымалась... решалось через задницу)?
Нашёл рекомендацию как делать на MSDN[COLOR="Silver"] (ура! я так и не разучился искать инфу)[/COLOR] и решил так же :)