Полноэкранное приложение для WinCe

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Полноэкранное приложение для WinCe

Сообщение forfrends »

Добрый день!
Я начинающий, и язык знаю плохо. Но учу, читаю различные книги, курсы и т.д. По ходу обучения решил поэкспериментировать с оконными свойствами создаваемой программы (создаю для КПК на WinCe 2003).
Столкнулся со сложностью: Пытаюсь создать полноэкранное приложение, но не получается. Точнее получается частично - остается видимой нижняя строка основного меню (не знаю как она называется, на ней еще обычно "висит" значек включения экранной клавиатуры). Прикрепляю фото. На нем видно полосу внизу. Как ее убрать? Мой код:

Код: Выделить всё

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Calendar;
type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
   close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  BorderStyle := bsNone;
  FormStyle := fsStayOnTop;
  Left := 0;
  Top := 0;
  Height := Screen.Height;
  Width := Screen.Width;
end;

end.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

попробуйте в FormCreate сказать: WindowState := wsFullScreen;
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Сообщение forfrends »

Я пробовал это ставить в инспекторе объектов, сейчас добавил в код - результат тот же, нижняя полоса остается видимой.
Интересно то, что если скомпилировапь под "обычный" виндовс, то на компьютере программа запускается в полноекранном режиме, а если скомпилировать под WinCE и ARM, то полноэкранность не достигаеттся :(
Может какой-то компонент нужно дополнительно установить?
Установлено: lazarus-1.4.4-fpc-2.6.4-win32.exe и lazarus-1.4.4-fpc-2.6.4-cross-arm-wince-win32.exe
Заметил такое: при запуске программы на екране на мгновение появляется Виртуальная клавиатура и сразу исчезает. Может это она как-то портит всю картину и из-за нее остается внизу полоса?

Добавлено спустя 14 часов 53 минуты 15 секунд:
Попробовал код приведенный здесь: http://wiki.lazarus.freepascal.org/WinCE_Programming_Tips/ru#.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D0.BE.D0.BB.D0.BD.D0.BE.D1.8D.D0.BA.D1.80.D0.B0.D0.BD.D0.BD.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.B8.D0.BB.D0.BE.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F
"Создание полноэкранного приложения":

Код: Выделить всё

Добавьте в раздел uses модуль windows и добавьте следующий код в раздел interface вашей программы:
const
  //ShFullScreen
  SHFS_SHOWTASKBAR   = $01;
  SHFS_HIDETASKBAR   = $02;
  SHFS_SHOWSIPBUTTON = $04;
  SHFS_HIDESIPBUTTON = $08;
  SHFS_SHOWSTARTICON = $10;
  SHFS_HIDESTARTICON = $20; 
 
  function SHFullScreen(hwndRequester: hWnd; dwState: DWord): WINBOOL; stdcall; external 'aygshell.dll' name 'SHFullScreen';
Затем вставьте в события OnCreate и OnShow ваших форм (лучше OnShow) следующее:
procedure TForm1.FormCreate(Sender: TObject);
var
  Rect:TRect;
  hTaskBar:THandle;
  menuh:Integer;
begin
  hTaskBar := FindWindow('HHTaskBar','');
  GetWindowRect(hTaskBar,rect);
  menuh:=Rect.Bottom-Rect.Top;
  GetWindowRect(Form1.Handle,Rect);
  SHFullScreen(Form1.Handle,SHFS_HIDETASKBAR or SHFS_HIDESTARTICON or SHFS_HIDESIPBUTTON);
  movewindow(Form1.Handle,Rect.Left,Rect.Top-menuh,Rect.Right,Rect.Bottom+menuh,True);
end;


Но компилятор ругается на строку function SHFullScreen(hwndRequester: hWnd; dwState: DWord): WINBOOL; stdcall; external 'aygshell.dll' name 'SHFullScreen';
Пишет:
Компиляция проекта, ОС: wince, процессор: arm, цель: project1.exe: Код завершения 1, ошибок: 2
unit1.pas(35,40) Error: Identifier not found "hWnd"
unit1.pas(35,63) Error: Identifier not found "WINBOOL"


Добавлено спустя 45 минут 35 секунд:
Нашел почему компилятор "ругалсся": я не добавил в раздел "uses" модуль "windows". Добавил, компилируется, эффект тот же - серая полоса снизу :(
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

forfrends писал(а):Заметил такое: при запуске программы на екране на мгновение появляется Виртуальная клавиатура и сразу исчезает. Может это она как-то портит всю картину и из-за нее остается внизу полоса?

Так проверьте. Разверните на полный экран после запуска.

Код: Выделить всё

sleep(3000);
WindowState := wsFullScreen;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

forfrends, а если использовать wsMaximize?

А какой стиль окна?
Может быть, попробовать не fsStayOnTop, а fsNone?

Возможно, это полоса как бы является заголовком.
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Сообщение forfrends »

Лекс Айрин писал(а):а если использовать wsMaximize? А какой стиль окна? Возможно, это полоса как бы является заголовком.

Заголовок? Хм.. возможно, некоторые программы на этой полосе размещают свое меню: "File", "Open" и т.д.
Использовал много разных стилей, пробовал все подряд. Самое лучшее что получилось - написал в первом посте. А к чему относится "fsNone"? В Инспекторе объектов Form1 в списке стилей для FormStyle такого нет. К чему его отнести?

WAYFARER писал(а):Разверните на полный экран после запуска.

Попробовал ваш пример - виртуальная клавиатура на мгновение включается и исчезает. Отключил ее вообще:

Код: Выделить всё

SipShowIM(SIPF_OFF);

Пример кода, который привел в предыдущем посту вообще работает как-то странно. Прилагаю фото.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

forfrends писал(а):Прилагаю фото.

судя по фото это часть формы.. вы уверены что на форме нет ничего лишнего. типа статус бара?
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Сообщение forfrends »

Лекс Айрин писал(а):если использовать wsMaximize?

Пробовал, без fsStayOnTop поверх программы накладывается верхнее меню с Пуском, названием программы, часами.
wsMaximize - ни на что не влияет :(
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

forfrends писал(а):В Инспекторе объектов Form1 в списке стилей для FormStyle такого нет. К чему его отнести?


Прошу извинить... bsNone.... это BorderStyle.
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Сообщение forfrends »

vitaly_l писал(а):вы уверены что на форме нет ничего лишнего. типа статус бара?

Разве что это скрыто и не видимо при разработке.
Прилагаю полностью мой проект.

Добавлено спустя 7 минут 39 секунд:
Проект (без иконки - для уменьшения веса)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

попробуйте добавить

Код: Выделить всё

 Form1.Width:=Screen.Width;
  Form1.Height:=Screen.Height; \0
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Сообщение forfrends »

На всякий случай выкладываю фото работающего приложения "Explorer Pro". На фото видно что в нижней полосе располагается меню, кнопка вызова виртуальной клавиатуры и "стрелочка" с выпадающим меню настрое этой самой клавиатуры.

Добавлено спустя 3 минуты 38 секунд:
WAYFARER, не помогло :(

Добавлено спустя 19 минут 15 секунд:
Интересно, если поставить KOL вместо LCL, это на что-то повлияет?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Код: Выделить всё

FormStyle := fsStayOnTop;

попробовать заменить на

Код: Выделить всё

FormStyle := fsSystemStayOnTop;

Хотя должно быть достаточно

Код: Выделить всё

WindowState := wsFullScreen;


Добавлено спустя 7 минут 40 секунд:
Кстати, вполне может быть девайс не дает развернуть на весь экран.
Еще как вариант воспользуйтесь WinAPI.
Или совсем трэшевый вариант - гасите explorer при запуске программы, а при выходе запускайте снова.
forfrends
незнакомец
Сообщения: 8
Зарегистрирован: 13.11.2015 22:40:20

Сообщение forfrends »

WAYFARER, похоже это сама система не дает развернутся. Но в то же время у меня есть несколько приложений которые разворачиваются на весь экран но при этом нижняя полоса пропадает не сразу, а постепенно, частями. Последней исчезает кнопка включения/отключения виртуальной клавиатуры. Скорее всего в тех приложениях используются какие-то функции, которые по умолчанию не присутствуют Lazarus.
Предложенные примеры пробовал еще до того как написать на форуме - все одно и то же :(
C API я совсем не знаком - только начинаю изучать программирование.
А как можно завершить explorer и потом запустить его вновь? Можете пример кода показать?
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

forfrends писал(а):C API я совсем не знаком - только начинаю изучать программирование.

Тогда прямая дорога на msdn. И гуглим SHFullScreen.
forfrends писал(а):А как можно завершить explorer и потом запустить его вновь? Можете пример кода показать?

Это самое кривое решение которое можно придумать. Лучше так не делать.
Ответить