Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 24.10.2012, 00:39   #11
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
этой функцией с этим флагом вы задаете рабочую область, а именно, область как развернется окно максимально.
вы должны разослать уведомление всем окнам о том что параметры системы изменены, только тогда они примут новые параметры.
Код:
SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0);
SetWindowPos не с той степи, это потом было и к другому.

PS: посмотрите на скрин с первого сообщения темы, это то что вы хотите получить?(проигрыватель над панелью задач)
Да только справа
DIMASIKXXX32 вне форума
Старый 24.10.2012, 00:53   #12
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Так чего то я запутался давайте по порядку
На какое событие это все вешать.
1. При создании формы определяю размер рабочей области экрана делаю так:

//глобальная переменная
var
ScreenWorkArea:TRect;


procedure TF_Main.FormCreate(Sender: TObject);
begin
F_Main.Left := Screen.Width - F_Main.Width;
F_Main.Height := Screen.Height;
ScreenWorkArea:=Rect( Screen.WorkAreaLeft,
Screen.WorkAreaTop,
Screen.Width - F_Main.Width {Вычитаю размер формы},
Screen.Height);
end;

2. Устанавливаю рабочую область с новыми параметрами так:

procedure TF_Main.FormActivate(Sender: TObject);
begin
SystemParametersInfo(SPI_SETWORKARE A,0,@ScreenWorkArea,SPIF_SENDCHANGE);
end;


а SPIF_SENDCHANGE разве не оповещает все окна о перерисовке.
3. При закрытии формы делаю следующее:

procedure TF_Main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ScreenWorkArea:=Rect( 0,
0,
1366,
768);
SystemParametersInfo(SPI_SETWORKARE A,0,@ScreenWorkArea,SPIF_SENDCHANGE );
end;

Вроде при закрытии все изменяется только один косяк теперь системный трей не является ограничением для окон.

теперь что надо добавить ....

Последний раз редактировалось DIMASIKXXX32; 24.10.2012 в 00:58.
DIMASIKXXX32 вне форума
Старый 24.10.2012, 00:59   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

с флагом SPI_GETWORKAREA вы получаете текущую рабочую область.(посл параметр 0)
её нужно сохранять.
и потом восстанавливать именно её.

а то у вас была рабочая область размером с экран - таскбар, а вы ставите весь экран, вот и выходит.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 24.10.2012, 01:03   #14
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
с флагом SPI_GETWORKAREA вы получаете текущую рабочую область.(посл параметр 0)
её нужно сохранять.
и потом восстанавливать именно её.

а то у вас была рабочая область размером с экран - таскбар, а вы ставите весь экран, вот и выходит.
SystemParametersInfo(SPI_SETWORKARE A,0,0,SPIF_SENDCHANGE);
Да получилось...
DIMASIKXXX32 вне форума
Старый 24.10.2012, 01:09   #15
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

вот если заметили еще есть косяк по строению формы

Код:
    F_Main.Left :=  Screen.Width - F_Main.Width;
    F_Main.Height := Screen.Height;


Короче перекрывает системный трей

а если в свойстве Align=alRight то форма начинает двигаться вместе с рабочей областью но отрисовывается до системного трея

Последний раз редактировалось DIMASIKXXX32; 24.10.2012 в 02:29.
DIMASIKXXX32 вне форума
Старый 24.10.2012, 01:45   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
SystemParametersInfo(SPI_GETWORKAREA,0,@R,0);
сохранили текущую рабочую область.
от нее расчитываем новую, и так координаты себя любимого тоже можно!
и потом в конце эту область вы и должны восстановить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 24.10.2012, 02:22   #17
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
SystemParametersInfo(SPI_GETWORKAREA,0,@R,0);
сохранили текущую рабочую область.
от нее расчитываем новую, и так координаты себя любимого тоже можно!
и потом в конце эту область вы и должны восстановить.
Привожу полный код
Код:
unit U_MAin;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AdvCodeList, AdvMemo,
  AdvmPS, sSkinManager, sLabel, sButton, sComboBox, System.IniFiles;

type
  TF_Main = class(TForm)
    SM: TsSkinManager;
    sButton1: TsButton;
    SkinBox: TsComboBox;
    procedure FormCreate(Sender: TObject);
    procedure SkinBoxChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormActivate(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_Main: TF_Main;
  FIni:TIniFile;
  ScreenWorkArea:TRect;
implementation

{$R *.dfm}
 //
procedure TF_Main.FormCreate(Sender: TObject);
  var
    CountSkin:Integer;
  begin
    //
    FIni:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'setting.ini');
    SM.SkinName:=FIni.ReadString('Skin','Name','Afterburner (внутренний)');
    FIni.Free;

    F_Main.Left :=  Screen.Width - F_Main.Width;
    F_Main.Height := Screen.Height;

    ScreenWorkArea:=Rect( Screen.WorkAreaLeft,
                          Screen.WorkAreaTop,
                          Screen.Width - F_Main.Width,
                          Screen.Height);

    IntToStr(SM.InternalSkins.Count);
    for CountSkin := 0 to SM.InternalSkins.Count-1 do
      SkinBox.AddItem(SM.InternalSkins.Items[CountSkin].Name,nil);
  end;
//
procedure TF_Main.SkinBoxChange(Sender: TObject);
  begin
    SM.SkinName:=SkinBox.Text;
  end;
//Закрытие программы
procedure TF_Main.FormActivate(Sender: TObject);
  begin
    SystemParametersInfo(SPI_SETWORKAREA,0,@ScreenWorkArea,SPIF_SENDCHANGE);
  end;
//
procedure TF_Main.FormClose(Sender: TObject; var Action: TCloseAction);
  begin

    sendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0) ;
    //
    FIni:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'setting.ini');
    FIni.WriteString('Skin','Name',SkinBox.Text);
    FIni.Free;
  end;

end.
Подскажи что куда вставить вообще запутался или что добавить и чего нехватает

Последний раз редактировалось DIMASIKXXX32; 24.10.2012 в 02:29.
DIMASIKXXX32 вне форума
Старый 24.10.2012, 02:39   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
  ScreenWorkArea:TRect;
implementation

procedure TF_Main.FormShow(Sender: TObject);
  var
    R:TRect;
  begin
   SystemParametersInfo(SPI_GETWORKAREA,0,@ScreenWorkArea,0);
   R:=Rect( ScreenWorkArea.Left,
                          ScreenWorkArea.Top,
                          ScreenWorkArea.Right - F_Main.Width,
                          ScreenWorkArea.Bottom);
   F_Main.Left :=  ScreenWorkArea.Right - F_Main.Width;
   F_Main.Height := ScreenWorkArea.Bottom-ScreenWorkArea.Top;
    SystemParametersInfo(SPI_SETWORKAREA,0,@R,SPIF_SENDCHANGE);
   //sendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0) ;
   //не помню нужна ли.
  end;

procedure TF_Main.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
    SystemParametersInfo(SPI_SETWORKAREA,0,@ScreenWorkArea,SPIF_SENDCHANGE);
   //sendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0) ;
   //не помню нужна ли.
  end;
как то так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 24.10.2012, 02:47   #19
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
  ScreenWorkArea:TRect;
implementation

procedure TF_Main.FormShow(Sender: TObject);
  var
    R:TRect;
  begin
   SystemParametersInfo(SPI_GETWORKAREA,0,@ScreenWorkArea,0);
   R:=Rect( ScreenWorkArea.Left,
                          ScreenWorkArea.Top,
                          ScreenWorkArea.Right - F_Main.Width,
                          ScreenWorkArea.Bottom);
   F_Main.Left :=  ScreenWorkArea.Right - F_Main.Width;
   F_Main.Height := ScreenWorkArea.Bottom-ScreenWorkArea.Top;
    SystemParametersInfo(SPI_SETWORKAREA,0,@R,SPIF_SENDCHANGE);
   //sendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0) ;
   //не помню нужна ли.
  end;

procedure TF_Main.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
    SystemParametersInfo(SPI_SETWORKAREA,0,@ScreenWorkArea,SPIF_SENDCHANGE);
   //sendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0) ;
   //не помню нужна ли.
  end;
как то так.
Все теперь понял я несчитал значения т.е. не запомнил изначальные SystemParametersInfo(SPI_GETWORKARE A,0,@ScreenWorkArea,0);

Вроде все заработало корректно, только теперь подшаманить на все события при сворачивание и разворачивание. Огромное тебе спасибо

Последний раз редактировалось DIMASIKXXX32; 24.10.2012 в 02:50.
DIMASIKXXX32 вне форума
Старый 21.11.2012, 03:25   #20
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
Радость Спасибо

Тема закрыта.
DIMASIKXXX32 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почти Vista SideBar всего 21 kb kachkarvv Софт 4 26.01.2012 22:25
Форма внути формы, или как создать предпросмотр скинов AC? Человек_Борща Общие вопросы Delphi 4 07.04.2011 16:36
С++ гаджет для Windows SideBar PavelGord Общие вопросы C/C++ 0 20.02.2011 21:57
сдвигается sidebar в ie6 coolerS HTML и CSS 0 12.12.2009 15:22
Отчет времени на своей иконке в SYSTray Yuran Общие вопросы Delphi 1 04.06.2008 23:43