::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-07 09:24:06, Hit : 5707, Vote : 1340
 투명한 Bitmaps 인쇄

Hello All!!

Any help for a programmer in the little woods of Rochester??

I can display several transparent bitmaps onto the screen canvas, but when
it comes to printing... It is a different story! I use Microsoft's
DrawTransparentBitmap routine to display the graphics onto the screen. And
I tried the same thing for printing and nothing comes out but black boxes.
I have taken care of the stretching and coloring before I get to the
routine.

Any ideas or suggestion would be greatly appreciated!

The Crew.


This is part of the routine to get it ready to print...

  theBMP := TBitmap.Create ;
  theStretch := TBitmap.Create ;
  theBMP.Width := Round((PictItem^.Width)*widthDiff) ;
  theBMP.Height := Round((PictItem^.Height)*heightDiff) ;
  try
    theStretch.LoadFromFile(PictPath) ;

    {*** This puts in the palette to keep high-resolution bitmaps clear ***}
    SelectPalette(theBMP.Canvas.Handle, frmCalMain.imgLogo.Picture.Bitmap.Palette, True) ;
    SetStretchBltMode(theBMP.Canvas.Handle, STRETCH_DELETESCANS) ;

    {*** First stretch before displaying picture (the work-around for Win95) ***}
    StretchBlt(theBMP.Canvas.Handle, 0, 0, Round((PictItem^.Width)*widthDiff),
               Round((PictItem^.Height)*heightDiff), theStretch.Canvas.Handle, 0, 0,
               theStretch.Width, theStretch.Height, SRCCOPY);


    {*** Now draw the transparent picture onto the printer ***}
    DrawTransparentBitmap(Printer.Canvas, theBMP,
                          Round((PosX-borderPosL)*widthDiff), Round((PosY-borderPosT)*heightDiff), clOlive) ;
   finally
     theBMP.Free ;
     theStretch.Free ;
   end ;

If I do the above onto the screen canvas, no problem, but to the printer....
Sorry, no cigar!


Here is the routine to draw transparent bitmaps:

procedure DrawTransparentBitmap(Canvas : TCanvas ; BMP : TBitmap ; xStart,
yStart : Integer ;
                                cTransparentColor : LongInt) ;
var
  bm : WinTypes.TBitmap ;
  cColor : TColorRef ;
  bmAndBack,
  bmAndObject,
  bmAndMem,
  bmSave,
  oldBmp : HBITMAP ;
  bmBackOld,
  bmObjectOld,
  bmMemOld,
  bmSaveOld,
  hBmp : HBITMAP ;
  hdcMem,
  hdcBack,
  hdcObject,
  hdcTemp,
  hdcSave,
  dc : HDC ;
  ptSize : WinTypes.TPoint ;
  temp_bitmap : TBitmap ;
begin
  temp_bitmap := TBitmap.Create;
  temp_bitmap.Assign(bmp);
  try
    dc := Canvas.Handle;
    hBmp := Temp_Bitmap.Handle;
    hdcTemp := CreateCompatibleDC(dc);
    oldBmp := SelectObject(hdcTemp, hBmp);

    GetObject(hBmp, SizeOf(bm), @bm);

    ptSize.x := bm.bmWidth ;
    ptSize.y := bm.bmHeight ;

    hdcBack := CreateCompatibleDC(dc);
    hdcObject := CreateCompatibleDC(dc);
    hdcMem := CreateCompatibleDC(dc);
    hdcSave := CreateCompatibleDC(dc);

    bmAndBack := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);
    bmAndObject := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);
    bmAndMem := CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);
    bmSave := CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);

    bmBackOld := SelectObject(hdcBack, bmAndBack);
    bmObjectOld := SelectObject(hdcObject, bmAndObject);
    bmMemOld := SelectObject(hdcMem, bmAndMem);
    bmSaveOld := SelectObject(hdcSave, bmSave);

    SetMapMode(hdcTemp, GetMapMode(dc));

    BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

    cColor := SetBkColor(hdcTemp, cTransparentColor);

    BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

    SetBkColor(hdcTemp, cColor);

    BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, dc, xStart, yStart, SRCCOPY);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
    BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);
    BitBlt(dc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);
    BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

    DeleteObject(SelectObject(hdcBack, bmBackOld));
    DeleteObject(SelectObject(hdcObject, bmObjectOld));
    DeleteObject(SelectObject(hdcMem, bmMemOld));
    DeleteObject(SelectObject(hdcSave, bmSaveOld));

    SelectObject(hdcTemp, oldBmp);

    DeleteDC(hdcMem);
    DeleteDC(hdcBack);
    DeleteDC(hdcObject);
    DeleteDC(hdcSave);
    DeleteDC(hdcTemp);
  finally
    Temp_Bitmap.Free;
  end ;
end;



-----------------------------------------------------------------------------
Re: Printing differences between NT and Win95???

Actually we did find the error i TPrinter, and have resolved it into this
wrapper function, it works, but the transparency problem still persists in
this version. Do anyone have any suggestions?

procedure THSPrinter.PrintBitmap(Bitmap: Graphics.TBitmap; X, Y, pWidth, pHeight: Integer);
var
  Info     : PBitmapInfo;
  InfoSize : Integer;
  Image    : Pointer;
  {$IFDEF WIN32}
  ImageSize: DWord;
  {$ELSE}
  ImageSize: LongInt;
  {$ENDIF}
  R: Real;
  PrinterHeight, PrinterWidth: Integer;

  begin
    if (pWidth<1) or (pHeight<1) then
    begin
      pWidth:= Bitmap.Width;
      pHeight:= Bitmap.Height;
    end;
    with Bitmap do
    begin
      GetDIBSizes (Handle,InfoSize,ImageSize);
      Info:= MemAlloc(InfoSize);
      try
        Image:= GlobalAllocPtr(HeapAllocFlags,ImageSize);
        try
          GetDIB(Handle,Palette,Info^,Image^);
          R:= Info^.bmiHeader.biWidth;
          R:= R/Info^.bmiHeader.biHeight;
          PrinterWidth:= Trunc (pHeight*R);
          if PrinterWidth>pWidth then
          begin
            PrinterWidth:= pWidth;
            PrinterHeight:= Trunc (PrinterWidth/R);
          end
          else
            PrinterHeight:= pHeight;
          with Info^.bmiHeader do
            StretchDIBits (Printer.Canvas.Handle,(pWidth-PrinterWidth) DIV 2,
                          (pHeight-PrinterHeight) DIV 2,PrinterWidth,PrinterHeight,
                           X,Y,X+biWidth,Y+biHeight,Image,Info^,DIB_RGB_COLORS,SRCCOPY);
        finally
          GlobalFreePtr(Image);
        end;
      finally
        FreeMem (Info,InfoSize);
      end;
    end;
  end;


Davie Reed wrote:

> I have been told that this is an old issue. It seems that the TPrinter
> module in Delphi has PROBLEMS in it. And that you can NOT relaibly use the
> DRAW or STRETCHDRAW :(
>
> So, instead you can use the StretchDiBits funtion to draw/stretch to the
> printer canvas's DC.
>
> Davie
>
> Stig Bircherod Calundan wrote:
>
> > We have a problem when we print bitmaps on Win95 + 98, but not on NT4,
> > the problem consists of the white part of a bitmap, which NT interprets
> > as transparent (thas ok), but on Win95 the white part is painted as a
> > gray area. The intensity of the graying is different on different
> > printers, though color printers does interpret the white area correctly.
> >
> > The bitmaps is loaded into a TBitmap using abitmap.handle:= loadbitmap
> > (...), and is later drawn to the printers canvas, with the canvas.draw
> > command.
> >
> > The printer used on both Win95 and NT is a HP LaserJet 5Si/5Si MX PS
> > with the latest printer drivers...
> >
> > Please help....
> >
> > Stig





731   [COM/OLE] 윈도우즈 "검색: 파일 또는 폴더" 화면  김영대 2004/07/25 4817 1345
730   [일반/컴포넌트] StringGrid - multiline text  김영대 2003/03/07 5751 1345
729   [시스템] 내 프로그램의 실행 우선순의 바꾸기  김영대 2004/07/24 4935 1344
728   [일반/컴포넌트] 리스트뷰에서 동적으로 칼럼삭제하기  김영대 2003/03/05 4977 1344
727   [일반/컴포넌트] TStringGrid 인쇄하기  김영대 2003/03/07 5410 1343
726   [COM/OLE] TWebBrowser 에서 새창을 열때 cookie 공유되게 하기  김영대 2004/11/24 6514 1340
  [일반/컴포넌트] 투명한 Bitmaps 인쇄  김영대 2003/03/07 5707 1340
724   [윈도우즈 API] TaskBar의 다양한 기능제어  김영대 2003/03/07 4975 1339
723   [일반/컴포넌트] Caption Bar위에 버튼 올리기  김영대 2003/03/05 4862 1336
722   [일반/컴포넌트] 폼에 자석효과 주기 (Delphi 6 이하)  김영대 2005/08/04 6249 1335
721   [윈도우즈 API] 세로 타이틀바 만들기  김영대 2004/08/04 4876 1334
720   [시스템] DOS 명령어 실행하고 결과 받아오기 (Win2k,XP)  김영대 2004/08/03 5597 1334
719   [일반/컴포넌트] QuickReport에서 프린터 바꾸어서 출력하기  김영대 2003/03/06 5378 1334
718   [윈도우즈 API] 바탕화면의 모든 창 최소화하기  김영대 2006/02/28 5555 1333
717   [시스템] IP address 바꾸기  김영대 2003/03/07 5329 1332
716   [시스템] System, User, GDI Resource  김영대 2003/03/07 4561 1331
715   [시스템] CD-ROM 문 열기/닫기  김영대 2003/03/04 4696 1331
714   [일반/컴포넌트] 문자열의 암호화(Password 처리) & INI 파일  김영대 2003/03/06 5817 1330
713   [윈도우즈 API] 프린터 스풀러에 대기중인 job의 수  김영대 2003/03/04 4494 1330
712   [네트웍/인터넷] Internet에 연결중인지 여부를 알려면...  김영대 2003/03/04 5163 1329
711   [일반/컴포넌트] StringGrid의 중간에 제목 Cell 두기  김영대 2003/03/07 5262 1328
710   [윈도우즈 API] 폼의 최대/최소화 막기  김영대 2003/03/06 4927 1327
709   [시스템] PrintScreen 키가 눌렸는지 검사하기  김영대 2003/03/04 4260 1327
708   [시스템] 프린터의 "용지 공급" 리스트 구하기  김영대 2003/03/07 4607 1326
707   [시스템] Sleep 중에도 타이머 이벤트 발생시키기  김영대 2004/08/09 5722 1325
706   [윈도우즈 API] 작업표시줄이 자동 숨김인지 검사  김영대 2003/03/04 5005 1325
705   [윈도우즈 API] 도구모음 Bar는 어떻게 만드는지...  김영대 2003/03/04 4679 1325
704   [일반/컴포넌트] 실행파일에서 잃어버린 DFM 파일 뽑아내기  김영대 2004/08/17 4994 1324
703   [일반/컴포넌트] WMF 를 BMP 로 변환하기  김영대 2003/03/07 4299 1324
702   [일반/컴포넌트] DateTimePicker 의 표시형식(format) 바꾸기  김영대 2003/03/04 5558 1323
701   [윈도우즈 API] 키보드의 임의키 발생  김영대 2003/03/04 5146 1323
700   [일반/컴포넌트] TMemo 스크롤 다운 시키기  김영대 2003/03/29 4567 1322
699   [윈도우즈 API] 윈도우즈 탐색기와의 연동  김영대 2003/03/04 5411 1322
698   [데이터베이스] DB그리드 Row Height를 조절할 수 있는 콤포넌트  김영대 2003/03/05 5066 1321
697   [윈도우즈 API] Application의 최소화시 Zooming 효과 주기  김영대 2003/03/05 4465 1321
696   [시스템] Windows NT 에서 한글 NT인지 영문 NT인지 구분하는 방법  김영대 2003/03/04 5087 1321
695   [데이터베이스] WAVE 파일을 테이블에 저장하고 불러와서 연주하기  김영대 2003/03/05 4708 1319
694   [시스템] NTFS 파일 시스템 사용 여부  김영대 2004/08/25 5025 1317
693   [일반/컴포넌트] 주어진 년,월,주의 다음주  김영대 2003/03/05 4333 1317
692   [윈도우즈 API] 파일의 확장명으로 실행화일 연결  김영대 2003/03/04 4958 1316

[1][2][3][4][5][6] 7 [8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero