polymorphism napisał(a):Spróbuj może metody, o której pisałem wcześniej. Z dużym prawdopodobieństwem zadziała, a i kod będzie prostszy.
Nie wiem co masz na myśli.
polymorphism napisał(a):Spróbuj może metody, o której pisałem wcześniej. Z dużym prawdopodobieństwem zadziała, a i kod będzie prostszy.
polymorphism napisał(a):Pisałem żebyś użył funkcji SetDIBitsToDevice lub StretchDIBits, ale zamiast bawić się z tworzeniem bitmap w WinAPI i kopiowaniem ich, od razu kopiował z TBitmap (w której składasz wydruk) do kontekstu drukarki. Dostęp do pamięci bitmapy będziesz miał przez właściwość ScanLine.
polymorphism napisał(a):Ech, duf. Przecież te błędy są banalne, wystarczy przeczytać ze zrozumieniem ich treść. (tylko nie pisz, że jesteś początkującym, bo już trochę na tych forach siedzisz, więc pewne rzeczy powinieneś wiedzieć)[BCC32 Error] File1.cpp(158): E2034 Cannot convert 'void *' to 'HBITMAP__ *'
Zastosuj rzutowanie...[BCC32 Error] File1.cpp(169): E2379 Statement missing ;
A ten '×' w 0x300 to na pewno 'x'?[BCC32 Error] File1.cpp(252): E2268 Call to undefined function 'floor'
Nie taki undefined -> floor.
#include <math.h>
void __fastcall PrintImage(TCanvas *PrinterCanvas,int pX,int pY,
Graphics::TBitmap *TheBitmap)
{
HDC h_dc = TheBitmap->Canvas->Handle;
int bmp_w = TheBitmap->Width, bmp_h = TheBitmap->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 (TheBitmap->Canvas->Handle, RASTERCAPS) & RC_PALETTE)
{
pal = static_cast<LOGPALETTE *>(malloc(sizeof (LOGPALETTE) +
(sizeof (PALETTEENTRY) * 256)));
memset(pal, 0, sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256));
pal->palVersion = 0x300;
pal->palNumEntries = ::GetSystemPaletteEntries(TheBitmap->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);
}
}
::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);
}
::SelectObject (h_mem_dc, h_old_bmp);
::DeleteDC (h_mem_dc);
HANDLE h_bmp_info = ::GlobalAlloc(GHND, sizeof (BITMAPINFO) +
(sizeof (RGBQUAD) * 256));
BITMAPINFO* bmp_info = static_cast<BITMAPINFO *>(::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;//or 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 < pal->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);
}
is_pal_dev = false;
if( ::GetDeviceCaps (h_dc, RASTERCAPS) & RC_PALETTE)
{
pal = static_cast<LOGPALETTE *>(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(PrinterCanvas->Handle, h_pal, false);
is_pal_dev = true;
}
int PrnXRes = GetDeviceCaps(PrinterCanvas->Handle, LOGPIXELSX);
int PrnYRes = GetDeviceCaps(PrinterCanvas->Handle, LOGPIXELSY);
bmp_w = floor(((double)TheBitmap->Width / (double)Screen->PixelsPerInch) *
(double)PrnXRes);
bmp_h = floor(((double)TheBitmap->Height / (double)Screen->PixelsPerInch) *
(double)PrnYRes);
StretchDIBits(PrinterCanvas->Handle, pX, pY, bmp_w, bmp_h,
0, 0, TheBitmap->Width, TheBitmap->Height, bits,bmp_info,
DIB_RGB_COLORS, SRCCOPY);
::DeleteObject(h_mem_bmp);
if(is_pal_dev)
{
::SelectObject (PrinterCanvas->Handle, h_old_pal);
::DeleteObject (h_pal);
}
::GlobalUnlock (bits);
::GlobalFree (h_bits);
::GlobalUnlock (bmp_info);
::GlobalFree (h_bmp_info);
}
StretchDIBits(PrinterCanvas->Handle, pX, pY, bmp_w, bmp_h,
0, 0, TheBitmap->Width, TheBitmap->Height, bits,bmp_info,
DIB_RGB_COLORS, SRCCOPY);
int PrnXRes = GetDeviceCaps(PrinterCanvas->Handle, LOGPIXELSX);
int PrnYRes = GetDeviceCaps(PrinterCanvas->Handle, LOGPIXELSY);
bmp_w = floor(((double)TheBitmap->Width / (double)Screen->PixelsPerInch) *
(double)PrnXRes);
bmp_h = floor(((double)TheBitmap->Height / (double)Screen->PixelsPerInch) *
(double)PrnYRes);
Funkcje pewnie dałoby się uprościć i przyspieszyć (...)
::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, bits, bmp_info, DIB_RGB_COLORS);
Może chodzi o to: (...)
Powrót do Aplikacje multimedialne, graficzne
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość