Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить разрешение на КПК?  (Прочитано 9481 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
tumanovalex
Помогающий

ru
Offline Offline

« : 29-08-2006 17:13 » 

В десктоповском варианте программы на C# определяю разрешение монитора так:
label1.Text = System.Windows.Forms.SystemInformation.PrimaryMonitorSize.Width + "x" +                     System.Windows.Forms.SystemInformation.PrimaryMonitorSize.Height;
В варианте для PocketPC нужно тоже определять разрешение (может запускаться на разных КПК) и в зависимости от него располагать элементы. Не нашел для PocketPC в Visual C# 2003 System.Windows.Forms.SystemInformation.PrimaryMonitorSize.
Перепробовал:
Screen.PrimaryScreen.WorkingArea.Height + "x" +                      Screen.PrimaryScreen.WorkingArea.Width;
Screen.PrimaryScreen.Bounds.Height + "x" + Screen.PrimaryScreen.Bounds.Width;
Screen.PrimaryScreen.Bounds.Size.Height + "x" +  Screen.PrimaryScreen.Bounds.Size.Width;
System.Drawing.  Screen.PrimaryScreen.Bounds.Size.Height + "x" +        Screen.PrimaryScreen.Bounds.Size.Width.
На КПК с 640х480 дает все равно не более 320х240.
Как можно определить разрещение экрана на КПК?

Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-08-2006 09:11 » 

Самый верный способ узнать разрешение экрана - обратиться к функции GetDeviceCaps из интерфейса GDI,  проблема только в том, что этот интерфейс реализован в Си и не поддерживается в штатной поставке Compact Framework.

К этому интерфейсу можно добраться через механизм, который в .NET назвали Platform Invoke. В С# надо объявить несколько методов специального вида, вызовы которых во время исполнения программы будут перенаправляться в реализацию интерфейса на Си.

Вот пример, который делает обёртку вокруг нескольких низкоуровневых функций из GDI.
Код:
using System;
using System.Runtime.InteropServices;

    class GDIHelper
    {
        [DllImport("coredll.dll", SetLastError = false)]
        public static extern IntPtr GetDC(IntPtr hWnd);
        [DllImport("coredll.dll", SetLastError = false)]
        public static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc);
        [DllImport("coredll.dll", SetLastError = false)]
        public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

        public static int GetDeviceCaps(int nIndex)
        {
            IntPtr hDC = GetDC(NULL);
            int result = GetDeviceCaps(hDC, nIndex);
            ReleaseDC(NULL, hDC);
            return result;
        }
        public static IntPtr NULL = new IntPtr(0);

        // Константы для GetDeviceCaps
        public const int DRIVERVERSION = 0;     /* Device driver version                    */
        public const int TECHNOLOGY = 2;     /* Device classification                    */
        public const int HORZSIZE = 4;     /* Horizontal size in millimeters           */
        public const int VERTSIZE = 6;     /* Vertical size in millimeters             */
        public const int HORZRES = 8;     /* Horizontal width in pixels               */
        public const int VERTRES = 10;    /* Vertical height in pixels                */
        public const int BITSPIXEL = 12;    /* Number of bits per pixel                 */
        public const int PLANES = 14;    /* Number of planes                         */
        public const int NUMBRUSHES = 16;    /* Number of brushes the device has         */
        public const int NUMPENS = 18;    /* Number of pens the device has            */
        public const int NUMMARKERS = 20;    /* Number of markers the device has         */
        public const int NUMFONTS = 22;    /* Number of fonts the device has           */
        public const int NUMCOLORS = 24;    /* Number of colors the device supports     */
        public const int PDEVICESIZE = 26;    /* Size required for device descriptor      */
        public const int CURVECAPS = 28;    /* Curve capabilities                       */
        public const int LINECAPS = 30;    /* Line capabilities                        */
        public const int POLYGONALCAPS = 32;    /* Polygonal capabilities                   */
        public const int TEXTCAPS = 34;    /* Text capabilities                        */
        public const int CLIPCAPS = 36;    /* Clipping capabilities                    */
        public const int RASTERCAPS = 38;    /* Bitblt capabilities                      */
        public const int ASPECTX = 40;    /* Length of the X leg                      */
        public const int ASPECTY = 42;    /* Length of the Y leg                      */
        public const int ASPECTXY = 44;    /* Length of the hypotenuse                 */

    }

Константы взяты из заголовочного файла wingdi.h

После добавления класса GDIHelper в свой проект вместо обращений к свойствам PrimaryMonitorSize надо делать вызовы GDIHelper.GetDeviceCaps(HORZRES) и GDIHelper.GetDeviceCaps(VERTRES):

Код:
label1.Text = GDIHelper.GetDeviceCaps(GDIHelper.HORZRES)
                + " x " +
                GDIHelper.GetDeviceCaps(GDIHelper.VERTRES)

Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
tumanovalex
Помогающий

ru
Offline Offline

« Ответ #2 : 30-08-2006 17:58 » 

Спасибо большое за ответ. Попробую так сделать. Однако странно, почему в десктоповском варианте есть такая функция, а в варианте для КПК - нет.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 31-08-2006 08:19 » 

Это можно объяснить тем, что во времена разработки Compact Framework 5-6 лет назад все наладонники выпускались с экранами 240х320.
Или, другими словами, это фирменный стиль Microsoft.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines