Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

BitBtn.Enabled := False   Найти похожие ветки 

 
MTsv DN ©   (2006-11-03 19:19) [0]

Есть BitBtn, на ней естесссно рисунок... При установке BitBtn.Enabled := False, кнопка отключается, это понятно, но по идее рисунок надо конвертировать в оттенки серого... Отсюда вопрос, как это сделать...


 
GMax   (2006-11-03 23:16) [1]

по идее надо как в VCL, но проще заранее подготовить конвертированный рисунок.


 
MTsv DN ©   (2006-11-03 23:48) [2]

Ну-у-у, это понятно... Можно, конечно, сделать еще один ImageList (а мне в проекте надо будет сделать 8), но может быть есть какое-нибудь более конструктивное и, главное, универсальное средство?..

Кстати, а что значит "как в VCL"?..


 
Vladimir Kladov   (2006-11-04 11:11) [3]

В случае «рисованной» кнопки (bitbtn) может использоваться либо отдельный рисунок, либо изображение из списка изображений (imagelist). И в любом из этих случаев, может предоставляться до 5 «глифов» – по одному для каждого из состояний: нормального, нажатого, запрещенного, фокусного, и подсвеченного. В случае отдельного изображения глифы располагаются в рисунке по горизонтали, и количество предоставленных глифов определяется исходя из размера рисунка (предполагая, что все изображения квадратные). В случае списка изображений сами глифы должны занимать в списке последовательные индексные позиции, а количество предоставленных глифов задается отдельно. При  прямом создании кнопки со списком изображений в Run-time количество глифов передается в старшем слове параметра GlyphCount (младшее слово в этом случае используется для передачи стартового индекса набора глифов для кнопки в списке изображений). При настройке такой кнопки в MCK для этого имеется особое псевдо-свойство только для времени разработки: glyphCount.

Да порядок глифов изначально был непродуман. Я собираюсь это изменить с 2.42. Оставить опцию BITBTN_DISABLEDGLYPH2 для совместимости с прежними версиями, если комк-то неудобно переставлять глифки в image-list"ах и битмапках. Новый порядок: нормальное, недоступное, нажатое, фокусное, активное. Перставляются недоступное и нажатое. Если есть предложения по порядку, напишите.

Система _якобы_ умеет автоматически продуцировать загрееное изображение из нормального. Но делает это так, что почти в 90% случаев лучше это сделать самому, подготовив все глифы заранее, и для bitbtn, и для toolbar.


 
MTsv DN ©   (2006-11-04 15:46) [4]

В общем, как я понял, все равно нужен еще рисунок... Ну что ж... Вот вариант с использование одной картинки. Есть условия использования, но для моих нужд (а может это и еще кому поможет ;-) ), самое то:

function TfrmMain.BitnBtnBitBtnDraw(Sender: PControl;
 BtnState: Integer): Boolean;
 procedure ConvertBitmap2Grayscale(const Bmp: PBitmap);
 type
  TRGBArray = array[0..32767] of TRGBTriple;
  PRGBArray = ^TRGBArray;
 var
  x, y, Gray: Integer;
  Row: PRGBArray;
 begin
  Bmp.PixelFormat := pf24Bit;
  for y := 0 to Bmp.Height - 1 do
   begin
    Row := Bmp.ScanLine[y];
    for x := 0 to Bmp.Width - 1 do
     begin
      Gray           := (Row[x].rgbtRed + Row[x].rgbtGreen + Row[x].rgbtBlue) div 3;
      Row[x].rgbtRed := Gray;
      Row[x].rgbtGreen := Gray;
      Row[x].rgbtBlue := Gray;
     end;
   end;
 end;
var
G : PBitmap;
DC : HDC;
Size, TransColor : Integer;
begin
DC := GetDC(Sender.Handle);
Size := 32;
G := NewDIBBitmap(Size, Size, pf24bit);
G.LoadFromResourceName(hInstance, PKOLChar(Sender.Name));
TransColor := G.Pixels[0,0];
if not Sender.Enabled then ConvertBitmap2Grayscale( G );
G.DrawTransparent(DC, 5, 5, TransColor);
ReleaseDC(Sender.Handle, DC);
G.Free;
end;


Условия:
1. Имя BITMAP-ресурса = имени BitBtn. В BITMAP-ресурсе только одно изображение. Res-файл создавал вручную...
2. Как следствие надо использовать USE_NAMES.

При соблюдении этих условий одной функции будет достаточно, для всех BitBtn...


 
Vladimyr ©   (2006-11-08 10:55) [5]

Gray := (Row[x].rgbtRed + Row[x].rgbtGreen + Row[x].rgbtBlue) div 3;
     Row[x].rgbtRed := Gray;
     Row[x].rgbtGreen := Gray;
     Row[x].rgbtBlue := Gray;


Всё это, конечно, хорошо, однако нормальное загрееное изображение как бы "вдавлено" (содержит тень), а не просто является чёрно-белым вариантом исходного...


 
MTsv DN ©   (2006-11-08 12:16) [6]

Я и не настаиваю... Я привел пример, как "ушел" от необходимости использовать 2а глифа... "На безрыбье, и рак - рыба..." (Народная Мудрость)... Меня такой вариант очень даже устраивает... Очень рад, если еще кому помог...

P.S. Кстати, возьмите и дорисуйте Тень (Shadow), Чеканку (Emboss)...да, что Вашей душе угодно... Благо алгоритмов в Нете...полно...


 
GMax   (2006-11-08 21:26) [7]

я имел ввиду примерно то же - генерацию серого глифа из обычного.
но VCL это делает по-другому.
он подгоняет цвета к clBtnFace, получается куда длиннее, но подходит к любой палитре.

Buttons.pas - function TButtonGlyph.CreateButtonGlyph(State: TButtonState)



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
8-1161079322
CyMKuH
2006-10-17 14:02
2007.06.24
Теги


8-1160757993
Minesweeper
2006-10-13 20:46
2007.06.24
Flash- обмен информацией с формой


15-1180511542
antonn
2007-05-30 11:52
2007.06.24
запуск процесса с языковыми настройками


1-1177569767
StriderMan
2007-04-26 10:42
2007.06.24
List из TNotifyEvent ов


15-1180128030
Pazitron_Brain
2007-05-26 01:20
2007.06.24
Москвичи