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 }