Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как изменить стиль PROGRESSBAR после создания 
:(
    Опции темы
mes
Дата 16.1.2006, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Здравствуйте.
У меня сложилась следующая ситуация :

Если при создании PROGRESSBAR устанавливаю стили, то потом эти стили визуально отображаются:

Код

wClass.lpszClassName  := Progress_Class;
wClass.Style := ws_visible or ws_child or pbs_Vertical or pbs_Smooth;
Handle := CreateWindowEx (wClass);


Если же я хочу установить эти стили после создания, то никакой реакции нету.
Т.е флаг стиля устанавливается, но визуально PROGRESSBAR остаётся прежним.

Код

  NewStyle := GetWindowLong (Handle, GWL_Style) or pbs_Smooth or ws_child or ws_visible;
  SetWindowLong (Handle, GWL_Style, NewStyle);

Может кто сталкивался, подскажите, пожалуйста, как заставить PROGRESSBAR "принять" новый стиль?

Это сообщение отредактировал(а) mes - 16.1.2006, 13:57


--------------------
PM MAIL WWW   Вверх
Girder
Дата 16.1.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Тебе надо включить XP стили(XPMan в uses добавь). А для прогресс бара сбросить его SetWindowTheme(PB.Handle,'',''); . И только в ентом случаи у тебя будут работать енти стили в XP.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
mes
Дата 16.1.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Спасибо за совет. Попробовал, пока ничего не получилось, smile
точнее при вызове ф-ции пропрамма прерывается из-за критической ошибки. smile

Буду пробовать еще , однако смущает один момент:
Эти стили у меня работают, только стиль установленый при создании потом я не могу сменить.

Делаю я это с ф-цией:



Код

 NewStyle := GetWindowLong (Handle, GWL_Style) or pbs_Smooth;
                 SetWindowLong (Handle, GWL_Style, NewStyle);


Попробовал с флагом ws_Visible. Всё работает корректно.
т.е не работает изменение именно флагов : pbs_Smooth , pbs_Vertical.




--------------------
PM MAIL WWW   Вверх
Girder
Дата 16.1.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(mes @ 16.1.2006, 14:06 Найти цитируемый пост)

Спасибо за совет. Попробовал, пока ничего не получилось,

Значит не так пробывал.
Вот пример:
Код
program Project1;
                  
uses windows, messages, CommCtrl, XPMan;

{$R *.res}

var   wc_pb : TWndClassEx;
      MainWnd, PB : HWND;
      Mesg : TMsg;
      //Конечно так лудше не делать... грузи динамически!
      function SetWindowTheme(hwnd: HWND; pszSubAppName: LPCWSTR; pszSubIdList: LPCWSTR): HRESULT; stdcall; external 'uxtheme.dll';

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
begin
 if msg=wm_destroy then
  begin
   postquitmessage(0); 
   Result:=0;
  end else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;

function InitCommonControl(CC: Integer): Boolean;
var
  ICC: TInitCommonControlsEx;
begin
  ICC.dwSize := SizeOf(TInitCommonControlsEx);
  ICC.dwICC := CC;
  Result := InitCommonControlsEx(ICC);
  if not Result then InitCommonControls;
end;

begin
 with wc_pb do
  begin
   cbSize:=sizeof(wc_pb);
   style:=cs_hredraw or cs_vredraw;
   lpfnWndProc:=@WindowProc;
   cbClsExtra:=0;
   cbWndExtra:=0;
   hInstance:=HInstance;
   hIcon:=LoadIcon(0,idi_application);
   hCursor:=LoadCursor(0,idc_arrow);
   hbrBackground:=COLOR_BTNFACE+1;
   lpszMenuName:=nil;
   lpszClassName:='XPProgress_Bar';
  end;

RegisterClassEx(wc_pb);

MainWnd:=CreateWindow('XPProgress_Bar','Progress_Bar',ws_overlappedwindow,100,100,500,300,0,0,Hinstance,nil);

InitCommonControl(ICC_PROGRESS_CLASS);

PB:=CreateWindowEx(0, PROGRESS_CLASS, '', WS_CHILD or WS_VISIBLE, 3, 18, 220, 50, MainWnd, 0, hInstance, nil);

SendMessage(PB, PBM_SETRANGE, 0, MAKELPARAM(0,100));

SendMessage(PB, PBM_SETPOS, 50, 0);

SetWindowTheme(PB,'','');

SetWindowLong (PB, GWL_Style, WS_CHILD or WS_VISIBLE or 1); //pbs_Smooth=1

SendMessage(PB, PBM_SETPOS, 50, 0);

ShowWindow(MainWnd,CmdShow);
ShowWindow(PB,CmdShow);

While GetMessage(Mesg,0,0,0) do
 begin
  TranslateMessage(Mesg);
  DispatchMessage(Mesg);
 end;

end.



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
mes
Дата 16.1.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Спасибо. Твой код работает. Будем иследовать smile
Только вот размер файла значительно увеличивается.
Но это уже мелочи.



--------------------
PM MAIL WWW   Вверх
mes
Дата 16.1.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Кстати нашел интерсную особеность, может кому пригодится:
если пишите на WINAPI c XP-стилями и не хотите чтоб размер файла сильно увеличивался
добавьте вместо uses XPMAN ,строчку {$R WindowsXP.res} ( всего 1Кбайт!)


Надеюсь кому-нибудь это поможет.



--------------------
PM MAIL WWW   Вверх
mes
Дата 16.1.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



После изучения кода всё же главный вопрос остался нерешеным.

Наблюдения:

1) Если я подключаю XP-стили то при изменинии флага pbs_Vertical, ProgressBar визуально меняется.

2) Ф-ция SetWindowTheme(PB,'','') сбрасывает темы однако реакция на флаг от неё не зависит.

Вопрос:

Неужели нельзя добиться реакции на флаг pbs_Vertical , не подлючая
эти стили, ведь при создании она воспринимает же этот флаг.


--------------------
PM MAIL WWW   Вверх
Girder
Дата 17.1.2006, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(mes @ 16.1.2006, 20:03 Найти цитируемый пост)

2) Ф-ция SetWindowTheme(PB,'','') сбрасывает темы однако реакция на флаг от неё не зависит.
Если не сбросиш... то и работать изменение флагов не будет.

Цитата(mes @ 16.1.2006, 20:03 Найти цитируемый пост)

Неужели нельзя добиться реакции на флаг pbs_Vertical , не подлючая
эти стили, ведь при создании она воспринимает же этот флаг.
В XP только так... см. выше.
Добавлено @ 04:10
Хотя... можеш в "классику" переключиться... там работать должно


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
mes
Дата 17.1.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Цитата(Girder @ 17.1.2006, 04:09 Найти цитируемый пост)

Цитата(mes @ 16.1.2006, 20:03 )

2) Ф-ция SetWindowTheme(PB,'','') сбрасывает темы однако реакция на флаг от неё не зависит.


Если не сбросиш... то и работать изменение флагов не будет.

Ты удивишься, но изменение флагов происходит не от вышеназваной ф-ции.
Как только я подключаю файл WindowsXp.res, ProgressBar начинает реагировать на флаги
(на флаг pbs_Smooth он не реагирует так как у XP-Progressbar нет такого стиля)

ф-ция SetWindowTheme приводит только к изменению темы.
Ho Если я не подключу WindowsXP.res, то от сброса темы ничего не зависит.
Ho в Windows 98 как то же работают эти стили!?

Чтоб не углубляться я перефразирую свой вопрос.
Если программа составлена для Windows98 и в ней используется
изменение стиля после его создания,то эта программа будет
некоректно работать в среде XP?
Можно ли указать программе что она предназначена для 98
чтоб стили коректно раболи в XP?.




--------------------
PM MAIL WWW   Вверх
mes
Дата 17.1.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Цитата(Girder @ 17.1.2006, 04:09 Найти цитируемый пост)

Хотя... можеш в "классику" переключиться... там работать должно


А как это сделать?


--------------------
PM MAIL WWW   Вверх
Girder
Дата 18.1.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(mes @ 17.1.2006, 10:39 Найти цитируемый пост)

Ты удивишься, но изменение флагов происходит не от вышеназваной ф-ции.
Как только я подключаю файл WindowsXp.res, ProgressBar начинает реагировать на флаги
(на флаг pbs_Smooth он не реагирует так как у XP-Progressbar нет такого стиля)
У меня в WinXP+SP1 не работает без сброса.

Цитата(mes @ 17.1.2006, 10:39 Найти цитируемый пост)

Можно ли указать программе что она предназначена для 98
чтоб стили коректно раболи в XP?.
А нафиг?

Должно работать как в W98... так и XP:
1. подключай WindowsXP.res
2. Динамически грузи uxtheme.dll
3. Если загрузилась... то сбрасывай(SetWindowTheme) для прогрессбара(можеш для всех элементов сбросить... что бы не отличался внешний вид). Если не загрузилась или не нашлась функциия SetWindowTheme(Ну мало... ли что smile )... все равно переходи к 4 пункту.
4. Изменяй флаги... через SetWindowLong


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.