初识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);
}

 

  这个小程序就有了初步原型,但问题来了,为什么有时候运行时,可以把系统桌面画到客户区,有时候却没有成功画到客户区(显示默认白色背景)呢?

 

posted @ 2015-04-26 17:18  netosoul  阅读(322)  评论(0)    收藏  举报