MFC Windows程序设计--计时器和空闲处理

CWnd::SetTimer
CWnd::KillTimer

// 两种定时器机制
1.给指定窗口发WM_TIMER。
2.调用应用定义的回调函数。

计时器消息不会积压在消息队列中。

SetTimer(1, 2, 3);
1,计时器ID
2,时间间隔
3,回调函数

Windows计时器基于的硬件计时器一般54.9ms走一下,如编写精确计时的应用程序,则用多媒体定时器,可以把间隔设置为1ms或更小。

ON_WM_TIMER()
afx_msg void OnTimer(UINT nTimerID);

SetTimer(ID_TIMER, 100, TimerProc);

void CALLBACK TimerProc(HWND hwnd, UINT nMsg, UINT nTimerID, DWORD dwTime);
dwTime:windows启动后经过的毫秒数。

KillTimer(nID);

CWnd::ModifyStyle // 动态改变窗口风格
CWnd::SetWindowPos

CWnd::GetWindowPlacement
CWnd::SetWindowPlacement

::SetMenuDefaultItem

1.
Create(NULL, _T(“MyWindow”), WS_OVERLAPPEDWINDOW, rectDefault, NULL, NULL, WS_EX_TOPMOST);

2.
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

CWinApp::GetProfileInt
CWinApp::WriteProfileInt

注册表
HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA

建议的Windows应用程序存储私有配置位置:
HKEY_CURRENT_USER\Software\CompanyName\ProductName\Version

CWinApp::SetRegistryKey // 指定主框架用注册表而不是INI文件。

写入:
CWinApp::WriteProfileString
CWinApp::WriteProfileInt

读出:
CWinApp::GetProfileString
CWinApp::GetProfileInt

SetRegistryKey(_T("WordSmith"));
WriteProfileInt(_T("Version 1.0"), _T("MRULength"), 8);

// 上面语句创建了下面的注册表输入项
// MFC默认将可执行文件名作为注册表里的产品名
// HKEY_CURRENT_USER\Software\WordSmith\MYWORD\Version 1.0\MRULength = 8

// 注册表中存在时,将值取回。不存在,返回4。
m_nMRULength = GetProfileInt(_T("Version 1.0"), _T("MRULength"), 4);

CWnd::GetWindowPlacement
CWnd::SetWindowPlacement

typedef struct tagWINDOWPLACEMENT
{
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
}WINDOWPLACEMENT;

控制窗口大小:WM_GETMINMAXINFO
void CMainWindow::OnGetMinMaxInfo(MINMAXINFO *pMMI)
{
pMMI->ptMinTrackSize.x = 120;
pMMI->ptMinTrackSize.y = 120;
pMMI->ptMaxTrackSize.x = 400;
pMMI->ptMaxTrackSize.y = 400;
}

空闲处理:

CWinThread::Run(...)
{
    BOOL bIdle = TRUE;
    LONG nIdleCount = 0;
    for(;;)
    {
        while
        (
            bIdle
        &&  !::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE)
        )
        {
            if(!OnIdle(nIdleCount++))
            {
                bIdle = TRUE;
            }
        }
    }

    do
    {
        if(!PumpMessage())
        {
            return ExitInstance();
        }

        if(IsIdleMessage(&m_msgCur))
        {
            bIdle = TRUE;
            nIdleCount = 0;
        }
    }
    while(::GetPeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
}

virtual BOOL CWinApp::OnIdle(LONG lCount);
FromHandle 将窗口句柄转换为CWnd*。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值