PDA

Показать полную графическую версию : [решено] WPF окна. Стиль None. Растянуть на весь экран. Проблемы с этим.


Casper-SC
21-08-2010, 23:52
Понадобилось мне растянуть окно на весь экран. Делаю я это так:

//Глобальная переменная
Window win = new Window();
//======================

//====== Это содержимое нужно куда нибудь вставить, например обработчик нажатия на кнопке ======
win.WindowState = System.Windows.WindowState.Maximized;
win.WindowStyle = System.Windows.WindowStyle.None;
win.Cursor = System.Windows.Input.Cursors.Hand;
//Добавим кнопку "Закрыть" для удобства
Button btnClose = new Button();
btnClose.FontSize = 48;
btnClose.Content = "Закрыть";
btnClose.Margin = new Thickness(300, 400, 300, 400);
btnClose.Click += new RoutedEventHandler(btnClose_Click);

win.Content = btnClose;
win.Show();
//=================================================================================

//Обработчик закрытия этого окна
void btnClose_Click(object sender, RoutedEventArgs e)
{
win.Close();
}

Если вы вставите себе в любой WPF проект этот код, например на обработчик нажатия кнопки какой нибудь, то у вас сразу без проблем это будет работать. Так вот как видите курсор принимает вид "Рука" и окно растянуто на весь экран и поверх панели задач. Так вот когда вы будете водить по нему курсором, он будет иметь вид руки. А теперь попробуйте переместить курсор в правый угол, там он смениться на стрелочку, так как выйдет за пределы окна. Но я не пойму почему так? Ведь окно растягивается на весь экран. Вот эта проблема портит мне всю малину.
Подскажите как можно обойти эту проблему? Или может это как то решается установкой каких нибудь свойств окна? Или может как-то возможно ограничить движение курсора внутри формы, пока её не закроют?

Вот у меня справа по всему окну такая полоска:
http://s02.radikal.ru/i175/1008/96/eae6df84490e.png

Casper-SC
22-08-2010, 12:33
Проблема решилась сама собой, перезагрузил компьютер, проблема исчезла. Кто не понимает о чём вообще речь, вот видео (http://narod.ru/disk/23962955000/video.rar.html) (~314 kb) этой беды.

Я даже решил её так (не забываем это WPF, не WinForms):

System.Drawing.Rectangle winRect = new System.Drawing.Rectangle(0, 0,
(int)SystemParameters.PrimaryScreenWidth - 2,
(int)SystemParameters.PrimaryScreenHeight - 2);
System.Windows.Forms.Cursor.Clip = winRect;
Но всё равно это не давало мне покоя.

Admiral
23-08-2010, 19:55
Casper-SC, код перед съёмкой не менялся? Потому как закрывающейся кнопки на растянутом на весь экран окне не видно на нём.
Дабы она была видна Thickness(300, 400, 300, 400) нужно заменить на Thickness(20, 40, 30, 40) (координаты то не в пикселях, а в аппаратно-независимых единицах).
Да и кнопка не должна быть закрывающейся, лучше указать Hide. Так как повторный вывод окна на весь экран вызовет проблему: win.Show() не отработает для окна которое уже закрыли.

Casper-SC
24-08-2010, 06:40
Вроде не менялся, я что-то не помню. Вот немного поправленный код:
//Глобальная переменная
Window win = new Window();
//======================

//====== Это содержимое нужно куда нибудь вставить, например обработчик нажатия на кнопке ======
if (win == null)
{
win = new Window();
}
win.WindowState = System.Windows.WindowState.Maximized;
win.WindowStyle = System.Windows.WindowStyle.None;
win.Cursor = System.Windows.Input.Cursors.Hand;
//Добавим кнопку "Закрыть" для удобства
Button btnClose = new Button();
btnClose.FontSize = 48;
btnClose.Content = "Закрыть";
btnClose.Margin = new Thickness(100, 200, 100, 200);
btnClose.Click += new RoutedEventHandler(btnClose_Click);

win.Content = btnClose;
win.Show();
//=================================================================================

//Обработчик закрытия этого окна
void btnClose_Click(object sender, RoutedEventArgs e)
{
win.Close();
win = null;
}

Опять появилась проблема. Курсор выходит за пределы формы. То есть справа получается форма не достаёт до края экрана. А это сильно мешает, так как выделяя рамку на экране (функция такая в программе, рамка выделяется на растянутой форме), курсор выходит за пределы формы и начинаются всякие проблемы, которые решить кодом в предыдущем моём сообщении не реально. Так как это не постоянно. Может это из-за полноэкранных игр? Так как я одну свернул игру, потом запустил программу и опять эта беда. Может это вообще недоработка Framework?

Добавлено позже:

Вот выключил игру и все лишние программы закрыл, проблема осталась. Далее жму ПКМ на рабочем столе Windows 7 - "Персонализация", там выбираю другую тему, экран как бы дёргается, все ярлыки на рабочем столе перерисовываются, запускаю программу всё проблема исчезла. Что это может быть? И можно ли такую перерисовку сделать программно? И всё же может как-то довести до разработчиков Framework'a это можно? Просто эта беда у меня всегда появляется, после открытия игр.

Delirium
24-08-2010, 07:03
Просто эта беда у меня всегда появляется, после открытия игр. »
А если в игре выставить разрешение, равному разрешению на экране, проблема сохранится?

Почитайте вот такой поиск: http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=C%23+WPF+change+creen+resolution

http://www.c-sharpcorner.com/UploadFile/Joshy_geo/changescreenresolution10102006112110AM/changescreenresolution.aspx

Casper-SC
24-08-2010, 08:34
Вот именно, что проблема появляется всегда, разрешение по моему роли не играет. У меня монитор 1280х1024, во всех играх используется аналогичное. Думаю всё-таки это в самом Framework'e, что-то не учли или в чём там... Хотя ни знаю. А что ни у кого нету такой проблемы?

Admiral
24-08-2010, 15:40
Casper-SC нет, проблемы не наблюдаю. Проверил на .NET3.0, .NET3.5 и .NET4.0 в ХР на 1024х768. Курсор всегда одним значком – указателем и никакой "руки".

Донести до разработчиков FW, можно например через сайт http://connect.microsoft.com/directory/ (см. Windows Presentation Foundation или Visual Studio and .NET Framework (http://connect.microsoft.com/VisualStudio)), необходима регистрация.

Delirium
24-08-2010, 16:06
Сдается мне, проблема не в FW, а в драйверах на видеокарту, как это ни банально :) Я имею в виду перерисовку.

Casper-SC
24-08-2010, 16:53
Casper-SC нет, проблемы не наблюдаю. Проверил на .NET3.0, .NET3.5 и .NET4.0 в ХР на 1024х768. Курсор всегда одним значком – указателем и никакой "руки". »
По коду который я выложил должен быть курсор всегда "рукой", а при выходе за пределы формы по понятным причинам курсор менялся на стрелочку. Ну думаю как ни крути вы бы увидели эти полосы по сторонам экрана. Кстати замечал их не только справа, но и снизу.

Сдается мне, проблема не в FW, а в драйверах на видеокарту, как это ни банально Я имею в виду перерисовку. »
Хм... А кстати возможно. Ну тогда можно сильно не беспокоиться. Нажо будет проверить на других компьютерах, то есть повторить ситуацию. Кстати с драйверами на видеокарту у меня всё время какая-то беда. Вот недавно наконец-то нашёл свежие, но видимо они тоже не без греха :)

=======================================================
Подсказали, что причина может быть в сдвиге растянутой формы, после включения/выключения игры (ну это я и сам понимал в принципе), так как форма растянута на весь экран, то по её краям есть как бы рамка тонкая, вот если добавить в код это:
win.ResizeMode = System.Windows.ResizeMode.NoResize;
То проблема отпадает.




© OSzone.net 2001-2012