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
更多精彩
赞助商链接