框和图像框都是有hdc属性的,如果要显示的话,应该先设置autoredrew为真,然后用refresh方法刷新显示。相关的API函数应该不用我说了吧什么BITBLT什么的。我的意思是你想用GetDc方法获得图像框的DC的想法是画蛇添足,因为图像框自己就已经有hdc属性了,就跟他的caption属性是一样的,直接写image1hdc就可以获得图像框的Dc
不是很清楚你是实现什么功能,一般来说,用CreateDIBSection即可,调用成功后就可以直接往缓冲区写数据了
==================
哦哦~~~大概GetDIBits就是你需要的了(这个还不够方便)~~有HBITMAP句柄的话就可以直接GetBitmapBits返回它的数据了
==================
直接处理的话……不太清楚,貌似没有?
只剩下GetBitmapBits了~~不过它一样需要一个外界的空间来存放数据,修改好后用SetBitmapBits写进去
==================
你试试用GetObject行不行~
HBITMAP hBmp;
BITMAP bmp;
GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);
我没空测试……偶尔看到这个结构罢了
typedef struct tagBITMAP {
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, PBITMAP;
hdc不是NULL的话,你看看是不是INVALID_HANDLE_VALUE;另外你MFC是win98格式的话,也许会存在现在的系统不兼容的问题。这个我只是猜的,因为我碰到过类似的情况,我在XP下编译生成的debug程序,在CreateFile调用后本来正常, 在win7下就INVALID_HANDLE_VALUE,只有在win7下把生成的exe以XP兼容模式运行才能成功一点提示,希望能帮到你
主要在于你获得的HDC是哪个。
首先你要获取你要截图窗口的HWND
通过GetWindowDC 或 GetDC 获取相应的 HDC
得到HBITMAP,其实你给出的程序已经完成了这步,只不过他用的HDC是屏幕的。
也就是说,你要在你的程序里想办法获得你要截图的窗口的HDC。
然后你程序里的 hSrcDC这个变量赋上这个要截图的HDC。
而窗口HDC可以通过第二步里的GetWindowDC 或 GetDC 获得,
调用这个函数需要窗口句柄,也就是窗口的HWND。
你这程序里
HWND hw = getHandle(1);
这一句想办法让 getHandle函数返回要截图窗口的HWND。
直接 GetDC 获得 HDC 进行绘制的话,会被覆盖(擦)掉。
正确的方法是在 WM_PAINT 消息处理函数里调用 BeginPaint 获得 HDC,绘制完成后调用 EndPaint。
原理很简单,只需要简要的三步。既:获取屏幕DC、得到当前鼠标所在的像素值、分解出像素值中的红、绿、蓝三色既可,很简单吧!
关键代码实现:
1、获取屏幕DC
HDC hDC = ::GetDC(NULL); //获取屏幕DC
2、获取当前鼠标位置像素值
CPoint pt;
GetCursorPos(&pt); //得到当前鼠标所在位置
COLORREF clr = ::GetPixel(hDC, ptx, pty); //获取当前鼠标点像素值
3、分解出像素点中的红、绿、蓝颜色值
CString ClrText;
ClrTextFormat("%d",GetRValue(clr)); //分解出红色值
ClrTextFormat("%d",GetGValue(clr)); //分解出绿色值
ClrTextFormat("%d",GetBValue(clr)); //分解出蓝色值
::ReleaseDC(NULL, hDC); //释放屏幕DC
以上就是关于如何获取vb控件image图片的DC,imahdc = GetDC(Image1.Picture.Handle) 可以么全部的内容,包括:如何获取vb控件image图片的DC,imahdc = GetDC(Image1.Picture.Handle) 可以么、高分 请高人解答 通过 hdc 获取 DIB 对象的数据指针、打印机句柄获取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)