user-0 提问: StretchBlt应该能取代BitBlt吧？为什么还留着BitBlt?

回复:
user: user-1
content: 因为StretchBlt基于BitBlt，它只不过做了缩放，最后还是要用到BitBlt的，就跟 FindWindow最终都要调用到FindWindowEx，看着没有用，实则是为不同层次的应用程序保留的接口

user: user-0
content: 引用 6 楼 赵4老师 的回复:尺有所短，寸有所长。 进即退，得即舍。 任何问题首先是一个哲学问题。  我觉得我应该知道没有取代的另一个原因了（也许是真正原因）——设置缩放模式会影响传输效果，而BitBlt则不会受影响

user: user-2
content: 尺有所短，寸有所长。 进即退，得即舍。 任何问题首先是一个哲学问题。

user: user-2
content: 引用 3 楼 六道佩恩 的回复:[quote=引用 2 楼 赵4老师 的回复:] 电动车应该能取代自行车吧？为什么还留着自行车? 我看自行车能做到的事情，电动车好像应该都能做到  自行车有电动车没有的优点啊，但BitBlt对比StretchBlt好像没什么优点吧[/quote] 我现在这一刻能猜到的BitBlt对比StretchBlt的优点有： ◆名字短，好敲。 ◆可能早期版本只有BitBlt，StretchBlt压根没诞生，后来才有了StretchBlt。且微软希望StretchBlt诞生前已存在的调用BitBlt的程序无需在StretchBlt诞生后都必须修改为BitBlt那么麻烦，只好保留BitBlt了。（很多问题都需要这样历史地看） ◆……

user: user-0
content: 引用 5 楼 赵4老师 的回复:[quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 赵4老师 的回复:] 电动车应该能取代自行车吧？为什么还留着自行车? 我看自行车能做到的事情，电动车好像应该都能做到  自行车有电动车没有的优点啊，但BitBlt对比StretchBlt好像没什么优点吧[/quote] 我现在这一刻能猜到的BitBlt对比StretchBlt的优点有： ◆名字短，好敲。 ◆可能早期版本只有BitBlt，StretchBlt压根没诞生，后来才有了StretchBlt。且微软希望StretchBlt诞生前已存在的调用BitBlt的程序无需在StretchBlt诞生后都必须修改为BitBlt那么麻烦，只好保留BitBlt了。（很多问题都需要这样历史地看） ◆……[/quote] 666，这么一说感觉懂起了

user: user-3
content: 引用 楼主 六道佩恩 的回复:我看BitBlt能做到的事情，StretchBlt好像应该都能做到 存在即合理，思考这些没用的东西没有意义，你觉得能做到，你挑一个学习就行了，就算你不学习这个也不影响你写出好的程序。

user: user-0
content: 引用 2 楼 赵4老师 的回复:电动车应该能取代自行车吧？为什么还留着自行车? 我看自行车能做到的事情，电动车好像应该都能做到  自行车有电动车没有的优点啊，但BitBlt对比StretchBlt好像没什么优点吧

user: user-2
content: 电动车应该能取代自行车吧？为什么还留着自行车? 我看自行车能做到的事情，电动车好像应该都能做到

user: user-4
content: Win源码 /******************************Public*Routine******************************\ * PatBlt                                                                   * *                                                                          * * Client side stub.  Copies all LDC attributes into the message.           * *                                                                          * *  Wed 12-Jun-1991 01:02:25 -by- Charles Whitmer [chuckwh]                 * * Wrote it.                                                                * \**************************************************************************/  BOOL META WINAPI PatBlt(     HDC hdc,     int x,     int y,     int cx,     int cy,     DWORD rop ) {     BOOL bRet = FALSE;     PDC_ATTR pdca;      FIXUP_HANDLE(hdc);      if (IS_ALTDC_TYPE(hdc))     {         PLDC pldc;          if (IS_METADC16_TYPE(hdc))             return(MF16_RecordParmsWWWWD(hdc,(WORD)x,(WORD)y,(WORD)cx,(WORD)cy,rop,META_PATBLT));          DC_PLDC(hdc,pldc,bRet);          if (pldc->iType == LO_METADC)         {             if (!MF_AnyBitBlt(hdc,x,y,cx,cy,(LPPOINT)NULL,(HDC)NULL,0,0,0,0,(HBITMAP)NULL,0,0,rop,EMR_BITBLT))                 return(bRet);         }          if (pldc->fl & LDC_SAP_CALLBACK)             vSAPCallback(pldc);          if (pldc->fl & LDC_DOC_CANCELLED)             return(bRet);          if (pldc->fl & LDC_CALL_STARTPAGE)             StartPage(hdc);     }      RESETUSERPOLLCOUNT();      PSHARED_GET_VALIDATE(pdca,hdc,DC_TYPE);      BEGIN_BATCH_HDC(hdc,pdca,BatchTypePatBlt,BATCHPATBLT);          //         // check DC to see if call can be batched, all DCs in use         // by the client must have a valid dc_attr         //          pBatch->rop4       = rop;         pBatch->x          = x;         pBatch->y          = y;         pBatch->cx         = cx;         pBatch->cy         = cy;         pBatch->hbr        = pdca->hbrush;         pBatch->TextColor  = (ULONG)pdca->ulForegroundClr  & 0x13ffffff;         pBatch->BackColor  = (ULONG)pdca->ulBackgroundClr  & 0x13ffffff;      COMPLETE_BATCH_COMMAND();      return(TRUE);  UNBATCHED_COMMAND:      return(NtGdiPatBlt(hdc,x,y,cx,cy,rop)); }  /******************************Public*Routine******************************\ * PolyPatBlt * * Arguments: * *  hdc   - dest DC *  rop   - ROP for all patblt elements *  pPoly - pointer to array of PPOLYPATBLT structures *  Count - number of polypatblts *  Mode  - mode for all polypatblts * * Return Value: * *   BOOL Status * \**************************************************************************/  BOOL META WINAPI PolyPatBlt(     HDC         hdc,     DWORD       rop,     PPOLYPATBLT pPoly,     DWORD       Count,     DWORD       Mode     ) {     BOOL bRet = FALSE;      FIXUP_HANDLE(hdc);      if (IS_ALTDC_TYPE(hdc))     {         ULONG Index;         HBRUSH hOld;          for (Index=0;Index<Count;Index++)         {             //             // select =brush, save first to restore             //              if (Index == 0)             {                 hOld = SelectObject(hdc,pPoly[0].BrClr.hbr);             }             else             {                 SelectObject(hdc,pPoly[Index].BrClr.hbr);             }              bRet = PatBlt(hdc,                           pPoly[Index].x,                           pPoly[Index].y,                           pPoly[Index].cx,                           pPoly[Index].cy,                           rop                          );         }          //         // restore brush if needed         //          if (hOld)         {             SelectObject(hdc,hOld);         }     }     else     {         RESETUSERPOLLCOUNT();          if ((Count != 0) && (pPoly != NULL) && (Mode == PPB_BRUSH))         {             //             // size of batched structure             //              USHORT uSize = sizeof(BATCHPOLYPATBLT) +                            Count * sizeof(POLYPATBLT);             PDC_ATTR pdca;              PSHARED_GET_VALIDATE(pdca,hdc,DC_TYPE);              BEGIN_BATCH_HDC_SIZE(hdc,pdca,BatchTypePolyPatBlt,BATCHPOLYPATBLT,uSize);                  pBatch->rop4    = rop;                 pBatch->Count   = Count;                 pBatch->Mode    = Mode;                 pBatch->TextColor  = (ULONG)pdca->ulForegroundClr  & 0x13ffffff;                 pBatch->BackColor  = (ULONG)pdca->ulBackgroundClr  & 0x13ffffff;                  memcpy(&pBatch->ulBuffer[0],pPoly,Count*sizeof(POLYPATBLT));                  //                 // if the first hbr entry is NULL, copy in current hbr so                 // it is remembered.                 //                  if (((PPOLYPATBLT)(&pBatch->ulBuffer[0]))->BrClr.hbr == NULL)                 {                     ((PPOLYPATBLT)(&pBatch->ulBuffer[0]))->BrClr.hbr = pdca->hbrush;                 }                  bRet = TRUE;              COMPLETE_BATCH_COMMAND();          UNBATCHED_COMMAND:              if (!bRet)             {                 bRet = NtGdiPolyPatBlt(hdc,rop,pPoly,Count,Mode);             }         }     }      return(bRet); }  /******************************Public*Routine******************************\ * BitBlt                                                                   * *                                                                          * * Client side stub.  Copies all LDC attributes into the message.           * *                                                                          * *  Wed 12-Jun-1991 01:02:25 -by- Charles Whitmer [chuckwh]                 * * Wrote it.                                                                * \**************************************************************************/  BOOL META WINAPI BitBlt(     HDC hdc,     int x,     int y,     int cx,     int cy,     HDC hdcSrc,     int x1,     int y1,     DWORD rop ) {     BOOL bRet = FALSE;      //     // if this call redueces to PatBlt, then let PatBlt     // do the metafile and/or output.     //      if ((((rop << 2) ^ rop) & 0x00CC0000) == 0)     {         return(PatBlt(hdc,x,y,cx,cy,rop));     }      //     // Src is required by ROP, do bitblt     //      FIXUP_HANDLE(hdc);     FIXUP_HANDLE(hdcSrc);      if (IS_ALTDC_TYPE(hdc))     {         PLDC pldc;          if (IS_METADC16_TYPE(hdc))             return (MF16_BitBlt(hdc,x,y,cx,cy,hdcSrc,x1,y1,rop));          DC_PLDC(hdc,pldc,bRet);          if (pldc->iType == LO_METADC)         {             if (!MF_AnyBitBlt(hdc,x,y,cx,cy,(LPPOINT)NULL,hdcSrc,x1,y1,cx,cy,(HBITMAP)NULL,0,0,rop,EMR_BITBLT))                 return(bRet);         }          if (pldc->fl & LDC_SAP_CALLBACK)             vSAPCallback(pldc);          if (pldc->fl & LDC_DOC_CANCELLED)             return(bRet);          if (pldc->fl & LDC_CALL_STARTPAGE)             StartPage(hdc);     }      RESETUSERPOLLCOUNT();      return(NtGdiBitBlt(hdc,x,y,cx,cy,hdcSrc,x1,y1,rop,(COLORREF)-1)); }  /******************************Public*Routine******************************\ * StretchBlt                                                               * *                                                                          * * Client side stub.  Copies all LDC attributes into the message.           * *                                                                          * *  Wed 12-Jun-1991 01:02:25 -by- Charles Whitmer [chuckwh]                 * * Wrote it.                                                                * \**************************************************************************/  BOOL META WINAPI StretchBlt(     HDC   hdc,     int   x,     int   y,     int   cx,     int   cy,     HDC   hdcSrc,     int   x1,     int   y1,     int   cx1,     int   cy1,     DWORD rop ) {     BOOL bRet = FALSE;     ULONG crBackColor;      FIXUP_HANDLE(hdc);     FIXUP_HANDLEZ(hdcSrc);      if (IS_ALTDC_TYPE(hdc))     {         PLDC pldc;          if (IS_METADC16_TYPE(hdc))             return (MF16_StretchBlt(hdc,x,y,cx,cy,hdcSrc,x1,y1,cx1,cy1,rop));          DC_PLDC(hdc,pldc,bRet);          if (pldc->iType == LO_METADC)         {             if (!MF_AnyBitBlt(hdc,x,y,cx,cy,(LPPOINT)NULL,hdcSrc,x1,y1,cx1,cy1,(HBITMAP)NULL,0,0,rop,EMR_STRETCHBLT))                 return(bRet);         }          if (pldc->fl & LDC_SAP_CALLBACK)             vSAPCallback(pldc);          if (pldc->fl & LDC_DOC_CANCELLED)             return(bRet);          if (pldc->fl & LDC_CALL_STARTPAGE)             StartPage(hdc);     }      RESETUSERPOLLCOUNT();      return(NtGdiStretchBlt(hdc,x,y,cx,cy,hdcSrc,x1,y1,cx1,cy1,rop,(COLORREF)-1));  }