MFC截图程序的实现(十二)
来源:互联网 发布:外汇交易分析软件 编辑:程序博客网 时间:2024/05/16 10:15
上篇文章虽然实现了自定义截图的功能,但是设置透明窗口后画的矩形也不清楚了,所以我修改了一下源程序,让弹出的最大化窗口完全透明。这样画出来的矩形就不透明了,但是窗口设为完全透明后就响应不了窗口的鼠标消息了。也就是说,窗口完全透明后就好像这个窗口不存在了,可以透过这个窗口操作其他窗口,这样就无法画矩形了。
为了解决上述问题,我设置了一个鼠标的钩子函数,当画矩形时,截取系统范围内所有的鼠标消息。这样鼠标的操作就不会转到其他程序上了。
下面是关键代码:
CoverDlg.cpp
// CoverDlg.cpp : implementation file//#include "stdafx.h"#include "Custom_CutScreen.h"#include "CoverDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//// 定义全局变量和全局函数//POINT startPoint; // 画矩形的左上角坐标POINT endPoint; // 画矩形的右下角坐标bool IsLBtnUp; // 鼠标左键是否弹起bool IsRBtnUp; // 鼠标右键是否弹起bool IsLBtnDown; // 鼠标左键是否按下#define WH_MOUSE_LL 14HHOOK hhookMs = NULL; LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam); BOOL UninstallKbHook(); BOOL InstallKbHook(); DWORD clickInterval = 0;/////////////////////////////////////////////////////////////////////////////// CCoverDlg dialogCCoverDlg::CCoverDlg(CWnd* pParent /*=NULL*/): CDialog(CCoverDlg::IDD, pParent){//{{AFX_DATA_INIT(CCoverDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT}void CCoverDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCoverDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCoverDlg, CDialog)//{{AFX_MSG_MAP(CCoverDlg)ON_WM_PAINT()ON_WM_MOUSEMOVE()ON_WM_TIMER()ON_WM_CLOSE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCoverDlg message handlersvoid CCoverDlg::OnPaint() {CPaintDC dc(this); // device context for painting// TODO: Add your message handler code here//绘制背景 CRect rect; GetClientRect(&rect); CBrush bruDB(GetSysColor(COLOR_3DFACE));//背景颜色 dc.FillRect(&rect, &bruDB); //绘制拖动矩形 if (IsLBtnDown) { CPen pen(PS_SOLID,6,RGB(234,23,53));CPen *pOldPen=dc.SelectObject(&pen);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(startPoint, endPoint));dc.SelectObject(pOldPen);dc.SelectObject(pOldBrush);}// Do not call CDialog::OnPaint() for painting messages}/************************************************************************//* 鼠标左键按下的响应函数 *//************************************************************************///DEL void CCoverDlg::OnLButtonDown(UINT nFlags, CPoint point) //DEL {//DEL // TODO: Add your message handler code here and/or call default//DEL //DEL startPoint = point;//DEL endPoint = point;//DEL IsLBtnDown = true;//DEL //DEL CDialog::OnLButtonDown(nFlags, point);//DEL }/************************************************************************//* 鼠标左键弹起的响应函数 *//************************************************************************///DEL void CCoverDlg::OnLButtonUp(UINT nFlags, CPoint point) //DEL {//DEL // TODO: Add your message handler code here and/or call default//DEL //DEL endPoint = point;//DEL IsLBtnDown = false;//DEL IsLBtnUp = true;//DEL //DEL CDialog::OnLButtonUp(nFlags, point);//DEL }/************************************************************************//* 鼠标移动的响应函数 *//************************************************************************/void CCoverDlg::OnMouseMove(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultendPoint = point;CDialog::OnMouseMove(nFlags, point);}/************************************************************************//* 计时器函数 *//************************************************************************/void CCoverDlg::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultif (nIDEvent == 1){// 如果鼠标左键弹起,则关闭对话框if (IsLBtnUp) {SendMessage(WM_CLOSE);KillTimer(1);}// 如果鼠标右键弹起(用户取消了截图),关闭对话框if (IsRBtnUp) {SendMessage(WM_CLOSE);KillTimer(1);}Invalidate(FALSE);//更新界面 }CDialog::OnTimer(nIDEvent);}/************************************************************************//* 对话框的初始化函数 *//************************************************************************/BOOL CCoverDlg::OnInitDialog() {CDialog::OnInitDialog();// TODO: Add extra initialization here// 变量初始化IsLBtnUp = false;IsLBtnDown = false;IsRBtnUp = false;ShowWindow(SW_MAXIMIZE); // 窗口最大化SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); // 窗口置顶// 设置窗体透明COLORREF maskColor = GetSysColor(COLOR_3DFACE); // 获取窗体颜色SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x00080000); HINSTANCE hInst = LoadLibrary(_T("User32.dll")); if (hInst) { typedef BOOL (WINAPI *MyFun)(HWND,COLORREF,BYTE,DWORD); MyFun myfun = NULL; myfun = (MyFun)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if (myfun) myfun(GetSafeHwnd(),maskColor,100,1); // 100是透明度(范围0-255) FreeLibrary(hInst); } // 设置计时器SetTimer(1, 100, NULL);// 启动钩子InstallKbHook();return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE}/************************************************************************//* 鼠标右键弹起的响应函数 *//************************************************************************///DEL void CCoverDlg::OnRButtonUp(UINT nFlags, CPoint point) //DEL {//DEL // TODO: Add your message handler code here and/or call default//DEL //DEL IsRBtnUp = true;//DEL //DEL CDialog::OnRButtonUp(nFlags, point);//DEL }POINT CCoverDlg::GetStartPoint(){return startPoint;}POINT CCoverDlg::GetEndPoint(){return endPoint;}bool CCoverDlg::GetWhetherCancel(){return IsRBtnUp;}/************************************************************************//* 鼠标钩子回调函数 *//************************************************************************/LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam) { switch (nCode) { case HC_ACTION: { //鼠标移动 if (wParam == WM_MOUSEMOVE) { // 保存鼠标起始位置CPoint pt;GetCursorPos(&pt);endPoint = pt;} // 鼠标左键按下if (wParam == WM_LBUTTONDOWN){// 保存鼠标起始位置CPoint pt;GetCursorPos(&pt);startPoint = pt;endPoint = pt;IsLBtnDown = true;return TRUE;}// 鼠标左键弹起 if(wParam == WM_LBUTTONUP) { // 保存鼠标结束位置CPoint pt;GetCursorPos(&pt);endPoint = pt;IsLBtnUp = true;return TRUE; // 返回TRUE,终止该消息} // 鼠标右键按下if(wParam == WM_RBUTTONDOWN) {return TRUE; // 返回TRUE,终止该消息} // 鼠标右键弹起if (wParam == WM_RBUTTONUP) {IsRBtnUp = true;return TRUE;}} break;default: break; } return CallNextHookEx (NULL, nCode, wParam, lParam); } BOOL InstallKbHook( ) { if (hhookMs) UninstallKbHook(); hhookMs = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)LowLevelMouseProc, AfxGetApp()->m_hInstance, NULL); return(hhookMs != NULL); } BOOL UninstallKbHook() { BOOL fOk = FALSE; if (hhookMs) { fOk = UnhookWindowsHookEx(hhookMs); hhookMs = NULL; } return(fOk); } void CCoverDlg::OnClose() {// TODO: Add your message handler code here and/or call default// 卸载钩子UninstallKbHook();CDialog::OnClose();}
完整源代码:http://download.csdn.net/detail/wwkaven/7502719
0 0
- MFC截图程序的实现(十二)
- MFC截图程序的实现(一)
- MFC截图程序的实现(二)
- MFC截图程序的实现(三)
- MFC截图程序的实现(四)
- MFC截图程序的实现(五)
- MFC截图程序的实现(六)
- MFC截图程序的实现(七)
- MFC截图程序的实现(九)
- MFC截图程序的实现(十)
- MFC截图程序的实现(十一)
- MFC截图程序的实现(完)
- MFC截图程序的实现(八)
- MFC实现屏幕截图
- MFC SDI 利用双缓冲实现截图程序
- Qt学习(九) 截图程序的实现
- 圆形截图(不规则截图)的实现
- WinForm下屏幕截图程序的实现
- android的Environment类
- To be a metic human
- Android开发中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi
- 天地大德章
- 二分练习(SDUT 2781)
- MFC截图程序的实现(十二)
- cf 408D - Long Path dp
- Flash-制作空心文字
- ubuntu12-04-4安装java1.8.5
- 八卦成列章 繫辭下
- codeforce 15B
- 【C++】指针的使用
- Div+CSS布局入门教程
- java泛型