WEB开发网
开发学院软件开发VC QQ 静态截图程序模拟实现 阅读

QQ 静态截图程序模拟实现

 2007-03-17 22:01:09 来源:WEB开发网   
核心提示: 所以只能更新编辑框以外的区域,函数PaintWindow()计算更新区域,QQ 静态截图程序模拟实现(4),并更新窗口void CCatchScreenDlg::PaintWindow(){//获取当全屏对话框窗口大小CRect rect1;GetWindowRect(rect1);//获

所以只能更新编辑框以外的区域,函数PaintWindow()计算更新区域,并更新窗口

void CCatchScreenDlg::PaintWindow()
{
  //获取当全屏对话框窗口大小
  CRect rect1;
  GetWindowRect(rect1);
  //获取编辑框窗口大小
  CRect rect2;
  m_tipEdit.GetWindowRect(rect2);
  CRgn rgn1,rgn2;
  rgn1.CreateRectRgnIndirect(rect1);
  rgn2.CreateRectRgnIndirect(rect2);
  //获取更新区域,就是除了编辑框窗口不更新
  m_rgn.CombineRgn(&rgn1,&rgn2,RGN_DIFF);
  
  InvalidateRgn(&m_rgn);
}
六、当然不能忘了方向键来微调截取矩形大小和位置,由于是基于对话框的程序,按键消息,被Windows内部的对话框过程处理了(即在基类中完成了处理,读者可以查看MFC的源代码),或者被发送给子控件进行处理,所以在对话框类中可能利用

BOOLProcessMessageFilter(int code, LPMSG lpMsg)这个虚函数来过滤或响应菜单和对话框的特定Windows消息在头文件中增加一个类型为HWND,Public成员变量名m_hwndDlg,在构造函数中初始化为NULL;在 CCatchScreenDlg::OnInitDialog()中加入((CWinSunApp*)AfxGetApp())->m_hwndDlg=m_hWnd;

将对话框的句柄传递到CWinSunApp类中

//********************************************************************************
#define SHIFTED 0x8000
//********************************************************************************
BOOL CCatchScreenApp::ProcessMessageFilter(int code, LPMSG lpMsg)
{
  // TODO: Add your specialized code here and/or call the base class
  if(m_hwndDlg!=NULL)
  {  //判断消息,如果消息是从对话框发出的或者其子控件发出的,就进行处理
    if((lpMsg->hwnd==m_hwndDlg) || ::IsChild(m_hwndDlg,lpMsg->hwnd))
    {
      //如果消息是WM_KEYDOWN
      //用方向键调整位置
      if(lpMsg->message==WM_KEYDOWN)
      {
        CRect rect(0,0,0,0);
        CCatchScreenDlg * pDlg=(CCatchScreenDlg *)AfxGetMainWnd();
        
        rect=pDlg->m_rectTracker.m_rect;
        if(pDlg->m_bFirstDraw)
        {
          
          //如果Shift键按下则方向键调整大小
          BOOL isShifeDowm=FALSE;
          int nVirtKey;
          nVirtKey = GetKeyState(VK_SHIFT);
          if (nVirtKey & SHIFTED)
            isShifeDowm=TRUE;
          switch(lpMsg->wParam)
          {
          case VK_UP:
            //如果按下Shift,则只调整一边
            if(!isShifeDowm)
              rect.top-=1;
            rect.bottom-=1;
            pDlg->m_rectTracker.m_rect=rect;
            pDlg->PaintWindow();
            break;
          case VK_DOWN:
            rect.top+=1;
            if(!isShifeDowm)
              rect.bottom+=1;
            pDlg->m_rectTracker.m_rect=rect;
            pDlg->PaintWindow();
            break;
          case VK_LEFT:
            if(!isShifeDowm)
              rect.left-=1;
            rect.right-=1;
            pDlg->m_rectTracker.m_rect=rect;
            pDlg->PaintWindow();
            break;
          case VK_RIGHT:
            rect.left+=1;
            if(!isShifeDowm)
              rect.right+=1;
            pDlg->m_rectTracker.m_rect=rect;
            pDlg->PaintWindow();
            break;
          }
        }
      }
    }
  }
  return CWinApp::ProcessMessageFilter(code, lpMsg);
}
  程序中涉及到像皮筋类的使用,就不多说了,知识库中有许多文章,接着就双击选区保存图片到剪贴板中。就说到这。我嘴笨 , 详细的请参看源文件注释,,有什么问题或您有更好的建意请不要忘了和我联系哦,邮箱: jzlkcn@yahoo.com.cn

上一页  1 2 3 4 

Tags:QQ 静态 截图

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接