const int XY=40; CPoint ScrollPoint; ScrollPoint=GetScrollPosition(); m_RulerPosition.x+=ScrollPoint.x; m_RulerPosition.y+=ScrollPoint.y; int RulerLen=100;//标尺长度 int RulerLineLen;//标尺画线的像素数 int RulerBeginX,RulerBeginY,RulerEndX,RulerEndY; int TextX,TextY; int PenWidth; int RulerPosition=4;//0为左上角,1为右上角,2为左下角,3为右下角,4为自定义 int RulerDirection=1;//0为水平,1为竖直 int RulerYesNo=1;//标尺是否有刻度; COLORREF PenColor; // 创建对话框 CRulerSet DiaRulerSet;
我不是要写到屏幕DC上,我是想把它再写到文件里呀。
需要了解位图文件结构,其实很简单,就三个结构体.去MSDN看看就知道了.
是不是可以省去这一步骤?还有他们说Bmp.bmBits里是完整的数据,但是我调试时看到这个字段每次都是0,
所以每次都写出一个灰色的位图出来,是不是我取得数据时错了?
CPoint ScrollPoint;
ScrollPoint=GetScrollPosition();
m_RulerPosition.x+=ScrollPoint.x;
m_RulerPosition.y+=ScrollPoint.y;
int RulerLen=100;//标尺长度
int RulerLineLen;//标尺画线的像素数
int RulerBeginX,RulerBeginY,RulerEndX,RulerEndY;
int TextX,TextY;
int PenWidth;
int RulerPosition=4;//0为左上角,1为右上角,2为左下角,3为右下角,4为自定义
int RulerDirection=1;//0为水平,1为竖直
int RulerYesNo=1;//标尺是否有刻度;
COLORREF PenColor;
// 创建对话框
CRulerSet DiaRulerSet;
if (DiaRulerSet.DoModal() != IDOK)
{
// 返回
return;
}
PenWidth=DiaRulerSet.m_EditPenWidth;
PenColor=DiaRulerSet.ReturnColor();
RulerDirection=DiaRulerSet.m_HV;
RulerYesNo=DiaRulerSet.m_YesNo;
RulerLen=DiaRulerSet.m_EditRulerLen;
// 删除对话框
delete DiaRulerSet;
//int TextLen;
if(m_RulerPosition.x<=0)
RulerPosition=0;
int RulerUnitLen;
if(RulerDirection==0)
{
RulerUnitLen=(int)(5/CurrentScaler.HCoefficient+0.5);
RulerLineLen=RulerLen/5*RulerUnitLen;
if(RulerYesNo==0)
RulerLineLen=(int)(RulerLen/CurrentScaler.HCoefficient+0.5);
}
else
{
RulerUnitLen=(int)(5/CurrentScaler.VCoefficient+0.5);
RulerLineLen=RulerLen/5*RulerUnitLen;
if(RulerYesNo==0)
RulerLineLen=(int)(RulerLen/CurrentScaler.VCoefficient+0.5);
}
if(RulerUnitLen==0&&RulerYesNo==1) return;
CString strMessage;
strMessage.Format (_T ("%d"),RulerLen);
strMessage+="um";
CCh1_1Doc* pDoc =GetDocument();
HDIB hDIB=pDoc->GetHDIB();
m_UnDo[++m_UnDoCount]=CopyHandle(hDIB);
m_bUnDo=true;
// 指向DIB的指针
LPSTR lpDIB;
// 锁定DIB,返回指向DIB的第一个地址指针,以后解锁。
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
int lHeight,lWidth;
lHeight=DIBHeight(lpDIB);
lWidth=DIBWidth(lpDIB);
switch (RulerPosition)
{
case 0://左上角
if(RulerDirection==0)
{
RulerBeginX=XY;
RulerBeginY=XY;
RulerEndX=XY+RulerLineLen;
RulerEndY=XY;
TextX=RulerBeginX+(RulerLineLen)/2-21;
TextY=XY-20;
}
else
{
RulerBeginX=XY;
RulerBeginY=XY;
RulerEndX=XY;
RulerEndY=XY+RulerLineLen;
TextX=RulerBeginX+10;;
TextY=RulerBeginY+RulerLineLen/2-8; }
break;
case 1://右上角
if(RulerDirection==0)
{
RulerBeginX=lWidth-XY;
RulerBeginY=XY;
RulerEndX=lWidth-(XY+RulerLineLen);
RulerEndY=XY;
TextX=lWidth-(40+RulerLineLen/2+21);
TextY=XY-20;
}
else
{
RulerBeginX=lHeight-XY;
RulerBeginY=XY;
RulerEndX=lHeight-XY;
RulerEndY=XY+RulerLineLen;
TextX=lHeight-XY-20;
TextY=40+RulerLineLen/2-21; }
break;
case 2://左下角
if(RulerDirection==0)
{
RulerBeginX=XY;
RulerBeginY=lHeight-XY;
RulerEndX=XY+RulerLineLen;
RulerEndY=lHeight-XY;
TextX=40+RulerLineLen/2-21;
TextY=lHeight-XY-20;
}
else
{
RulerBeginX=XY;
RulerBeginY=lHeight-XY;
RulerEndX=XY;
RulerEndY=lHeight-(XY+RulerLineLen);
TextX=XY-20;
TextY=lHeight-XY+RulerLineLen/2-21;
}
break;
case 3://右下角
if(RulerDirection==0)
{
RulerBeginX=lWidth-(XY+RulerLineLen);//lWidth-40;
RulerBeginY=lHeight-XY;
RulerEndX=lWidth-XY;
RulerEndY=lHeight-XY;
TextX=RulerBeginX+RulerLineLen/2-21;
TextY=RulerEndY-20;//RulerLineLen/2-16;
}
else
{
RulerBeginX=lWidth-XY;
RulerBeginY=lHeight-XY;
RulerEndX=lWidth-XY;
RulerEndY=lHeight-(XY+RulerLineLen);
TextX=XY-20;
TextY=lHeight-40+RulerLineLen/2-21;
}
break;
case 4:
if(RulerDirection==0)
{
RulerBeginX=m_RulerPosition.x-RulerLineLen/2;
RulerBeginY=m_RulerPosition.y;
RulerEndX=m_RulerPosition.x+RulerLineLen/2;
RulerEndY=m_RulerPosition.y;
TextX=RulerBeginX+RulerLineLen/2-19;;
TextY=RulerBeginY-XY+20;
}
else
{
RulerBeginX=m_RulerPosition.x;
RulerBeginY=m_RulerPosition.y-RulerLineLen/2;
RulerEndX=m_RulerPosition.x;
RulerEndY=m_RulerPosition.y+RulerLineLen/2;
TextX=RulerBeginX+10;
TextY=RulerBeginY+RulerLineLen/2-8;
}
break;
default :
if(RulerDirection==0)
{
RulerBeginX=XY;
RulerBeginY=XY;
RulerEndX=XY+RulerLineLen;
RulerEndY=XY;
TextX=RulerBeginX+(RulerLineLen)/2-21;
TextY=XY-20;
}
else
{
RulerBeginX=XY;
RulerBeginY=XY;
RulerEndX=XY;
RulerEndY=XY+RulerLineLen;
TextX=XY+20;
TextY=XY+RulerLineLen/2-21; }
break;
}
HDC hDC = NULL, hSourceDC;
HBITMAP hSourceBitmap;
DWORD dwSourceBitsSize; LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)lpDIB;
// Gonna use DIBSections and BitBlt() to do the conversion, so make 'em
hDC = ::GetDC(NULL);
hSourceBitmap = CreateDIBSection( hDC, lpSrcDIB, 0, &m_lpSourceBits, NULL, 0 );
hSourceDC = CreateCompatibleDC( hDC );
dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount);
memcpy( m_lpSourceBits, ::FindDIBBits(lpDIB), dwSourceBitsSize );
m_pMemDC = new CDC;
m_pMemDC->CreateCompatibleDC(NULL);
m_hOldSourceBitmap=(HBITMAP) m_pMemDC->SelectObject(hSourceBitmap);
DeleteDC( hSourceDC );
::ReleaseDC( NULL,hDC );
//CBrush *OldBrush;
//OldBrush=(CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH);//创建一个不填充的画刷
// m_pMemDC->SetBkColor(TRANSPARENT);//OPAQUE
int OldBKMode=m_pMemDC->SetBkMode(TRANSPARENT);
// m_pMemDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
CPen pen,*OldPen;
pen.CreatePen(0,PenWidth,PenColor);//(PenStyle,PenWidth,RGB(PenColor,PenColor,PenColor));
OldPen=(CPen *)m_pMemDC->SelectObject(pen);
COLORREF OldColor=m_pMemDC->SetTextColor(PenColor); m_pMemDC->MoveTo(RulerBeginX,RulerBeginY);
m_pMemDC->LineTo(RulerEndX,RulerEndY );
if(RulerDirection==0)
{
m_pMemDC->MoveTo(RulerBeginX,RulerEndY+5);
m_pMemDC->LineTo(RulerBeginX,RulerEndY-5 );
}
else
{
m_pMemDC->MoveTo(RulerEndX-5,RulerBeginY);
m_pMemDC->LineTo(RulerEndX+5,RulerBeginY );
}
if(RulerYesNo==1)
{
int i,j;
int TemEndY,TemBeginY,Tem1,Tem2;
if(RulerDirection==0)
{
Tem1=RulerBeginX;
Tem2=RulerEndX;
}
else
{
Tem1=RulerBeginY;
Tem2=RulerEndY;
}
for(i=Tem1,j=0;i<=Tem2;i+=RulerUnitLen,j++)
{
if(RulerDirection==0)
{
TemEndY=RulerEndY;
TemBeginY=RulerBeginY;
}
else
{
TemEndY=RulerEndX;
TemBeginY=RulerBeginX; }
if(j%2==0)
{
TemBeginY+=5;
TemEndY-=5;
}
else
{
TemBeginY+=3;
TemEndY-=3;
}
if(RulerDirection==0)
{
m_pMemDC->MoveTo(i,TemBeginY);
m_pMemDC->LineTo(i,TemEndY );
}
else
{
m_pMemDC->MoveTo(TemBeginY,i);
m_pMemDC->LineTo(TemEndY,i );
}
}
}
if(RulerDirection==0)
{
m_pMemDC->MoveTo(RulerEndX,RulerEndY+5);
m_pMemDC->LineTo(RulerEndX,RulerEndY-5 );
m_pMemDC->TextOut( TextX,TextY, strMessage);
}
else
{
m_pMemDC->MoveTo(RulerEndX-5,RulerEndY);
m_pMemDC->LineTo(RulerEndX+5,RulerEndY );
m_pMemDC->TextOut( TextX,TextY, strMessage);
}
dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount);
memcpy( ::FindDIBBits(lpDIB),m_lpSourceBits,dwSourceBitsSize);
m_pMemDC->SelectObject(m_hOldSourceBitmap);
m_pMemDC->SelectObject(&OldPen);
m_pMemDC->SetBkMode(OldBKMode);
m_pMemDC->SetTextColor(OldColor);
pen.DeleteObject();
//m_pMemDC->SelectObject(OldBrush);
GlobalUnlock((HGLOBAL) hDIB);//解锁DIB,丢掉这段内存
delete m_pMemDC;
pDoc->UpdateAllViews(NULL);
照着做,其中关于swithc中的部分不用管他。那里有许多没用的和错的。是为了以后扩程序用的。现在用不着。只用着左上角和自定义两部分。
我是写到DC里去了,但是位图里的数据没变。to wrcluomo(落木):
谢谢,我用这个方法试试。
{
HDC hdcBitmap; //原位图的设备
HBITMAP hbitmap; //原位图
HDC hdcMem; //处理后的设备
HBITMAP hbitmapMem; //处理的位图
BITMAP bitmap; //处理位图的描述
char* pBufChange=NULL; //处理后的位图像素
int bufsize; //位图大小 bufsize=pBitmap->bmWidthBytes*pBitmap->bmHeight;
pBufChange=new char[bufsize];
memcpy(pBufChange,pBuffer,bufsize); //创建原始位图
hdcBitmap=CreateCompatibleDC(NULL);
hbitmap=CreateBitmapIndirect(pBitmap);
SetBitmapBits(hbitmap,bufsize,pBuffer);
SelectObject(hdcBitmap,hbitmap); //创建处理位图
hdcMem=CreateCompatibleDC(NULL);
memcpy(&bitmap,pBitmap,sizeof(BITMAP));
hbitmapMem=CreateBitmapIndirect(&bitmap);
SetBitmapBits(hbitmapMem,bufsize,pBufChange);
SelectObject(hdcMem,hbitmapMem); //画过来
BitBlt(hdcMem,0,0,pBitmap->bmWidth,pBitmap->bmHeight,
hdcBitmap,0,0,SRCCOPY); GetObject(hbitmapMem,sizeof(BITMAP),&bitmap); char Buf[20];
wsprintf(Buf,"Justin");
iReturn=TextOut(hdcMem,10,10,BufTime,strlen(Buf)); //将位数据再拷贝回去
memcpy(pBuffer,pBufChange,bufsize); //删除不用的变量
delete pBufChange;
DeleteObject(hbitmapMem);
DeleteObject(hbitmap);
DeleteDC(hdcMem);
DeleteDC(hdcBitmap);
return;
}////////////////////////////////////////////////////////////////
看看我的代码,错在哪里?