MFC下设置快捷键操作(热键)

Posted on 2009-11-23 21:45  严武  阅读(4279)  评论(0编辑  收藏  举报

 

最近,测试时常用到计算程序的运行时间。

每次同事或自己用手机、MP4,或者开着网页或windows时间窗口来计算时间,感觉都太笨的,学计算机的,计时工具竟还是用这些!当然网上肯定是能找到一堆完整的计时工具,但我们懒。。。呼,后面的就不说了!

那就弄个MFC对话框,在里面设置一个热键(如Shift+F11)来触发开发计时吧。
1、生成一个VC工程(这里用MFC的单对话框);
2、在对话框类的消息映射里(BEGIN_MESSAGE_MAP(CMFCusePerlDlg, CDialog))添加:
ON_MESSAGE(WM_HOTKEY, OnHotKey)   //热键映射消息
3、在对话框类中(生成的消息映射函数)添加:
afx_msg LRESULT OnHotKey(WPARAM wp, LPARAM lp);  //热键消息映射函数
4、在对话框初始化函数中(BOOL CMFCusePerlDlg::OnInitDialog())添加:
    m_Hotkey.SetRules(HKCOMB_C, HOTKEYF_CONTROL);  //设置热键
    m_Hotkey.SetRules(VK_F9, HOTKEYF_CONTROL);
    WORD virtualcode = MOD_SHIFT;
    WORD modifiers = VK_F11;

    if ( !RegisterHotKey(this->m_hWnd, 100612, virtualcode, modifiers) )  //函数请参考MSDN
    {
        MessageBox(_T("热键冲突"));
    }
5、处理热键的消息函数:
LRESULT CMFCusePerlDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
    if (100612 == wParam)
    {
        TCHAR szStr[MAX_PATH] = _T("");

        GetDlgItemText(IDC_BUTTON_LOGTIME, szStr, MAX_PATH);  //获取按键上的标题文字

        if( _stricmp(szStr, "开始计时(Shift+F11)") == 0 )//判断开始计时,若设两热键就不用这样
        {
            SetDlgItemText(IDC_STATIC_TIME, _T(""));
            SetDlgItemText( IDC_BUTTON_LOGTIME, _T("计时结束(Shift+F11)") );
            m_stopwatch.Start();  //计时的类对象(在类中声明),开始计时
        }

        if ( _stricmp(szStr, "计时结束(Shift+F11)") == 0 )//判断结束计时
        {
            SetDlgItemText(IDC_BUTTON_LOGTIME, _T("开始计时(Shift+F11)"));
            ShowRunTime();  //计时的结果处理函数
        }
    }
    return FALSE;
}
6、计时的类
class CStopwatch
{
public:
    CStopwatch(void);
    ~CStopwatch(void);
    __int64 Now() const;
    void Start();
private:
    LARGE_INTEGER m_liPerfFreq;
    LARGE_INTEGER m_liPerfStart;
};

#include "StdAfx.h"
#include "Stopwatch.h"
CStopwatch::CStopwatch(void)
{
    QueryPerformanceFrequency(&m_liPerfFreq);
//     Start();
}

CStopwatch::~CStopwatch(void)
{
}

void CStopwatch::Start()
{
    QueryPerformanceCounter(&m_liPerfStart);
}

__int64 CStopwatch::Now() const
{
    //Returns of millisecodes since Start was called
    LARGE_INTEGER liPerfNow;
    QueryPerformanceCounter(&liPerfNow);

    return (((liPerfNow.QuadPart-m_liPerfStart.QuadPart)*1000)/m_liPerfFreq.QuadPart);
}
7、我的计时结果处理函数
void CMFCusePerlDlg::ShowRunTime()
{
    __int64 numTime = m_stopwatch.Now(); //计时结果

    TCHAR szTime[20] = _T("");       //保存运行时间变量
    _i64toa_s(numTime, szTime, sizeof(szTime), 10);

    SetDlgItemText(IDC_STATIC_TIME, szTime); //IDC_STATIC_TIME为对话框的静态文本框

    g_logTimes ++;   //进行的计时记录次数加1

    TCHAR szLogPath[MAX_PATH] = "";
    GetCurrentDirectory( sizeof(szLogPath), szLogPath );   //获取当前程序路径
    strcat(szLogPath, "//logtime.ini");

    TCHAR szNum[10] = "";
    _itoa(g_logTimes, szNum, 10);

    TCHAR szString[30] = "";
    strcpy(szString, "第 ");
    strcat(szString, szNum);
    strcat(szString, " 次计时的时间");

    WritePrivateProfileString(_T("计时结果(毫秒)"), szString, szTime, szLogPath);//写进文件

    return;
}

大体就这样了。

编译,运行。按下Shift+F11热键,开始计时,再按一次,计时结束,结果在对话框的文本框里显示并写到当前目录下的logtim.ini文件里。
(以上纯属胡乱写,存在失误之处,也在考虑情理之中,敬请谅解)

Copyright © 2024 严武
Powered by .NET 8.0 on Kubernetes