求教高手,关于几个API(100分)

  • 主题发起人 张无极
  • 开始时间

张无极

Unregistered / Unconfirmed
GUEST, unregistred user!
哪位大侠不吝赐教,指点一下下面的代码含义:<br>SourceDC:=CreateDC('DISPLAY','','',nil);<br>DestDC:=CreateCompatibleDC(SourceDC);<br>Bhandle:=CreateCompatibleBitmap(SourceDC,<br>RectWidth,RectHeight);<br>SelectObject(DestDC,Bhandle);<br>BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,<br>LeftPos,TopPos,SRCCOPY);<br>Bitmap:=TBitmap.Create;<br>Bitmap.Handle:=BHandle;<br>BitMap.SaveToStream(BmpStream);<br>每条语句字面上的意思在下明白,只是不能了解为什么这样做,正所谓"知其然,<br>不知其所以然",有哪位高人从WINDOWS编程原理这一角度深入浅出指点一二,<br>当真感激不尽,网上我也查了,讲的却总是模模糊糊,不得已在此求救!
 
SourceDC:=CreateDC('DISPLAY','','',nil); &nbsp;//建立屏幕 DC ,是GDI的概念,用于绘画<br>DestDC:=CreateCompatibleDC(SourceDC); &nbsp; &nbsp; //建立和 SourceDC 兼容的目标 DC<br>Bhandle:=CreateCompatibleBitmap(SourceDC, //建立和 SourceDC 兼容图像,返回句柄<br>RectWidth,RectHeight);<br>SelectObject(DestDC,Bhandle); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //在目标DC中使用刚才建立的图像对象句柄 <br>BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,<br>LeftPos,TopPos,SRCCOPY); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 从 SourceDC拷贝拷贝一个矩形区域<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 克上角为(LeftPos,TopPos),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;大小为(RectWidth,RectHeight)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//该图像在目标DC DestDC中的位置是(0,0)<br>Bitmap:=TBitmap.Create; &nbsp; &nbsp; &nbsp;//以下重置 Bitmap的句柄,将图像保存到流中。<br>Bitmap.Handle:=BHandle;<br>BitMap.SaveToStream(BmpStream);<br><br>//大概意思就是这样。
 
这不是屏幕拷贝代码吗!
 
to jsxjd:<br>首先感激大师的指点!<br>SourceDC:=CreateDC('DISPLAY','','',nil); &nbsp;//建立屏幕 DC ,是GDI的概念,用于绘画<br>俺知道是建立设备上下文 ,在这段程序中这句到底是实现了什么样的功能呢?<br>DestDC:=CreateCompatibleDC(SourceDC); &nbsp; &nbsp; //建立和 SourceDC 兼容的目标 DC<br>俺也知道这是建立和 SourceDC 兼容的目标 DC,但为什么要这样做呢?<br>其它的语句也是,我知道它们表面的意思,只是不知为什么要这样做?我的问题<br>就象炒土豆一样,炒一个土豆要先削皮,再切成丝,再清洗,现在我知道这些步骤,<br>但不知为什么要削皮,为什么要切成丝,为什么要清洗,不弄清楚这些,<br>我虽然知道了土豆怎么炒,但下次让俺炒别的菜俺还是不会的啊?<br>求高手指点迷津!!!<br><br>
 
GDi 的绘画都是通过 DC 的<br>因为你现在要获得屏幕的绘画信息,所以道德要获得该DC<br><br>你现在要将屏幕中的内容通过DC拷贝到其它地方,则还需要一个DC。<br>而这个DC不是其它现成对象的DC(如果有,你可以直接拿来用),<br>所以要建立一个DC,第二句就是在内存中建立一个这样的DC。<br><br>&nbsp; &nbsp; 其实这里建立内存兼容DC的步骤可以省略,因为后面用<br>了 TBitmap,TBitmap 中有现成的DC。<br><br><br>跟踪屏幕像素颜色。<br><br>在Form中放一 TLabel(Label1),再放置一定时器(TTimer).<br>然后粘贴以下定时器代码即可运行。<br>当鼠标在屏幕的任何位置移动时,Label中显示鼠标所指<br>像素的颜色(十六进制 RGB 格式)。<br><br>///////////////以下是定时器的处理代码:<br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br>&nbsp; P: &nbsp; TPoint;<br>&nbsp; co: &nbsp;TColor;<br>&nbsp; ScreenDC : HDC;<br>&nbsp; fBitmap : TBitmap;<br>begin<br>&nbsp; GetCurSorPos(P);<br>&nbsp; fBitmap := TBitmap.Create;<br>&nbsp; fBitmap.Width := 1;<br>&nbsp; fBitmap.Height := 1;<br>&nbsp; ScreenDC:=CreateDC('DISPLAY',nil,nil,nil);<br>&nbsp; BitBlt(FBitmap.Canvas.Handle, 0,0,<br>&nbsp; &nbsp; FBitmap.Width, FBitmap.Height,<br>&nbsp; &nbsp; ScreenDC, p.x,p.y, SRCCOPY);<br>&nbsp; DeleteDC(ScreenDC);<br>&nbsp; label1.caption:=inttohex(fbitmap.canvas.pixels[0,0],8);<br>&nbsp; fBitmap.Free<br>end;<br>
 
SourceDC:=CreateDC('DISPLAY','','',nil); &nbsp;//建立屏幕 DC ,是GDI的概念,用于绘画<br>这一句指令是SourceDC这个句柄中就包含了屏幕的图像吗?<br>DestDC:=CreateCompatibleDC(SourceDC); &nbsp; &nbsp; //建立和 SourceDC 兼容的目标 DC<br>在这儿"和SourceDC兼容"是什么意思啊?<br>Bhandle:=CreateCompatibleBitmap(SourceDC, //建立和 SourceDC 兼容图像,返回句柄<br>RectWidth,RectHeight);<br>这一句是将屏幕图像复制到BHandle这个句柄中了吗?<br>BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,<br>LeftPos,TopPos,SRCCOPY);这一句和整个的屏幕copy功能有什么联系啊?<br>唉,最可怕的不是不懂,而是说不出自已怎么不懂???求高手 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br><br>
 
SourceDC:=CreateDC('DISPLAY','','',nil); &nbsp;//建立屏幕 DC ,是GDI的概念,用于绘画<br>这一句指令是SourceDC这个句柄中就包含了屏幕的图像吗?<br>这一句只是创建一个屏幕的DC,类似于得到窗体的句柄。目前这个DC只是一个值,但由于<br>ScreenDC的特殊性,它是屏幕的信息,所以通过该DC可以得到桌面的图像信息。<br><br>DestDC:=CreateCompatibleDC(SourceDC); &nbsp; &nbsp; //建立和 SourceDC 兼容的目标 DC<br>在这儿"和SourceDC兼容"是什么意思啊?<br>这是一个通常的操作,双缓冲技术,为了在内存之间进行图像操作的处理。<br>也就是开辟另外一个DC,该DC和SourceDC相似。<br><br>Bhandle:=CreateCompatibleBitmap(SourceDC, //建立和 SourceDC 兼容图像,返回句柄<br>RectWidth,RectHeight);<br>这一句是将屏幕图像复制到BHandle这个句柄中了吗?<br>这一句创建了一个RectWidth宽和RectHeight高的图像的句柄,由于ScreenDC中包含图像<br>信息,所以这个句柄中包含实际的图像信息。<br><br>BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,<br>LeftPos,TopPos,SRCCOPY);这一句和整个的屏幕copy功能有什么联系啊?<br>这一句实际上就是屏幕拷贝功能,但由于可以设置RectWidth,RectHeight,LeftPos,TopPos<br>所以可以设置参数选择范围进行拷贝。<br><br>其实说明白了就是得到桌面的DC<br>创建内存DC,把桌面DC内容Copy到内存DC上。如此而已。你上段程序多了把图像保存的功能<br>所以又弄出来个图像的句柄,实际上它和DC操作无关<br>
 
SourceDC:=CreateDC('DISPLAY','','',nil);<br>DestDC:=CreateCompatibleDC(SourceDC);<br>Bhandle:=CreateCompatibleBitmap(SourceDC,<br>RectWidth,RectHeight);<br>SelectObject(DestDC,Bhandle);<br>BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,<br>LeftPos,TopPos,SRCCOPY);<br>Bitmap:=TBitmap.Create;<br>Bitmap.Handle:=BHandle;<br>BitMap.SaveToStream(BmpStream);<br>这段程序的目的只是将屏幕图像写入流,依我个人理解只有<br>Bitmap:=TBitmap.Create;<br>Bitmap.Handle:=BHandle;<br>BitMap.SaveToStream(BmpStream);这三句才是实现这个功能的啊,另外三句<br>DestDC:=CreateCompatibleDC(SourceDC);<br>&nbsp;SelectObject(DestDC,Bhandle);<br>&nbsp;BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,<br>LeftPos,TopPos,SRCCOPY)<br>看不出有什么作用啊?原作者为什么要加上呢? &nbsp; <br>
 
DC是设备环境句柄
 
jsxjd,lww,好 ,<br>俺上面列出来的三句是不是没有作用啊?
 
应该是出于速度的考虑,先把图像信息写到内存里,然后再保存,而不是直接从屏幕DC<br>取。
 
顶部