导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

如何将该某指定的窗体拷贝并显示?

angelcool 2004-04-03 05:02:47
1。如何将该某指定的窗体拷贝并显示?

void CGetimageDlg::Toclip(HBITMAP hbitmap)
{
LPCTSTR lpWindowName="D:\\wanf"; //我加的
HWND hwTest; //我加的
hwTest = (HWND)FindWindow(NULL, lpWindowName); //我加的

if (::OpenClipboard(hwTest)) //hwTest为程序窗口句柄
{
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbitmap);
CloseClipboard();
}
}
void CGetimageDlg::OnGet()
{
...
temprect = new RECT();
temprect->bottom = 600;
temprect->left = 0;
temprect->right = 600;
temprect->top = 0;


tempmap = Copybitmap(temprect);

//拷贝到剪切板
Toclip(tempmap);
...
}
这是我参考书上的程序,我做了一点修改,是哪里不对,还是我的理解本身有误?
2。在VC中总会出现一些系统定义的变量,如何查找这些变量的定义

...全文
10 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelcool 2004-04-03
void CGetimageDlg::OnGet()
{
LPRECT temprect;
HBITMAP tempmap;

temprect = new RECT();
temprect->bottom = 600;
temprect->left = 0;
temprect->right = 600;
temprect->top = 0;
tempmap = Copybitmap(temprect);
Toclip(tempmap);
m_Pic.SetBitmap(tempmap);
Tofile(tempmap, "D:\\wanf\\VCStudy\\temp.bmp");
delete temprect;
}
HBITMAP CGetimageDlg::Copybitmap(LPRECT lprect)
{
HDC hscrdc, hmemdc;
HBITMAP hbitmap, holdbitmap;
int nx, ny, nx2, ny2;
int nwidth,nheight;
int xscrn, yscrn;
if (IsRectEmpty(lprect))
return NULL;
hscrdc = CreateDC("display",NULL,NULL,NULL);
hmemdc = CreateCompatibleDC(hscrdc);
nx = lprect->left;
ny = lprect->top;
nx2 = lprect->right;
ny2 = lprect->bottom;
xscrn = GetDeviceCaps(hscrdc, HORZRES);
yscrn = GetDeviceCaps(hscrdc, VERTRES);
if (nx < 0)
nx = 0;
if (ny < 0)
ny =0;
if (nx2 > xscrn)
nx2 = xscrn;
if (ny2 > yscrn)
ny2 = yscrn;
nwidth = nx2 - nx;
nheight = ny2 - ny;
hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);
holdbitmap = (HBITMAP)SelectObject(hmemdc, hbitmap);
BitBlt(hmemdc, 0, 0, nwidth, nheight, hscrdc, nx, ny, SRCCOPY);
hbitmap = (HBITMAP)SelectObject(hmemdc, holdbitmap);
DeleteDC(hscrdc);
DeleteDC(hmemdc);
return hbitmap;
}
void CGetimageDlg::Toclip(HBITMAP hbitmap)
{
LPCTSTR lpWindowName="D:\\wanf";
HWND hwTest;
hwTest = ::FindWindow(NULL, lpWindowName);

if (::OpenClipboard(m_hWnd)) //m_hWnd为程序窗口句柄
{
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbitmap);
CloseClipboard();
}
}


//lpfilename为位图文件名,hbitmap为刚才的屏幕位图句柄
int CGetimageDlg::Tofile(HBITMAP hbitmap, LPSTR lpfilename)
{
HDC hdc; //设备描述表
int ibits;
WORD wbitcount; //当前显示分辨率下每个像素所占字节数
DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;

BITMAP bitmap; //位图属性结构
BITMAPFILEHEADER bmfhdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指定位图信息头结构
HANDLE fh, hdib, hpal, holdpal=NULL;
hdc = CreateDC("display",NULL,NULL,NULL);
ibits = GetDeviceCaps(hdc, BITSPIXEL)*GetDeviceCaps(hdc, PLANES);
DeleteDC(hdc);

if (ibits <= 1)
wbitcount = 1;
else if (ibits <= 4)
wbitcount = 4;
else if (ibits <= 8)
wbitcount = 8;
else if (ibits <=16)
wbitcount =16;
else if (ibits < 24)
wbitcount = 24;
else wbitcount =32;
if (wbitcount <= 8)
dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);
GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wbitcount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)*4*bitmap.bmHeight;
hdib = GlobalAlloc(GHND, dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
*lpbi = bi;
hpal = GetStockObject(DEFAULT_PALETTE);
if (hpal)
{
hdc = ::GetDC(NULL);
holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
RealizePalette(hdc);
}
GetDIBits(hdc,hbitmap, 0, (UINT)bitmap.bmHeight, (LPSTR)lpbi+
sizeof(BITMAPINFOHEADER)+dwpalettesize, (BITMAPINFO*)
lpbi, DIB_RGB_COLORS);
if (holdpal)
{
SelectPalette(hdc, (HPALETTE)holdpal, true);
RealizePalette(hdc);
::ReleaseDC(NULL, hdc);
}
fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return false;
bmfhdr.bfType = 0x4d42; //"bm"
dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+dwpalettesize + dwbmbitssize;
bmfhdr.bfSize = dwdibsize;
bmfhdr.bfReserved1 = 0;
bmfhdr.bfReserved2 = 0;
bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
(DWORD)sizeof(BITMAPINFOHEADER) + dwpalettesize; WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER),
&dwwritten, NULL);
WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
GlobalUnlock(hdib);
GlobalFree(hdib);
CloseHandle(fh);
return true;
}
回复
angelcool 2004-04-03
是不是应该在tempmap = Copybitmap(temprect);前获取窗口句柄?给temprect定位为我想要的窗口?
回复
angelcool 2004-04-03
也是一种方法。
但是我要的是只抓取我想要的窗口,所以不能依赖光标。我在执行时就是无法获取我想要的窗口句柄。我理解的原程序是只是拷贝屏幕上的(0,0)至(300,400)区域的图片。我不知道该怎样修改?
回复
无敌魔仙 2004-04-03
先获取它的句柄,然后操作啥,用光标 来 操作都可以,将光标放在它的上面,用GetCursorPos来获取光标坐标,用WindowFromPoint来获取窗口句柄(记得坐标问题)
回复
angelcool 2004-04-03
比如说:我打开了资源管理器,title为“D:\\wanf”。当我运行我的程序getimage.exe时,点击“抓图”按钮后,就将资源管理器作为它的内容显示。
回复
_foo 2004-04-03
1.不明白你到底想实现什么,如果是想把别的窗体的DC显示的东东拷到你的窗体上显示,给该窗口发送wm_print\wm_printclient等。这好像跟剪贴板无关吧。
2.在该变量名上点右键,选项go to definition of ...
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……