[bcb6] drukowanie i skalowanie

0

helo!

sciagnalem gdzies ze strony borlanda kod jak drukowac bitmape na calej
stronie
uzywajac skalowania - pisze tam ze dziala do buildera5 wlacznie a mam 6 i
wyskakuja bledy przy kompilacji w mioejscu rzutowań static_cast. Wrzucam
caly ten artykul jesli ktos moze pomoc to bardzo prosze.gdyz program mi
dziala dobrze na bitmapach ale nie moge drukowania dopiac na osatni guzik a
musi drukowac na calej stronie. - Bledy kompilacji wyskakuja w miejscu
gdzie jest: " pal=static_cast ... " - sa chyba 3 takie miejsca- kompilator
pisze " < expected"
dodaje po static_cast "<T>" ale to nic nie daje najlepiej jak ktos utworzy
przycisk forme i image i wklei ten kod pod przycisk i spróbuje skompilowac
Moze ktos ten kod skopiowacdo buildera 6 tak jak pisze ponizej w artykule i sprobowac to zmienic zeby dzialalo nie rozumiem dzialania static_cast pozdr

// TU ZACZYNA SIE ARTYKUL I DO KONCA POSTA

Abstract: This document describes how to print a TImage that contains a
Bitmap at a size that you scale to.

The simple way to print a TImage is to use the print method of a TForm that
contains only the bitmap. This works, except that on many machines this will
print out too small, or will fail to print. The following code will print
the TImage at a size that is scaled to fit the whole page. You could change
the scaling and have it print to whatever size you want.

Note: The image must contain a Bitmap. This particular function will only
work if it is a Bitmap, icons and cursors will not work.

/-----------------------------------------------------------------------
This function is the OnClick event of a TButton that is on a TForm.
On the TForm is also a TImage named image.
------------------------------------------------------------------------
/
void __fastcall Tmain_form::print_image_btnClick(TObject *Sender)
{
TPrinter *p = Printer();

// create a memory dc for the image
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);

// fix up bad video drivers
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);
}
}

// copy the image on to the memory 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);
}

// delete the mem dc
::SelectObject (h_mem_dc, h_old_bmp);
::DeleteDC (h_mem_dc);

// get memory for a BITMAPIFO Structure
HANDLE h_bmp_info = ::GlobalAlloc (GHND, sizeof (BITMAPINFO) + (sizeof

(RGBQUAD) * 256));
BITMAPINFO* bmp_info = static_cast(::GlobalLock (h_bmp_info));
//Set up the structure
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;

// find out how much memory for the bits
::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, NULL, bmp_info, DIB_RGB_COLORS);

// Allocate memory for the bits
HANDLE h_bits = GlobalAlloc (GHND, bmp_info->bmiHeader.biSizeImage);
void *bits = ::GlobalLock (h_bits);

// this time get the bits
::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, bits, bmp_info, DIB_RGB_COLORS);

// fix up for bad video driver
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);
}

// begin the printing
p->BeginDoc ();

// scale print size
int scale_x, scale_y;
if (p->PageWidth < p->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;
}

// fix up for print with palette
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;
}

// send the bits to the printer
StretchDIBits(p->Canvas->Handle, 0, 0, scale_x, scale_y,

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

// end the print
p->EndDoc ();

// clean up
::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);

}



Products:
Borland C++ Builder 1.0, Borland C++ Builder 3.0, Borland C++ Builder 4.0,
Borland C++ Builder 5.x

Platforms:
Windows 2000 1.0; Windows 95 1.00B; Windows 98 1.0; Windows NT 4.0, 4.0 SP5,
3.51

0

Uzycie:

static_cast<typ_na_ktory_rzutujesz>
0

tylko ja nie wiem na jaki typ ma tam rzutowac - utworz formularz wstaw 1 button i image o nazwie "image" i skopiuj zrodlo do buttona i skompiluj :) jesli umie ktos to poprawic to bede wdzieczny :)probowalem z tymi typami rzutowania ale nie wiem co i jak pzdr

0

Przeciez masz napisane, ze np.

pal

jest typu LOGPALETTE *

  [glowa] 

//DOPISANE:
U mnie sie kompiluje i nawet dziala. Ten typ to 
```cpp
LOGPALETTE *

a nie LOGPALETTE

 Powodzenia.
0

no wiem ze to LOGPALETTE az taki lolek nie jestem ;) jesli moge Cie prosic to wlep to dopisz rzutowania i zobacz czy sie kompiluje bo u mnie nie :/ :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1