zoukankan      html  css  js  c++  java
  • mfc截图

    1、进入截图状态
    PRTSCRING = TRUE;//开始截图标志为TRUE
    AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);//主窗口最大化
    SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLongPtr(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
    this->SetLayeredWindowAttributes(0, (255 * 1) / 100, LWA_ALPHA);//设置透明度为1%
    CButton *begin_btn = (CButton*)GetDlgItem(IDC_BTN_BEGIN);//开始截图按钮
    CButton *exit_btn = (CButton*)GetDlgItem(IDC_BTN_EXIT);//退出程序按钮
    begin_btn->ShowWindow(FALSE);//截图按钮不可见
    exit_btn->ShowWindow(FALSE);//退出程序按钮不可见
    SetClassLong(this->GetSafeHwnd(), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_CROSS));//设置截图时的光标为十字
    2、鼠标左键按下消息函数
    if (PRTSCRING == TRUE)//如果是在截图状态下鼠标左键按下
    {
    begin_point = point;//存储鼠标左键按下的坐标
    CDialogEx::OnLButtonDown(nFlags, point);
    }
    3、鼠标左键弹起消息函数
    if (PRTSCRING == TRUE)//如果是在截图状态下鼠标左键弹起
    {
    PRTSCRING = FALSE;//开始截图标志为FALSE
    PRTSCRED = TRUE;//截图结束标志为TRUE
    end_point = point;//得到截图结束时的坐标
    int weith, heith;
    weith = (end_point.x > begin_point.x ? end_point.x - begin_point.x : begin_point.x - end_point.x);//截图的宽度
    heith = (end_point.y > begin_point.y ? end_point.y - begin_point.y : begin_point.y - end_point.y);//截图的长度
    /*如果截图的面积太小,会影响视觉感,人为增大*/
    if (weith < 50)
    weith = 50;
    if (heith < 100)
    heith = 100;
    SetWindowPos(NULL, 0, 0, weith, heith, SWP_SHOWWINDOW);//把主窗口大小设置成用户截图的图片大小
    //SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) & ~WS_CAPTION); //去标题栏
    //SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) & ~(WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME)); //去边框
    CDC *pDesktopDC = GetDesktopWindow()->GetDC();//获取全屏幕DC
    CRect rect;//获取主窗口矩形对象
    this->GetClientRect(&rect);
    CDC *pDC = this->GetDC();//获取主窗口DC
    /*用StretchBlt函数将源矩形的位图复制到目标矩形*/
    pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), pDesktopDC, begin_point.x>end_point.x ? end_point.x : begin_point.x, begin_point.y > end_point.y ? end_point.y : begin_point.y, weith, heith, SRCCOPY);//核心函数,将全屏幕的截图区域复制在主窗口上面显示

    ::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLongPtr(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
    this->SetLayeredWindowAttributes(0, (255 * 100) / 100, LWA_ALPHA);//恢复正常透明度

    CButton *save_btn = (CButton *)GetDlgItem(2000);//保存截图按钮
    save_btn->ShowWindow(TRUE);//这个保存按钮是我在初始化函数中生成的,本来是不可见的,当截图完成后,这个按钮就可见
    4、保存按钮函数
    CButton *save_btn = (CButton*)GetDlgItem(2000);//在点击了保存按钮之后,这个按钮不可见
    save_btn->ShowWindow(FALSE);
    CDC *pDC = GetWindowDC();//获取主窗口设备上下文
    CDC memDC;//内存设备上下文
    memDC.CreateCompatibleDC(pDC);
    CRect rt;//获取主窗口的矩形
    GetWindowRect(&rt);
    CBitmap Bmp;
    Bmp.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
    CBitmap *pBmpPrev = (CBitmap*)memDC.SelectObject(&Bmp);
    memDC.BitBlt(0, 0, rt.Width(), rt.Height(), pDC, 0, 0, SRCCOPY);
    CImage image;
    image.Attach((HBITMAP)Bmp.m_hObject);
    image.Save(L"c:\1.bmp");

  • 相关阅读:
    BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP
    BZOJ3638[Codeforces280D]k-Maximum Subsequence Sum&BZOJ3272Zgg吃东西&BZOJ3267KC采花——模拟费用流+线段树
    BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流
    BZOJ2151种树——模拟费用流+链表+堆
    CF1117D Magic Gems
    CF1117C Magic Ship
    CF1117A Best Subsegment
    Loj 2028 随机序列
    Loj 504 ZQC的手办
    Luogu 3806 点分治1
  • 原文地址:https://www.cnblogs.com/judes/p/6083295.html
Copyright © 2011-2022 走看看