初识MFC:综合一下修改窗口外观、画图,及修改画笔属性的知识点(截屏软件的第一步,但有个小问题)
这个小项目也是对这一周来部分知识点的综合应用。
第一步:注销菜单栏、任务栏、状态栏,并更改窗口显示样式为WS_POPUP
1 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 2 { 3 if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 4 return -1; 5 6 //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 7 // !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 8 //{ 9 // TRACE0("未能创建工具栏\n"); 10 // return -1; // 未能创建 11 //} 12 13 //if (!m_wndStatusBar.Create(this)) 14 //{ 15 // TRACE0("未能创建状态栏\n"); 16 // return -1; // 未能创建 17 //} 18 //m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); 19 20 // TODO: 如果不需要可停靠工具栏,则删除这三行 21 //m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 22 //EnableDocking(CBRS_ALIGN_ANY); 23 //DockControlBar(&m_wndToolBar); 24 25 SetMenu(NULL); 26 27 return 0; 28 } 29 30 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 31 { 32 if( !CFrameWnd::PreCreateWindow(cs) ) 33 return FALSE; 34 // TODO: 在此处通过修改 35 // CREATESTRUCT cs 来修改窗口类或样式 36 cs.style = WS_POPUP; //更改窗口样式为弹出式窗口pop_up 37 38 return TRUE; 39 }
第二步:在CApp类中,将窗口显示方式调为最大化(SW_MAXMIZE),这样运行时整个屏幕就都是窗口客户区了
1 BOOL CPrtSc_ModelApp::InitInstance() 2 { 3 // 唯一的一个窗口已初始化,因此显示它并对其进行更新 4 //********omit********** 5 m_pMainWnd->ShowWindow(SW_MAXIMIZE); //调整窗口显示为最大化 6 m_pMainWnd->UpdateWindow(); 7 return TRUE; 8 }
第三步:获得系统桌面,并将其画到视图客户区(完成此步,就可在运行时看到整个屏幕被截取并显示出来了)
1 void CPrtSc_ModelView::OnDraw(CDC* /*pDC*/) //此函数为系统生成的类内成员方法 2 { 3 CPrtSc_ModelDoc* pDoc = GetDocument(); 4 ASSERT_VALID(pDoc); 5 if (!pDoc) 6 return; 7 // TODO: 在此处为本机数据添加绘制代码 8 //以下代码为作者键入 9 CClientDC dc(this); 10 //获得系统桌面DC资源 11 CWnd * pWnd = this->GetDesktopWindow(); 12 CDC * pRecDC = pWnd->GetDC(); 13 //获得系统桌面大小: 14 //此处因为窗口的视图区是全屏显示(无边框),所以客户区大小,就是系统桌面大小 15 CRect rect; 16 this->GetClientRect(&rect); 17 dc.BitBlt( 0 , 0 , rect.Width() , rect.Height() , pRecDC , 0 , 0 , SRCCOPY); 18 }
第四步:添加红色画笔,并使其可以按住鼠标左键移动画出其轨迹 (此处用到三个消息处理函数)
// CPrtSc_ModelView 消息处理程序 void CPrtSc_ModelView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_nLCursorFlag = true; //此变量在类头文件中定义,并在类构造中初始化为false m_LCursorDownPoint = point; //此变量在类头文件中定义,用于接收鼠标按下的坐标点 CView::OnLButtonDown(nFlags, point); } void CPrtSc_ModelView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //点鼠标左键,画出轨迹曲线 if ( m_nLCursorFlag == true ) { CClientDC dc(this); CPen pen( PS_DASH , 1 , RGB(246,0,32) ); dc.SelectObject(&pen); dc.MoveTo( m_LCursorDownPoint.x , m_LCursorDownPoint.y ); dc.LineTo( point.x , point.y ); m_LCursorDownPoint = point; //☆此处一定要接住移动的坐标点 } CView::OnMouseMove(nFlags, point); } void CPrtSc_ModelView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_nLCursorFlag = false; CView::OnLButtonUp(nFlags, point); }
这个小程序就有了初步原型,但问题来了,为什么有时候运行时,可以把系统桌面画到客户区,有时候却没有成功画到客户区(显示默认白色背景)呢?

浙公网安备 33010602011771号