以下是OnPaint函數和反色函數的代碼,結果如下圖所示圖片能完整的顯示但只能對部分進行反色操作。
void CPictureView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(rect);
//得到文檔指針
CPictureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//是否打開BMP文件
LONG lWidth = pDoc->bi.biWidth;
LONG lHeight = pDoc->bi.biHeight;
LPSTR lpData = (LPSTR)pDoc->lpBuf;
LPBITMAPINFO lpBi = pDoc->pbi;
if(pDoc->flag==1)
{
SetDIBitsToDevice(dc.m_hDC, //輸出的設備描述表
rect.right/2-lWidth/2, //設備描述表中位圖輸出起始位置的x坐標
0, //設備描述表中位圖輸出起始位置的y坐標
lWidth, //DIB的寬度
lHeight, //DIB的高度
0,
0,
0,
lHeight, //DIB的行數
lpData, //像素數據內存緩沖區的指針
lpBi, //指向BITMAPINFO數據結構的指針,描述了位圖的大小和顏色
DIB_RGB_COLORS); //表示結構BITMAPINFO中包含了RGB值的數組
}
Invalidate(FALSE); //不擦除背景,直接畫
}
void CPictureView::OnInverse()
{
// TODO: Add your command handler code here
CPictureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//將lpBuf的指針復制給lpDIBBits
LPSTR lpDIBBits =(LPSTR)GlobalLock(pDoc->lpBuf); //圖像數據起始位置的指針
LONG lWidth = pDoc->bi.biWidth; //源圖像寬度
LONG lHeight = pDoc->bi.biHeight; //源圖像寬度
unsigned char* lpSrc; //某個像素對應的指針
LONG i,j,lLineBytes;
lLineBytes =WIDTHBYTES(lWidth*8); //計算每行的字節數
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
*lpSrc = 255 - (*lpSrc);
}
}
}
LONG lWidth = pDoc->bi.biWidth; //源圖像寬度
LONG lHeight = pDoc->bi.biHeight; //源圖像寬度
這裡打個斷點,看看傳的長度和寬度是否是正確的
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
*lpSrc = 255 - (*lpSrc);
}
}
這裡for怎麼只有兩層,不是要三層的啊?彩色的是3通過的啊