2)添加画图的桌面背景

1)当前这个窗口  大多都是 View的  只有那个工具条是 Frame的

2)什么时候给这个窗口贴图,因为窗口在创建之后那个背景已经弄好了  那么就应该在窗口还没有创建时  就把窗口的背景准备好。

3)一般把图片存在DC里面  比如 Frame的背景存在Frame的DC里面   那么整个桌面的背景应该在Window的DC里面,所以  我要拿到桌面的句柄

4)在Frame的构造函数那块  程序运行到那里 窗口还没有创建   所以  此时 我们应该拿到桌面的句柄,然后拿到桌面的截图  然后贴到Frame要创建的窗口上 ,就算是完成了任务

5)修改代码步骤

   1)首先在窗口没创建前,将桌面截图弄个下来

    

       

        思路是  :首先找到 桌面的DC (因为桌面DC装着整个桌面的背景图)

             创建一个DC,这个DC是窗口的兼容DC,给这个兼容DC建一个位图,然后  把桌面那个DC中存的图片贴到这个DC上

             那个这个DC的位图就有了内容,把这个位图给进栈,存下来

    2)在VIEW的OnDraw中贴图:

      

      

    注意添加 特定的头文件:
      

    给Frame文件添加相应的变量:
      

    注意 有了容器  得加头文件

      

  3)运行代码 结果:
    

      

    部分代码整理:

      

1 //MainFrm.h中添加的代码:
2 
3     #include"stack"
4 using namespace std;
5 
6 public:
7     int Screen_width;
8     int Screen_height;
9     stack<CBitmap*> sk;
 1 //MainFrm.cpp中添加的代码:
 2 
 3 CMainFrame::CMainFrame()
 4 {
 5     // TODO: 在此添加成员初始化代码
 6     //我要获得桌面的长度和宽度  因为以后也用到  所以  我在类里面用两个变量记录
 7     Screen_width=GetSystemMetrics(SM_CXSCREEN);
 8     Screen_height=GetSystemMetrics(SM_CYSCREEN);
 9 
10 
11     //这里  贴桌面的背景图
12     //①   获取桌面的句柄,这个句柄里面存着桌面的截图
13     CWindowDC cWindow(GetDesktopWindow());
14     //②     创建一个装桌面背景的DC
15     CDC dc;
16     dc.CreateCompatibleDC(&cWindow);
17     CBitmap * BitMap=new CBitmap();
18     BitMap->CreateCompatibleBitmap(&cWindow,Screen_width,Screen_height);
19     dc.SelectObject(BitMap);
20     //然后贴图
21     dc.BitBlt(0,0,Screen_width,Screen_height,&cWindow,0,0,SRCCOPY);
22 
23     //将背景图存到栈里面,栈里面存的是位图的地址,也就是图片存在BitMap这个地址里了
24     sk.push(BitMap);
25     //然后把图片在那个OnDraw函数中 给当前窗口重绘就行了,下面就是去贴图
26 
27     
28     
29 }
30 
31 CMainFrame::~CMainFrame()
32 {
33     //在析构中,我们要把之前存的那个地址数组清空,同时将堆内存存的东西删除
34     while(sk.empty()==false)
35     {
36         delete sk.top();//删除那个堆中存的文图占的内存
37         sk.pop();
38     }
39 }
 1 //VIEW中添加的代码
 2 
 3 #include"MainFrm.h"
 4 
 5 void Cdraw_01View::OnDraw(CDC* /*pDC*/)
 6 {
 7     Cdraw_01Doc* pDoc = GetDocument();
 8     ASSERT_VALID(pDoc);
 9     if (!pDoc)
10         return;
11 
12     // TODO: 在此处为本机数据添加绘制代码
13     //这里就是将栈顶的图贴到这个VIEW窗口上
14     
15     CMainFrame * cmain=(CMainFrame*)AfxGetMainWnd();
16     CClientDC dc(this);
17     CDC cdc;
18     cdc.CreateCompatibleDC(&dc);
19     cdc.SelectObject(cmain->sk.top());
20     dc.BitBlt(0,0,cmain->Screen_width,cmain->Screen_height,&cdc,0,0,SRCCOPY);
21 
22     
23     
24 
25 }

 

    

        

原文地址:https://www.cnblogs.com/xiaoyoucai/p/8330404.html