окошко игры перекрывается панелями windows

Общие вопросы о Unity3D

окошко игры перекрывается панелями windows

Сообщение nicotin 17 дек 2012, 13:49

Хочу свою игру запускать в оконном режиме. На большинстве компов это получается без проблем. Но вот если разрешение маленькое (например, на ноутбуке крохотном), то окошко надо ужимать.
Окно игры юнити максимизировать не удалось, да и не надо, нужен максимум, от которого я буду отталкиваться и контролировать соотношение сторон окна.
ВОПРОС: Как мне узнать размеры максимизированного (развернутого) окна у виндов? Подозреваю использование нативных виндовых функций.
nicotin
UNец
 
Сообщения: 11
Зарегистрирован: 26 дек 2011, 11:03

Re: окошко игры перекрывается панелями windows

Сообщение Левш@ 17 дек 2012, 15:20

ФуллСкрин рабочего стола ?
Синтаксис:
Используется javascript
Screen.currentResolution
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: окошко игры перекрывается панелями windows

Сообщение nicotin 17 дек 2012, 15:46

Screen.currentResolution - дает высоту и ширину текущего разрешения экрана, куда ВХОДИТ площать, занимаемая таскбаром и еще какими-нибудь эксплореровскими панельками, которые запрещают окнам разворачиваться поверх себя.

Вот мне подсказали :
Синтаксис:
Используется csharp
[DllImport("user32.dll", SetLastError = true)]
static extern bool SystemParametersInfo(int uiAction, int uiParam, IntPtr pvParam, int fWinIni);
 

и параметр
Синтаксис:
Используется csharp
SPI_GETWORKAREA

думаю, что выход, но еще не успел проверить
nicotin
UNец
 
Сообщения: 11
Зарегистрирован: 26 дек 2011, 11:03

Re: окошко игры перекрывается панелями windows

Сообщение DbIMok 17 дек 2012, 20:39

Синтаксис:
Используется csharp
using Microsoft.Win32;
using UnityEngine;
using System;
using System.Runtime.InteropServices;

    /// Wrapper around the Winapi POINT type.
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT {
        /// <summary>
        /// The X Coordinate.
        /// </summary>
        public int X;

        /// <summary>
        /// The Y Coordinate.
        /// </summary>
        public int Y;

        /// <summary>
        /// Creates a new POINT.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }

    }
    /// Wrapper around the Winapi SIZE type.
    [StructLayout(LayoutKind.Sequential)]      
        public struct SIZE {
                public int WIDTH;
                public int HEIGHT;
        public SIZE(int w, int h)
        {
            this.WIDTH = w;
            this.HEIGHT = h;
        }
               
        }

    /// Wrapper around the Winapi RECT type.
    [Serializable, StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        /// <summary>
        /// LEFT
        /// </summary>
        public int Left;

        /// <summary>
        /// TOP
        /// </summary>
        public int Top;

        /// <summary>
        /// RIGHT
        /// </summary>
        public int Right;

        /// <summary>
        /// BOTTOM
        /// </summary>
        public int Bottom;

        /// <summary>
        /// Creates a new RECT.
        /// </summary>
        public RECT(int left_, int top_, int right_, int bottom_)
        {
            Left = left_;
            Top = top_;
            Right = right_;
            Bottom = bottom_;
        }

        /// <summary>
        /// HEIGHT
        /// </summary>
        public int Height { get { return Bottom - Top; } }

        /// <summary>
        /// WIDTH
        /// </summary>
        public int Width { get { return Right - Left; } }

        /// <summary>
        /// SIZE
        /// </summary>
        public SIZE Size { get { return new SIZE(Width, Height); } }

        /// <summary>
        /// LOCATION
        /// </summary>
        public POINT Location { get { return new POINT(Left, Top); } }
    }

        private const int SPI_GETWORKAREA = 0x30;

                [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError = true)]
                [return: MarshalAs(UnmanagedType.Bool)]
                static extern bool SystemParametersInfo(int uAction, int uParam, ref RECT lpvParam, int fuWinIni);

                public static Rect GetDeskWorkRect()
                {
                        RECT r = new RECT(0,0,0,0);
                        try
                        {
                                if (SystemParametersInfo(SPI_GETWORKAREA, 0, ref r, 0))
                                {
                                        return new Rect(r.Left,r.Top,r.Width,r.Height);
                                }
                                else
                                {
                                        Debug.LogError("SystemParametersInfo return error");
                                }
                        }
                        catch (Exception e)
                        {
                                Debug.LogError(e);
                        }
                        return r;
                }

надергал кусочками, может где-то что-то пропустил.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: окошко игры перекрывается панелями windows

Сообщение nicotin 19 дек 2012, 11:17

победил так:
Сначала сделал класс, который имеет статический метод, выдергивающий для меня рабочую область, в которой обязательно может поместиться окно.
Синтаксис:
Используется csharp
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class WorkArea {
       
        public static RECT GetWorkAreaRect () {
                bool getWorkAreaSuccess = false;
                RECT workAreaRect = new RECT();
                       
                getWorkAreaSuccess = SystemParametersInfo(SPI_GETWORKAREA, Marshal.SizeOf(workAreaRect), ref workAreaRect, 2);
               
                return workAreaRect;
        }
       
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SystemParametersInfo(uint uiAction, int uiParam, ref RECT pvParam, int fWinIni);
       
        [StructLayout(LayoutKind.Sequential)]
    public struct RECT
        {
            public Int32 Left;
            public Int32 Top;
            public Int32 Right;
            public Int32 Bottom;
        }      
       
       
        const uint SPI_GETWORKAREA      = 48;


}


Затем оказалось, что надо еще поотнимать бордеры окна и так называемый title bar, он же window caption он же полосочка над окном, за которую это окно можно таскать. Эта инфа оказалась в другой нативной функции. Написал класс и для ее использования:

Синтаксис:
Используется csharp
using System;
using System.Runtime.InteropServices;

public class NonClientMetrics {
               

        [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool SystemParametersInfo(uint action,
                                                int intParam,
                                                ref NONCLIENTMETRICS metrics,
                                                int update);
       
        const uint SPI_GETNONCLIENTMETRICS      = 41;
       
        public static NONCLIENTMETRICS GetMetrics()
        {
            NONCLIENTMETRICS metrics = new NONCLIENTMETRICS();
            metrics.cbSize = Marshal.SizeOf(metrics);
            bool result = SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
                                               0,
                                               ref metrics,
                                               0);
           
               
                return metrics;
        }      
       
       
       
        public struct NONCLIENTMETRICS
        {
            public int cbSize;
            public int iBorderWidth;
            public int iScrollWidth;
            public int iScrollHeight;
            public int iCaptionWidth;
            public int iCaptionHeight;
            public LOGFONT lfCaptionFont;
            public int iSmCaptionWidth;
            public int iSmCaptionHeight;
            public LOGFONT lfSmCaptionFont;
            public int iMenuWidth;
            public int iMenuHeight;
            public LOGFONT lfMenuFont;
            public LOGFONT lfStatusFont;
            public LOGFONT lfMessageFont;
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct LOGFONT
        {
            public int lfHeight;
            public int lfWidth;
            public int lfEscapement;
            public int lfOrientation;
            public int lfWeight;
            public byte lfItalic;
            public byte lfUnderline;
            public byte lfStrikeOut;
            public byte lfCharSet;
            public byte lfOutPrecision;
            public byte lfClipPrecision;
            public byte lfQuality;
            public byte lfPitchAndFamily;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
            public string lfFaceName;
        }
       
}


iCaptionHeight - это и оказался нужный мне параметр высоты капшена. Ширина бордеров - iBorderWidth.

И вот, наконец, все это стало удобно юзать, например так:

Синтаксис:
Используется csharp
WorkArea.RECT workAreaRect = WorkArea.GetWorkAreaRect();//size of desktop workarea - the area for any maximized window
int maxHeight = workAreaRect.Bottom - workAreaRect.Top;
int maxWidth = workAreaRect.Right - workAreaRect.Left;

int SM_CYCAPTION        = 4;//the height of title bar of any window
int captionheight       = GetSystemMetrics(SM_CYCAPTION);

NonClientMetrics.NONCLIENTMETRICS metrics = NonClientMetrics.GetMetrics();//http://msdn.microsoft.com/en-us/library/windows/desktop/ff729175(v=vs.85).aspx
maxWidth        -= metrics.iBorderWidth * 2;
maxHeight       -= captionheight;
maxHeight       -= metrics.iBorderWidth * 2;
nicotin
UNец
 
Сообщения: 11
Зарегистрирован: 26 дек 2011, 11:03


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 17


cron