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*。