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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поменять цвет окна. Диалогового окна.... 
V
    Опции темы
NUCLEuS
Дата 26.4.2006, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем!

Такой вопрос - как с помощью Win32API поменять цвет окна, которое не создаётся с помощью CreateWindow (тогда бы можно было заполнить структуру класса и указать цвет) а вызывается из ресурсов с помощью DialogBoxParamA.

Подозреваю что нужно обрабатывать сообщение WM_CTLCOLORDLG, но у меня чёт ничего не получается smile Подскажите пожалуйста кто знает... 
PM MAIL   Вверх
Rouse_
Дата 26.4.2006, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 29



Обрабатывать WM_ERASEBKGND 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
NUCLEuS
Дата 26.4.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile  smile 

 smile  
PM MAIL   Вверх
NUCLEuS
Дата 26.4.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если Вам не трудно, дайте пожалуйста код обработки... Допустим чтобы сделать окно с идентификатором MainWnd чёрным.  smile  
PM MAIL   Вверх
Rouse_
Дата 26.4.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 29



Ну к примеру вот так:

Код

uses UxTheme;

function WndFunc(hDlg: THandle; Msg: UINT; wParam: WPARAM;
  lParam: LPARAM): integer; stdcall;
const
  REDRAWWINDOWFLAGS = RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN;
var
  Details: HTHEME;
  DlgRect: TRect;
begin
  Result := 0;
  case msg of
   WM_ERASEBKGND:
   if UseThemes then
   begin
     GetWindowRect(hDlg, DlgRect);
     DlgRect.Right := DlgRect.Right - DlgRect.Left;
     DlgRect.Left := 0;
     DlgRect.Bottom := DlgRect.Bottom - DlgRect.Top;
     DlgRect.Top := 0;
     Details := OpenThemeData(hDlg, 'TAB');
     try
       DrawThemeBackground(Details, GetDC(hDlg), TABP_BODY, 0, DlgRect, nil);
     finally
       CloseThemeData(Details);
     end;
     RedrawWindow(hDlg, nil, 0, REDRAWWINDOWFLAGS);
     Result := 1;
   end;
  end;
end;


Тут фон диалога отрисовывается в стиле ХР (если конечно подключен манифест).
ЗЫ: В самом начале нужен вызов InitThemeLibrary;

Добавлено @ 16:27 
ЗЫ: В твоем случае это можно сделать вот так:

Код

   WM_ERASEBKGND:
   begin
     GetWindowRect(hDlg, DlgRect); 
     DlgRect.Right := DlgRect.Right - DlgRect.Left;
     DlgRect.Left := 0;
     DlgRect.Bottom := DlgRect.Bottom - DlgRect.Top;
     DlgRect.Top := 0;
     BRUSH := CreateSolidBrush($FF0000);
     try
       FillRect(wParam, DlgRect, BRUSH);
     finally
       DeleteObject(BRUSH);
     end;
     Result := 1;
   end;
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
NUCLEuS
Дата 26.4.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rouse_, Не, UxTheme у меня нет, а со вторым способом вообще болт.

Пришлось брать SDK и разбирать самому smile: . Вот что нарыл:

Как я и предполагал, нужно было обрабатывать сообщение WM_CTLCOLORDLG, вот что про него написано в SDK "Это сообщение посылается диалоговому окну ПЕРЕД тем как Винда рисует это окно...".

Короч, вот как я сделал:

это обработчик:

Код

WM_CTLCOLORDLG: 
Result:=hBgColor;    //Нужно чтобы процедура окна вернула хэндл Brush'a


а это в начале тела программы, ДО вызова диалога

Код

hBgColor:=CreateSolidBrush($0FFFFFFF);


Вот и всё smile Тема закрыта.
 
PM MAIL   Вверх
Rouse_
Дата 27.4.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 29



Цитата(NUCLEuS @  26.4.2006,  21:19 Найти цитируемый пост)
Не, UxTheme у меня нет, а со вторым способом вообще болт.

Если тоит семерка - этот модуль у тебя есть, а если не получился второй пример, ну тут даже не знаю как он мог не получиться 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
NUCLEuS
Дата 27.4.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rouse_, стоит D6  smile

А насчёт второго способа - попробуй сам - окно не перерисовывается. А потом попробуй мой способ - у меня например всё ок  smile Только оконную функцию немного пришлось переделать  (чтобы возвращала не Bool а LongInt)  smile  
PM MAIL   Вверх
Rouse_
Дата 27.4.2006, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 29



Цитата(NUCLEuS @  27.4.2006,  10:00 Найти цитируемый пост)
А насчёт второго способа - попробуй сам - окно не перерисовывается.

Как ты думаешь, я код сюда из головы рисую или всеже проверяю его на работоспособность? smile 
Если у тебя не перерисовывается, то это еще ни о чем не говорит smile  

Это сообщение отредактировал(а) Rouse_ - 27.4.2006, 09:34


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
NUCLEuS
Дата 27.4.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rouse_
Думаю ты его проверяешь. Да, ты прав, наверное это что то у меня.

Но мой код тоже рабочий, и к тому же гораздо меньше. 
PM MAIL   Вверх
Gnom3
Дата 22.8.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rouse_,  использовал твой вариант - отлично отработало из оконной процедуры. В общем у меня засада такая: Я закрашиваю окно программы снаружи, подавая его хендл внутрь длл-ки, в которой и создана процедура обработки нескольких параметров окна, в том числе и цвета. Засада в том, что окно многослойное, закрашивается только задний фон. Вопрос - можно-ли это както обойти?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0867 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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