怎么把一个CDC画好的东西拷贝到另一个CDC里面

Zxy0918520 2020-04-21 03:42:09
我有两个窗口一个名字类叫A,另一个名字叫B, A作为一个导航栏(nagative)用来预览B 的东西,(详情可看图片),我在A类的onpaint 函数用cdc对象画图可以在A窗口和B窗口中都看到。不过我用一个第三方的库C可以画表格之类的东西我只需要设置行和列在绑定一个父窗口就自己画在B窗口中了,比如

C x=new c()

C x=new c();
C->create(/**/);//若干个参数包括父窗口B;
C-setrowcount(1);
c->setcolcount(1);


不过这样的 画可以在父窗口B中显示 A的预览窗口却看不到 因为用的不是A的cdc对象画图 ,大佬们怎么处理这个情况呢,那个库C画的CDC好像也不能指定用我类A的CDC,那可以把库画好的表格拷贝的类A的让他显示在导航栏,如果这样窗口B里好像因为拷贝又多出来一个表格了。求救
...全文
795 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zxy0918520 2020-05-08
  • 打赏
  • 举报
回复
引用 18 楼 zgl7903 的回复:
如果是控件的话,可以试试 GetWindowDC 换成 GetDC, GetWindowRect 换成 GetClientRect
版主还在么。。
Zxy0918520 2020-05-07
  • 打赏
  • 举报
回复
引用 18 楼 zgl7903 的回复:
如果是控件的话,可以试试 GetWindowDC 换成 GetDC, GetWindowRect 换成 GetClientRect
对了 12是两个分别不同的图区,可以通过图中圆圈那个地方左右拉动改变1和2的大小,如果我往左边拉让1变小就能不显示桌面上的通知,只显示表格,如果往右拉,让2变小 就会显示桌面上的通知,
Zxy0918520 2020-05-07
  • 打赏
  • 举报
回复
引用 18 楼 zgl7903 的回复:
如果是控件的话,可以试试 GetWindowDC 换成 GetDC, GetWindowRect 换成 GetClientRect
版主大大,现再还有个问题。。就是stretchblt copy的内容连我做面上的通知 都包括进去了 我改成了GetDC好像没什么用,

pDC->StretchBlt(sourcePos.left, sourcePos.top,
			(sourcePos.Width()), (sourcePos.Height()),
			pGrid->GetDC(),
			0, 0,
			griddevicerect.Width(), griddevicerect.Height(),
			SRCCOPY);
schlafenhamster 2020-04-27
  • 打赏
  • 举报
回复
CDC 是·不能· 跨进程 的 !
宁彦吾 2020-04-26
  • 打赏
  • 举报
回复
复制 粘贴
還是 2020-04-26
  • 打赏
  • 举报
回复
偷工减料是不行的,两个CDC就要画两次。你把B窗口的CDC句柄保存到A里面,画的地方封装成一个函数,CDC为参数,通过传入不同的CDC调用两次函数看可不可以。
Zxy0918520 2020-04-24
  • 打赏
  • 举报
回复
引用 18 楼 zgl7903 的回复:
如果是控件的话,可以试试 GetWindowDC 换成 GetDC, GetWindowRect 换成 GetClientRect
大哥 可以理解为一个控件。,这个控件好像还套在一个pDC->rectangel画好的矩形矿上(好像是这个样子),当我缩放这个矩形框里面的表格控件还会自动调整这个控件表格的但单元格的大小 ,现在还有两个问题。。 1)这个缩略图的大小和我原来的那个表格大小不一样。。怎么调整呢。。我那个strechblt里设置原位图的坐标是对的啊:

auto rect=CRect();
pGrid->GetWindowRect(&rect);

pDC->StretchBlt(parentlogicrect.left, parentlogicrect.top,//parentlogicrect 是父窗口的大小
		parentlogicrect.Width(), parentlogicrect.Height(),
		pGrid->GetDC(),
		0, 0,
		gridlogicrect.Width(), gridlogicrect.Height(),
		SRCCOPY);
2.怎么擦除那个缩略图呢 就是我拖动那个矩形框嵌套里面的表格会移动 但是我那个缩略图的位置还是不变。。。我想移动之后擦除在重画
schlafenhamster 2020-04-23
  • 打赏
  • 举报
回复
pDC->BitBlt(0, 0, gridrect.Width(), lprect.Height(),pGrid->GetDC()
pDC 是什么 pGrid->GetDC() 又是什么
zgl7903 2020-04-23
  • 打赏
  • 举报
回复

BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
  BOOL bRet = FALSE;
  if(hDC && hWnd && IsWindow(hWnd))
  {
    //保存DC
    int nSaveDC = SaveDC(hDC);

    //获取窗口坐标
    RECT rcWnd;
    GetWindowRect(hWnd, &rcWnd);

    //获取窗口DC
    HDC hWndDC = GetWindowDC(hWnd);
    if(hWndDC != NULL)
    {
      //设置缩放模式
      SetStretchBltMode(hDC, HALFTONE);

      //缩放贴图
      StretchBlt(hDC, 
        rcRect.left, rcRect.top, 
        rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
        hWndDC, 
        0, 0, 
        rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
        SRCCOPY);

      //释放DC
      ReleaseDC(hWnd, hWndDC);

      bRet = TRUE;
    }

    //恢复DC
    RestoreDC(hDC, nSaveDC);
  }

  return bRet;
}

void CSdi7View::OnDraw(CDC* pDC)
{
  /*
  CSdi7Doc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  if (!pDoc)
    return;
  */
  //计算器
  HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
  CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);	  

}

  • 打赏
  • 举报
回复
引用 7 楼 Zxy0918520 的回复:
引用 4 楼 zjq9931 的回复:
bitblt
这个显示 是可以显示 不过多了个残影 这样我移动第三方库那个画好的grid的时候就可以看到两个grid,有一个是残影也就是 bitblt画出来的而且大小还和那个第三方画好的库的大笑不一样。并且之后把grid移动到残影附近 才能在缩略图中看到那个残影 还是不是grid

bitblt画出来的就只是图片了,不能区分对象了。如果原来的图像有变动,你要擦除,然后重绘才可以,记得先擦除。
Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
bitblt
这个显示 是可以显示 不过多了个残影 这样我移动第三方库那个画好的grid的时候就可以看到两个grid,有一个是残影也就是 bitblt画出来的而且大小还和那个第三方画好的库的大笑不一样。并且之后把grid移动到残影附近 才能在缩略图中看到那个残影 还是不是grid
Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
bitblt
不行啊 我试过了 。。

	C->ShowWindow(true);
	
	pDC->BitBlt(0, 0, gridrect.Width(), lprect.Height(),pGrid->GetDC(), 0, 0, SRCCOPY);
之后就变成了这样
Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
通过 剪贴板
怎么用呢 兄弟。
  • 打赏
  • 举报
回复
bitblt
zgl7903 2020-04-23
  • 打赏
  • 举报
回复
如果是控件的话,可以试试 GetWindowDC 换成 GetDC, GetWindowRect 换成 GetClientRect

Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
1 两个窗口 是不是 在 一个 进程 里 ? 2 要复制 客户区 还是 整个 窗口 ?
那个推送的网页显示在窗口B 上。。但那个推送的网页 也不属于我这个软件的东西啊。。怎么还能从那个缩略图看到呢。。。
Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:

BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
  BOOL bRet = FALSE;
  if(hDC && hWnd && IsWindow(hWnd))
  {
    //保存DC
    int nSaveDC = SaveDC(hDC);

    //获取窗口坐标
    RECT rcWnd;
    GetWindowRect(hWnd, &rcWnd);

    //获取窗口DC
    HDC hWndDC = GetWindowDC(hWnd);
    if(hWndDC != NULL)
    {
      //设置缩放模式
      SetStretchBltMode(hDC, HALFTONE);

      //缩放贴图
      StretchBlt(hDC, 
        rcRect.left, rcRect.top, 
        rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
        hWndDC, 
        0, 0, 
        rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
        SRCCOPY);

      //释放DC
      ReleaseDC(hWnd, hWndDC);

      bRet = TRUE;
    }

    //恢复DC
    RestoreDC(hDC, nSaveDC);
  }

  return bRet;
}

void CSdi7View::OnDraw(CDC* pDC)
{
  /*
  CSdi7Doc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  if (!pDoc)
    return;
  */
  //计算器
  HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
  CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);	  

}

对了 我把这段代码改了:
 HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);----》auto hWnd=pGrid->getsafeHwnd(); //换成了我那个表格的hwnd,应该没有关系吧?? 我不太懂
引用 14 楼 schlafenhamster 的回复:
1 两个窗口 是不是 在 一个 进程 里 ? 2 要复制 客户区 还是 整个 窗口 ?
1。应该不是一个进程 2。客户区吧,就是那个窗口b的,窗口b有滚动条, zgl老哥的方法可行,,不过当我滚动条活动的时候,那个缩略图,把我窗口外面的win系统推送的网页都显示出来了,不可思议,,,不太懂
Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
1。应该不是一个进程 2。客户区吧,就是那个窗口b的,窗口b有滚动条, zgl老哥的方法可行,,不过当我滚动条活动的时候,那个缩略图,把我窗口外面的win系统推送的网页都显示出来了,不可思议,,,不太懂
schlafenhamster 2020-04-23
  • 打赏
  • 举报
回复
1 两个窗口 是不是 在 一个 进程 里 ?
2 要复制 客户区 还是 整个 窗口 ?
Zxy0918520 2020-04-23
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:

BOOL CopyWnd2DC(HDC hDC, RECT rcRect, HWND hWnd)
{
  BOOL bRet = FALSE;
  if(hDC && hWnd && IsWindow(hWnd))
  {
    //保存DC
    int nSaveDC = SaveDC(hDC);

    //获取窗口坐标
    RECT rcWnd;
    GetWindowRect(hWnd, &rcWnd);

    //获取窗口DC
    HDC hWndDC = GetWindowDC(hWnd);
    if(hWndDC != NULL)
    {
      //设置缩放模式
      SetStretchBltMode(hDC, HALFTONE);

      //缩放贴图
      StretchBlt(hDC, 
        rcRect.left, rcRect.top, 
        rcRect.right - rcRect.left, rcRect.bottom - rcRect.top,
        hWndDC, 
        0, 0, 
        rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
        SRCCOPY);

      //释放DC
      ReleaseDC(hWnd, hWndDC);

      bRet = TRUE;
    }

    //恢复DC
    RestoreDC(hDC, nSaveDC);
  }

  return bRet;
}

void CSdi7View::OnDraw(CDC* pDC)
{
  /*
  CSdi7Doc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  if (!pDoc)
    return;
  */
  //计算器
  HWND hWnd = ::FindWindow(_T("CalcFrame"), NULL);
  CopyWnd2DC(pDC->m_hDC, CRect(0,0, 200, 200), hWnd);	  

}

第二章图贴错了 应该是这个
加载更多回复(5)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧