PrintWindow 截图为什么黑屏呢,vc++,求高手告诉小弟我
PrintWindow 截图为什么黑屏呢,vc++,求高手告诉我啊
vb的代码可以,vc的不可以。
请看VB代码,
picture1是个图片控件,这样一截图,就ok了。
Picture1.Cls
Call PrintWindow(Val(TxtHwnd.Text), Picture1.hdc, 0)
Picture1.Refresh
===========================
vc的是这样的
//bitcdc 是个图片控件的CDC CDC *bitcdc m_pic.GetDC()
为什么VB这样可以,VC截出来的却是黑屏呢,
vc的可以看到标题栏。十几次可以正确一次。其余的都是黑屏
求高手解答啊。指点迷津
------解决方案--------------------
PrintScreen不会立即返回的吧,可能会卡住消息循环。
建议你创建一个新的线程,在线程函数里PrintScreen。MFC编程最好用AfxBeginThread
另外如果你用VC.NET以及以后的版本是可以直接用PrintScreen这个API而不用LoadLibrary、GetProcAddress什么的。
------解决方案--------------------
你截得是子控件窗口?
------解决方案--------------------
是不是HDC中没有选人合适的位图?或者选人的位图是单色的
------解决方案--------------------
HDC hDC=CreateCompatibleDC(bitcdc); //创建内存DC
HBITMAP hbitmap=::CreateCompatibleBitmap(bitcdc,width,height); //创建兼容位图
SelectObject(hDC,hbitmap); //把位图选进内存DC
p(hWnd,hDC,0);
------解决方案--------------------
如果 控件 可见 ,不需要 PrintWindow
------解决方案--------------------
这部分程序初始化,准备一个内存DC存图像。
这个部分就是截图的:
销毁的时候:
memDC.SelectObject(oldmemBitmap);
每次贴图区域OnDraw或OnPaint时,
把MemDC的图Bitblt过去。这样的方法比较规范。
你用的PrintScreen是微软没有公开的函数,使用时可能需要考虑许多别的情况,比如绘制的同步什么的,也许那些窗口还来不及绘制自己就函数就结束了。
------解决方案--------------------
vb的代码可以,vc的不可以。
请看VB代码,
picture1是个图片控件,这样一截图,就ok了。
Picture1.Cls
Call PrintWindow(Val(TxtHwnd.Text), Picture1.hdc, 0)
Picture1.Refresh
===========================
vc的是这样的
typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
//RECT rect;
HMODULE h;
h = LoadLibrary( L"user32.dll" );
pPrintWindow p;
if( h )
{
p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow" );
}
p(hWnd,*bitcdc,0);
//bitcdc 是个图片控件的CDC CDC *bitcdc m_pic.GetDC()
为什么VB这样可以,VC截出来的却是黑屏呢,
vc的可以看到标题栏。十几次可以正确一次。其余的都是黑屏
求高手解答啊。指点迷津
------解决方案--------------------
PrintScreen不会立即返回的吧,可能会卡住消息循环。
建议你创建一个新的线程,在线程函数里PrintScreen。MFC编程最好用AfxBeginThread
另外如果你用VC.NET以及以后的版本是可以直接用PrintScreen这个API而不用LoadLibrary、GetProcAddress什么的。
------解决方案--------------------
你截得是子控件窗口?
------解决方案--------------------
是不是HDC中没有选人合适的位图?或者选人的位图是单色的
------解决方案--------------------
HDC hDC=CreateCompatibleDC(bitcdc); //创建内存DC
HBITMAP hbitmap=::CreateCompatibleBitmap(bitcdc,width,height); //创建兼容位图
SelectObject(hDC,hbitmap); //把位图选进内存DC
p(hWnd,hDC,0);
------解决方案--------------------
如果 控件 可见 ,不需要 PrintWindow
------解决方案--------------------
这部分程序初始化,准备一个内存DC存图像。
CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);
CBitmap memBitmap, *oldmemBitmap;、
memBitmap.CreateCompatibleBitmap(pDC, width, height);
oldmemBitmap = memDC.SelectObject(&memBitmap);
这个部分就是截图的:
CDC *pDC = CDC::FromHandle(::GetDC(hwnd));
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);
if(width==0 && height==0)
{
width = pDC->GetDeviceCaps(HORZRES);
height= pDC->GetDeviceCaps(VERTRES);
}
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);
pDC->DeleteObject();
销毁的时候:
memDC.SelectObject(oldmemBitmap);
每次贴图区域OnDraw或OnPaint时,
把MemDC的图Bitblt过去。这样的方法比较规范。
你用的PrintScreen是微软没有公开的函数,使用时可能需要考虑许多别的情况,比如绘制的同步什么的,也许那些窗口还来不及绘制自己就函数就结束了。
------解决方案--------------------