首先上张图。没截到鼠标。鼠标在59附近。
资源,添加无边框对话框窗口,新建类CsmDialog。
然后,上源码。
#pragma once
// CsmDialog.h
class CsmDialog : public CDialogEx
{
DECLARE_DYNAMIC(CsmDialog)
public:
CsmDialog(CWnd* pParent = NULL); // 标准构造函数
virtual ~CsmDialog();
// 对话框数据
enum {
IDD = IDD_DIALOG2 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
virtual BOOL OnInitDialog();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
virtual BOOL PreTranslateMessage(MSG* pMsg);
void bittoblt();
COLORREF RGBcolor;
bool xy1;
bool xy2;
void quse();
};
// CsmDialog.cpp : 实现文件
//
#include "stdafx.h"
#include "CutScreen.h"
#include "CsmDialog.h"
#include "afxdialogex.h"
#include "CutScreenDlg.h"//该头文件必须放这里,否则报错,不知为啥。望高手回复,因为想在类中,定义变量CCutScreenDlg *pcut = (CCutScreenDlg*)this->GetParent();
// CsmDialog 对话框
IMPLEMENT_DYNAMIC(CsmDialog, CDialogEx)
CsmDialog::CsmDialog(CWnd* pParent /*=NULL*/)
: CDialogEx(CsmDialog::IDD, pParent)
, xy1(NULL)
, xy2(NULL)
{
}
CsmDialog::~CsmDialog()
{
}
void CsmDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CsmDialog, CDialogEx)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
void CsmDialog::OnPaint()
{
CPaintDC dc(this);
bittoblt();
// device context for painting
//HWND hwnd = GetSafeHwnd();
//::SetWindowLong(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
//this->SetLayeredWindowAttributes(RGB(0,255,0), 100, LWA_ALPHA);
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::OnPaint()
}
// CsmDialog 消息处理程序
void CsmDialog::OnMouseMove(UINT nFlags, CPoint point)
{
bittoblt();// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialogEx::OnMouseMove(nFlags, point);
}
BOOL CsmDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
//SetTimer(1, 50, NULL);
MoveWindow(20, 20, 211, 211, 1);
bittoblt();
SetCapture();
xy1 = TRUE;
xy2 = FALSE;
// TODO: 在此添加额外的初始化
return TRUE;
// return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CsmDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
if (xy1 == TRUE)//模拟鼠标左键按下,不然得不到线程窗口外鼠标消息。
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
xy2 = TRUE;
xy1 = FALSE;
goto moren;//必须转走,不然直接执行下个判断。直接return也可以。
}
if (xy2 == TRUE)
{
quse();
}
moren:
CDialogEx::OnLButtonUp(nFlags, point);
}
BOOL CsmDialog::PreTranslateMessage(MSG* pMsg)//重载此虚函数。方向键控制鼠标微调。
{
if (pMsg->message == WM_KEYDOWN)
{
CPoint point;
GetCursorPos(&point);
if (pMsg->wParam == VK_DOWN)
point.y = point.y + 1;//向下键按下
else if (pMsg->wParam == VK_RIGHT)
point.x = point.x + 1;//向右键按下
else if (pMsg->wParam == VK_LEFT)
point.x = point.x - 1;//向左键按下
else if (pMsg->wParam == VK_UP)
point.y = point.y - 1;
else if (pMsg->wParam == VK_RETURN)//回车取色
{
quse();
}
SetCursorPos(point.x, point.y);
}
else //TODO: 在此添加专用代码和 / 或调用基类
return CDialogEx::PreTranslateMessage(pMsg);
}
void CsmDialog::bittoblt<