void CMailBar::OnSize(UINT nType, int cx, int cy) { CPaneDialog::OnSize(nType, cx, cy); AdjustWidth(cx, IDC_MAIL_TO_NAME); AdjustWidth(cx, IDC_MAIL_CC_NAME); AdjustWidth(cx, IDC_MAIL_SUBJECT_NAME); }
//改變前景圖位置 bool CLayerObject::CopyToFore(LONG placex, LONG placey) { LONG i,j; float percent; LPBITMAPINFO ForeInfo; LPBYTE ForeData; ForeInfo = &m_ForeInfo ; ForeData = m_ForeData ; /////清除復合層圖像 memset(m_LayerBmpData,0xFF,AdjustWidth(m_LayerWidth*3)*m_LayerHeight); //////拷貝前景圖 MemBitBlt(m_LayerBmpData, m_LayerBmpInfo.bmiHeader.biWidth, m_LayerBmpInfo.bmiHeader.biHeight, placex, placey, ForeInfo->bmiHeader.biWidth, ForeInfo->bmiHeader.biHeight, ForeData, ForeInfo->bmiHeader.biWidth, ForeInfo->bmiHeader.biHeight, 0, 0); /////多層還需做融合效果 if(m_LayerKind==LAYER_MULTI) { j=m_LayerHeight*AdjustWidth(m_LayerWidth*3)-1; for (i=0;i<=j;i++) { if(*(m_ForeMaskData+i)<250) { if(*(m_ForeMaskData+i)>5) { percent=(float)(*(m_ForeMaskData+i)/255.0); *(m_LayerBmpData+i)=(BYTE)(*(m_TemplateBmpData+i)*percent+ *(m_LayerBmpData+i)*(1-percent)); } } else *(m_LayerBmpData+i)=*(m_TemplateBmpData+i); } } m_ForePlace.x=placex; m_ForePlace.y=placey; return TRUE; }
//建立前景圖像遮罩 bool CLayerObject::SetForeMask(LPBITMAPINFO pInfo, LPBYTE pData) { m_LayerWidth=pInfo->bmiHeader.biWidth; m_LayerHeight=pInfo->bmiHeader.biHeight; m_ForeMaskInfo=*pInfo; ///////// Creat LayerBmpDC /////////// if (m_ForeMaskData) { delete m_ForeMaskData; m_ForeMaskData = NULL; } // m_ForeMaskData=new BYTE[AdjustWidth(m_LayerWidth*3)*m_LayerHeight]; // memcpy(m_ForeMaskData, pData, // AdjustWidth(m_LayerWidth*3)*m_LayerHeight); m_ForeMaskData = pData; ///////////建立復合層數據 if (m_LayerBmpData) { delete m_LayerBmpData; m_LayerBmpData = NULL; } m_LayerBmpData=new BYTE[AdjustWidth(m_LayerWidth*3)*m_LayerHeight]; m_LayerBmpInfo=m_ForeMaskInfo; ////////////// ///////// Set size ////////// // m_LayerScale=(double)m_LayerHeight/(double)m_LayerWidth; return TRUE; }
///////縮小寬度函數 , 內部調用//////// void MemDecWidth(LPBYTE pTar,LONG TarLen, LPBYTE pSrc,LONG SrcLen) { LONG i,len; float fmod,fadd; LPBYTE pInSrc; fmod=(float)(TarLen)/(float)(SrcLen); fadd=0;//fmod; pInSrc=pSrc; len=0; TarLen=AdjustWidth(TarLen*3)-3; for(i=0;i<SrcLen;i++) { // pInSrc+=3; if(len>TarLen) break; if((int)(fadd+fmod)-(int)fadd==1||i==0) { memcpy(pTar+len,pInSrc,3); len+=3; } pInSrc+=3; fadd+=fmod; } if(len<=TarLen) memcpy(pTar+len,pInSrc-3,3); }
///////縮小高度函數 , 內部調用//////// void MemDecHeight(LPBYTE pTar,LONG TarWidth, LONG TarHeight, LPBYTE pSrc,LONG SrcWidth, LONG SrcHeight) { LONG i,j,n,m,len,AdTarWidth,AdSrcWidth; float fmod,fadd; LPBYTE pInTar; n=SrcHeight/TarHeight; m=SrcHeight%TarHeight; fmod=(float)m/(float)TarHeight; fadd=fmod; AdTarWidth=AdjustWidth(TarWidth*3); AdSrcWidth=AdjustWidth(SrcWidth*3); pInTar=pTar; len=0; if(TarWidth>=SrcWidth) for(i=0;i<TarHeight;i++) { MemAddWidth(pInTar,TarWidth,pSrc+len,SrcWidth); for(j=0;j<n;j++) len+=AdSrcWidth; if((int)(fadd+fmod)-(int)fadd==1) len+=AdSrcWidth; fadd+=fmod; pInTar+=AdTarWidth; } else for(i=0;i<TarHeight;i++) { MemDecWidth(pInTar,TarWidth,pSrc+len,SrcWidth); for(j=0;j<n;j++) len+=AdSrcWidth; if(m!=0) { if((int)(fadd+fmod)-(int)fadd==1) len+=AdSrcWidth; fadd+=fmod; } pInTar+=AdTarWidth; } }
void Bmp256to16M(LPBITMAPINFO p256Info, LPBYTE p256Data, LPBITMAPINFO p16MInfo, LPBYTE p16MData) { INT i ,j ,width1,width2,len1,len2; width1 = AdjustWidth(p256Info->bmiHeader.biWidth); width2 = AdjustWidth(p16MInfo->bmiHeader.biWidth*3); for(j=0; j<p256Info->bmiHeader.biHeight; j++) { len1 = j*width1; len2 = j*width2; for(i=0; i<p256Info->bmiHeader.biWidth ; i++) { *(p16MData+len2+i*3) = p256Info->bmiColors[*(p256Data+len1+i)].rgbBlue ; *(p16MData+len2+i*3+1) = p256Info->bmiColors[*(p256Data+len1+i)].rgbGreen; *(p16MData+len2+i*3+2) = p256Info->bmiColors[*(p256Data+len1+i)].rgbRed ; } } }
///////增大高度函數 , 內部調用//////// void MemAddHeight(LPBYTE pTar,LONG TarWidth, LONG TarHeight, LPBYTE pSrc,LONG SrcWidth, LONG SrcHeight) { LONG i,len,Srclen, AdTarWidth,AdSrcWidth; float fmod,fadd; LPBYTE pInSrc; fmod=(float)SrcHeight/(float)TarHeight; fadd=fmod; pInSrc=pSrc; len=0; Srclen=0; AdTarWidth=AdjustWidth(TarWidth*3); AdSrcWidth=AdjustWidth(SrcWidth*3); if(TarWidth>=SrcWidth) for(i=0;i<TarHeight;i++) { MemAddWidth(pTar+len,TarWidth,pInSrc,SrcWidth); if((int)(fadd+fmod)-(int)fadd==1&&Srclen<SrcHeight-1) { pInSrc+=AdSrcWidth; Srclen++; } len+=AdTarWidth; fadd+=fmod; } else for(i=0;i<TarHeight;i++) { MemDecWidth(pTar+len,TarWidth,pInSrc,SrcWidth); if((int)(fadd+fmod)-(int)fadd==1&&Srclen<SrcHeight-1) { pInSrc+=AdSrcWidth; Srclen++; } len+=AdTarWidth; fadd+=fmod; } }
//內存拷貝函數, 類似BitBlt void MemBitBlt(LPBYTE pTarData, LONG TarWidth, LONG TarHeight, LONG TarX,LONG TarY, LONG nWidth, LONG nHeight, LPBYTE pSrcData, LONG SrcWidth, LONG SrcHeight, LONG SrcX, LONG SrcY) { CRect rectTar, rectSrc; rectSrc.SetRect(max(0,SrcX),max(0,SrcY), min(SrcWidth ,SrcX+nWidth), min(SrcHeight,SrcY+nHeight)); if(rectSrc.IsRectEmpty()) return; rectSrc.SetRect(max(rectSrc.left ,SrcX-TarX), max(rectSrc.top ,SrcY-TarY), min(rectSrc.right ,max(rectSrc.left,SrcX-TarX)+TarWidth), min(rectSrc.bottom,max(rectSrc.top ,SrcY-TarY)+TarHeight)); if(rectSrc.IsRectEmpty()) return; rectTar.SetRect(max(0,max(TarX,TarX-SrcX)),max(0,max(TarY,TarY-SrcY)), min(TarWidth ,max(0,max(TarX,TarX-SrcX))+rectSrc.Width()), min(TarHeight,max(0,max(TarY,TarY-SrcY))+rectSrc.Height())); if(rectTar.IsRectEmpty()) return; int Srcline=SrcHeight-rectSrc.top-1; BYTE *pSRC,*pTAR; for(int Tarline=TarHeight-rectTar.top-1; Tarline>=TarHeight-rectTar.top-rectTar.Height(); Tarline--)//y ori . { pSRC=pSrcData+Srcline*AdjustWidth(SrcWidth*3)+rectSrc.left*3; pTAR=pTarData+Tarline*AdjustWidth(TarWidth*3)+rectTar.left*3; memcpy(pTAR,pSRC,rectTar.Width()*3);//x ori . Srcline--; } }
//改變圖層位置 bool CLayerObject::CopyToBack(LPBYTE pDCData, LPBITMAPINFO pDCInfo, LONG placex, LONG placey) { m_rectLayer.SetRect(placex,placey,placex+m_LayerWidth,placey+m_LayerHeight); LONG i,j; float percent; LPBYTE pTempData; ////需處理的內存塊的長度 j=m_LayerHeight*AdjustWidth(m_LayerWidth*3); ////開闢臨時數據塊 pTempData=new BYTE[j]; ////複製源數據塊 // m_TempDC.BitBlt(0,0,m_LayerWidth,m_LayerHeight,BackDC,placex,placey,SRCCOPY); MemBitBlt(pTempData, m_LayerWidth, m_LayerHeight, 0, 0, m_LayerWidth, m_LayerHeight, pDCData, pDCInfo->bmiHeader.biWidth, pDCInfo->bmiHeader.biHeight, placex, placey); //////融合圖層 if(m_LayerKind==LAYER_SINGLE) { for (i=0;i<j;i++) { if(*(m_ForeMaskData+i)<250) { if(*(m_ForeMaskData+i)<5) { *(pTempData+i)=*(m_LayerBmpData+i); } else { percent=(float)(*(m_ForeMaskData+i)/255.0); *(pTempData+i)=(BYTE)(*(pTempData+i)*percent+ *(m_LayerBmpData+i)*(1-percent)); } } } } else if(m_LayerKind==LAYER_MULTI) { for (i=0;i<j;i++) { if(*(m_TemplateMaskData+i)<250) { if(*(m_TemplateMaskData+i)<5) { *(pTempData+i)=*(m_LayerBmpData+i); } else { percent=(float)(*(m_TemplateMaskData+i)/255.0); *(pTempData+i)=(BYTE)(*(pTempData+i)*percent+ *(m_LayerBmpData+i)*(1-percent)); } } } } /////////輸出 // BackDC->BitBlt(placex,placey,m_LayerWidth,m_LayerHeight,&m_TempDC,0,0,SRCCOPY); MemBitBlt(pDCData, pDCInfo->bmiHeader.biWidth, pDCInfo->bmiHeader.biHeight, placex, placey, m_LayerWidth, m_LayerHeight, pTempData, m_LayerWidth, m_LayerHeight, 0, 0); delete pTempData; return TRUE; }