Пятница - 23.04.2021 - 07:40:29
3361
1

9. Графика в C++Builder

Работа с графикой в C++Builder имеет множество тонкостей. Некоторые из них будут появляться на этой странице.

 

1. Как использовать встроенные в Windows иконки в своём приложении?

 
 HDC DC;
 HICON Icon;
 DC= GetWindowDC(FormMess->Handle);
 Icon=LoadIcon(0, IDI_QUESTION); //иконка знак вопроса
 DrawIcon(DC, 10, 45, Icon);
 ReleaseDC(FormMess->Handle, DC);
  • IDI_INFORMATION - восклицательный знак;
  • IDI_QUESTION - знак вопроса;
  • IDI_ERROR - знак ошибки;

 

2. Определить высоту и ширину рисунка (*.PNG)

 
//-----------------------------------------------------------
struct
{
 union
 {
  struct
  {Word Value;};
  struct
  {byte Byte1, Byte2;};
 };
};
//---------------------------------------------------------------------------
Word __fastcall TFMain::ReadMWord(TFileStream *f)
{
 TMotorolaWord MW;
 f->Read(&MW.Byte2, sizeof(Byte));
 f->Read(&MW.Byte1, sizeof(Byte));

 return MW.Value;
}
//---------------------------------------------------------------------------
typedef byte TPNGSig[8];
String __fastcall TFMain::GetPNGSize(String const sFile)
{
 TPNGSig ValidSig={137,80,78,71,13,10,26,10};
 TPNGSig Sig;
 TFileStream *f;
 int x;
 Word wPic, hPic;
 String S;
 f=new TFileStream(sFile,fmOpenRead);
 try
 {f->Read(&Sig[0], sizeof(Sig));
  for(x=0; x<sizeof(Sig);x++)
  {
   if (Sig[x]!=ValidSig[x])
   {break;}
  }
  f->Seek(18, 0);
  wPic=ReadMWord(f);
  f->Seek(22, 0);
  hPic=ReadMWord(f);
  S="width:"+String(wPic)+";height:"+String(hPic)+";";
 }
 __finally
 {delete f;}
 
 return S;
}
//---------------------------------------------------------------------------
  • Как использовать функцию?
  • Пример:
  •  
      //расширение файла приводим к нижнему регистру
      String S=ExtractFileExt(fn.LowerCase()); 
      String S2;
      //проверяем, что расширение .png
      if(S==".png")
      {S2=GetPNGSize(fn);}
      Результат: width:46;height:57; 
      //для вебстиля CSS 
      
  • fn - полное имя файла
  • Не забудьте сделать объявление функций ReadMWord(TFileStream *f) и GetPNGSize(String const sFile) в файле .h.

 

3. Работа с цветом

Цвет в Borland C++ Builder 6 (BCB6) представляется в виде целого числа типа int. Спецификация типа TColor представлена ниже:

enum TColor {clMin=-0x7fffffff-1, clMax=0x7fffffff};

В среде BCB6 предопределено множество констант для выбора нужного цвета: clBlue, clNavy, clLime и т. д. Можно также определять цвет самостоятельно, задава конкретные значение каждому компоненту цвета в отдельности. Для этого нужно знать как хранится каждая из компонент цвета (красная, зеленая, синяя) в переменной типа TColor. Младшие 3 байта содержат синюю, зеленую и красную компоненты цвета соответственно. Старший байт служит для определения используемой палитры цветов. Учитывая это, можно схематически отобразить порядок хранения данных о цвете:

0x0P BB GG RR

где каждой буквой отмечается тетрада бит и P - означает палитра, B - синий цвет, G - зеленый цвет, R - красный цвет. Если старший байт (байт палитры) равен 0, то цвет выбирается из системной палитры; если 1, то цвет выбирается из текущей палитры; если 2, то цвет выбирается из палитры текущего контекста устройства.

Что-бы продемонстрировать роботу с цветом в BCB6 напишем небольшую программку, которая будет создавать цвет из цветовых компонентов или разбивать выбранный цвет на компоненты и отображать его. Также можно будет получить значение цвета для вэб-страницы и для самой среды программирования BCB6.

 
void
__fastcall TForm1::Button1Click(TObject *Sender) { BYTE r,g,b; try { //проверка правильности введенныех данных int tr,tg,tb; Edit1->SetFocus(); tr=Edit1->Text.ToInt(); if(tr<0 || tr>255)throw Exception(""); Edit2->SetFocus(); tg=Edit2->Text.ToInt(); if(tg<0 || tg>255)throw Exception(""); Edit3->SetFocus(); tb=Edit3->Text.ToInt(); if(tb<0 || tb>255)throw Exception(""); r=tr; g=tg; b=tb; } catch(Exception&) { ShowMessage("Вводить нужно числа от 0 до 255!"); return; } //сформировать цвет из компонентов int color=TColor(RGB(r,g,b)); //сформировать цвет в строку для вэб-страницы String wwwcolor="#"+IntToHex(r,2)+IntToHex(g,2)+IntToHex(b,2), //сформировать цвет в строковом виде как в Borland C++ Builder bcbcolor="0x"+IntToHex(color>>24,2)+IntToHex(b,2)+IntToHex(g,2)+ IntToHex(r,2); Edit4->Text=wwwcolor; Edit5->Text=bcbcolor; Panel1->Color=(TColor)color; ColorDialog1->Color=(TColor)color; } //--------------------------------------------------------------------------- void __fastcall TForm1::Panel1Click(TObject *Sender) { if(!ColorDialog1->Execute())return; BYTE r,g,b; //извлечь компоненты цвета r=GetRValue(ColorDialog1->Color); g=GetGValue(ColorDialog1->Color); b=GetBValue(ColorDialog1->Color); Edit1->Text=r; Edit2->Text=g; Edit3->Text=b; Button1Click(0); } //---------------------------------------------------------------------------