手把手VC截图小工具,附源码
一直都想写个截图程序,觉得蛮有意思的。看到网上这位兄弟的思路蛮清晰的,就自己跟着做下,并记录了流程,做个备份。
1.首先是构建个基于对话框的程序。在OnInitDialog中
注册热键,并隐藏当前对话框。在资源里把对话框设为无边框。
BOOL CCutterDlg::OnInitDialog()
{
RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,VK_F7);
RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,VK_F8);
ShowWindow(SW_HIDE);
CDialog::OnInitDialog();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
在OnDestroy()对热键注销。
void CCutterDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
UnregisterHotKey(m_hWnd,1001);
UnregisterHotKey(m_hWnd,1002);
}
在OnPaint要对对话框再做一次隐藏。
ShowWindow(SW_HIDE);
2.对热键进行声明、关联及响应
afx_msg LRESULT OnHotKey(WPARAM wp,LPARAM lp);
BEGIN_MESSAGE_MAP(CCutterDlg, CDialog)
...
ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()
LRESULT CCutterDlg::OnHotKey(WPARAM wp,LPARAM lp)//快捷键
{
if(wp==1001)
{
int x=GetSystemMetrics(SM_CXSCREEN);
int y=GetSystemMetrics(SM_CYSCREEN);
CRect cr(CPoint(0,0),CPoint(x,y));
HBITMAP hb=myGetScreenBmp(cr);
ShowDlgS shows(hb);
shows.DoModal();
}
if (wp==1002)
{
exit(1);
}
return 0;
}
3.热键响应部分,用到了ShowDlgS ,这是一个无边框的对话框。
ShowDlgS.h
#pragma once
// ShowDlgS 对话框
class ShowDlgS : public CDialog
{
DECLARE_DYNAMIC(ShowDlgS)
public:
ShowDlgS(CWnd* pParent = NULL); // 标准构造函数
ShowDlgS(HBITMAP hb,CWnd* pParent=NULL);
virtual ~ShowDlgS();
// 对话框数据
enum { IDD = IDD_DIALOG1 };
protected:
CBitmap m_bmp;
HBITMAP m_hBmp;
CPoint m_ptBegin;
CPoint m_ptMid;
CPoint m_ptEnd;
bool m_bBegin;
bool m_bEnd;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonU