Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


ѕечать TImage




 омпил€тор: C++ Builder

—амый простой способ напечатать TImage, это воспользоватьс€ методом print в TForm, котора€ содержит только битмап. Ётот способ работает, однако така€ картинка напечатаетс€ либо очень маленькой, либо вообще не напечатаетс€. —ледующий код позвол€ет напечатать TImage на всю страницу. “ак же ¬ы можете изменить масштаб и напечатать картинку любого размера.


«амечание: картинка должна содержать Bitmap.

/*-----------------------------------------------------------------------

Ёта функци€ €вл€етс€ обработчиком событи€ OnClick дл€ TButton, котора€

находитс€ на TForm. Ќа TForm также присутствует TImage с именем image.

------------------------------------------------------------------------*/

void __fastcall Tmain_form::print_image_btnClick(TObject *Sender)

{

TPrinter *p = Printer();

 

// создаЄм в пам€ти dc дл€ картинки

HDC h_dc = image->Picture->Bitmap->Canvas->Handle;

int bmp_w = image->Picture->Bitmap->Width,

bmp_h = image->Picture->Bitmap->Height;

HDC h_mem_dc =::CreateCompatibleDC (h_dc);

HBITMAP h_mem_bmp =::CreateCompatibleBitmap (h_dc, bmp_w, bmp_h);

HBITMAP h_old_bmp =::SelectObject (h_mem_dc, h_mem_bmp);

 

// фиксируем ошибки видео драйверов

bool is_pal_dev = false;

LOGPALETTE *pal;

HPALETTE h_pal, h_old_pal;

 

if (::GetDeviceCaps (image->Canvas->Handle, RASTERCAPS) & RC_PALETTE)

{

pal = static_cast(malloc (sizeof (LOGPALETTE) +

(sizeof (PALETTEENTRY) * 256)));

memset (pal, 0, sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256));

pal->palVersion = 0x300;

pal->palNumEntries =::GetSystemPaletteEntries(image->Canvas->Handle, 0,

256, pal->palPalEntry);

if (pal->palNumEntries!= 0)

{

h_pal =::CreatePalette (pal);

h_old_pal =::SelectPalette (h_mem_dc, h_pal, false);

is_pal_dev = true;

}

else

{

free (pal);

}

}

 

// копируем картинку на dc в пам€ти

::BitBlt (h_mem_dc, 0, 0, bmp_w, bmp_h, h_dc, 0, 0, SRCCOPY);

 

if (is_pal_dev)

{

::SelectPalette (h_mem_dc, h_old_pal, false);

::DeleteObject (h_pal);

}

 

// удал€ем dc в пам€ти

::SelectObject (h_mem_dc, h_old_bmp);

::DeleteDC (h_mem_dc);

 

// выдел€ем пам€ть дл€ структуры BITMAPIFO

HANDLE h_bmp_info =::GlobalAlloc (GHND,

sizeof (BITMAPINFO) + (sizeof (RGBQUAD) * 256));

BITMAPINFO* bmp_info = static_cast(::GlobalLock (h_bmp_info));

//«аполн€ем структуру

memset (bmp_info, NULL, sizeof (BITMAPINFO) + (sizeof (RGBQUAD) * 255));

bmp_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bmp_info->bmiHeader.biPlanes = 1;

bmp_info->bmiHeader.biBitCount = 8;

bmp_info->bmiHeader.biWidth = bmp_w;

bmp_info->bmiHeader.biHeight = bmp_h;

bmp_info->bmiHeader.biCompression = BI_RGB;

 

// определ€ем размер пам€ти дл€ битов

::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, NULL, bmp_info, DIB_RGB_COLORS);

 

// ¬ыдел€ем пам€ть дл€ битов

HANDLE h_bits = GlobalAlloc (GHND, bmp_info->bmiHeader.biSizeImage);

void *bits =::GlobalLock (h_bits);

 

// получаем биты

::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, bits, bmp_info, DIB_RGB_COLORS);

 

// фиксируем ошибки видео драйверов

if (is_pal_dev)

{

for (int i = 0; i palNumEntries; i++)

{

bmp_info->bmiColors[i].rgbRed = pal->palPalEntry[i].peRed;

bmp_info->bmiColors[i].rgbGreen = pal->palPalEntry[i].peGreen;

bmp_info->bmiColors[i].rgbBlue = pal->palPalEntry[i].peBlue;

}

free (pal);

}

 

// начинаем печать

p->BeginDoc ();

 

// масштабируем размер печати

int scale_x, scale_y;

if (p->PageWidth PageHeight)

{

scale_x = p->PageWidth;

scale_y = image->Picture->Height * (p->PageWidth / bmp_w);

}

else

{

scale_x = image->Picture->Width * (p->PageHeight / bmp_h);

scale_y = p->PageHeight;

}

 

// устанавливаем палитру печати

is_pal_dev = false;

if (::GetDeviceCaps (h_dc, RASTERCAPS) & RC_PALETTE)

{

pal = static_cast(malloc (sizeof (LOGPALETTE) +

(sizeof (PALETTEENTRY) * 256)));

memset (pal, 0, sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256));

pal->palVersion = 0x300;

pal->palNumEntries = 256;

for (int i = 0; pal->palNumEntries; i++)

{

pal->palPalEntry[i].peRed = bmp_info->bmiColors[i].rgbRed;

pal->palPalEntry[i].peGreen = bmp_info->bmiColors[i].rgbGreen;

pal->palPalEntry[i].peBlue = bmp_info->bmiColors[i].rgbBlue;

}

h_pal = CreatePalette(pal);

free (pal);

h_old_pal = SelectPalette(p->Canvas->Handle, h_pal, false);

is_pal_dev = true;

}

 

// посылаем биты на принтер

StretchDIBits(p->Canvas->Handle, 0, 0, scale_x, scale_y,

0, 0, bmp_w, bmp_h, bits,bmp_info, DIB_RGB_COLORS, SRCCOPY);

 

// конец печати

p->EndDoc ();

 

// освобождаем ресурсы

::DeleteObject (h_mem_bmp);

if (is_pal_dev)

{

::SelectObject (p->Canvas->Handle, h_old_pal);

::DeleteObject (h_pal);

}

::GlobalUnlock (bits);

::GlobalFree (h_bits);

::GlobalUnlock (bmp_info);

::GlobalFree (h_bmp_info);

}

 





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-10-01; ћы поможем в написании ваших работ!; просмотров: 393 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

—туденческа€ общага - это место, где мен€ научили готовить 20 блюд из макарон и 40 из доширака. ј майонез - это вообще десерт. © Ќеизвестно
==> читать все изречени€...

1587 - | 1544 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.057 с.