MFC一个应用程序
点击IDC_SETTIME按钮ON_BN_CLICKED(IDC_SETTIME, OnSettime)调用
void CTimeExitDlg::OnSettime() 函数,函数如下:
void CTimeExitDlg::OnSettime()
{
// TODO: Add your control notification handler code here
CHAR szText[MAX_PATH];
GetDlgItem(IDC_EDIT_T)->GetWindowText(szText, MAX_PATH);
g_nSDTime = atoi(szText);
if(g_nSDTime == 0)
{
MessageBox("请输入一个大于0的数值!", "出错啦", MB_OK|MB_ICONERROR);
//return 0;
}
else
{
g_bIsApply = TRUE;
}
}
该函数执行完后,会产生ON_WM_TIMER()消息调用OnTimer(UINT nIDEvent),函数如下:
void CTimeExitDlg::OnTimer(UINT nIDEvent)
{
CHAR szFormat[] = "现在时间:%d:%d:%d%d";
SYSTEMTIME st;
GetLocalTime(&st);
if(st.wSecond < 10)
wsprintf(g_szTime, szFormat, st.wHour, st.wMinute, st.wSecond/10, st.wSecond%10);
TextOut(g_hdc, 65, 60, g_szTime, lstrlen(g_szTime));
::InvalidateRect(g_hWnd, NULL, FALSE);
::UpdateWindow(g_hWnd);
if(g_bIsApply)
{
g_nCounter++;
if(g_nCounter == 60)
{
g_nCounter = 0;
g_nSDTime--;
}
CHAR szLeaveMinute[] = "距离关机还有 %d 分钟";
CHAR szLeaveSecond[] = "距离关机还有 %d 秒";
CHAR szBuffer[MAX_PATH];
if(g_nSDTime >1)
wsprintf(szBuffer, szLeaveMinute, g_nSDTime);
else if(g_nSDTime == 1 && g_nCounter < 60)
wsprintf(szBuffer, szLeaveSecond, 60-g_nCounter);
GetDlgItem(IDC_JLGJ)->SetWindowText(szBuffer);
if(g_nSDTime == 0)
{
GetDlgItem( IDC_JLGJ)->SetWindowText( "正在关机...");
OnShutdown();
}
}
else
{
GetDlgItem(IDC_JLGJ)->SetWindowText("尚未设置定时关机");
}
CDialog::OnTimer(nIDEvent);
}
我想问的是:void CTimeExitDlg::OnSettime() 函数是如何产生ON_WM_TIMER()消息的?
该代码是如何产生ON_WM_TIMER()消息的?
答案:1 悬赏:50 手机版
解决时间 2021-02-07 03:32
- 提问者网友:椧運幽默
- 2021-02-06 08:36
最佳答案
- 五星知识达人网友:人间朝暮
- 2021-02-06 09:07
OnSettime() 并没有产生ON_WM_TIMER()消息。
MFC是对Windows SDK的OO封装。 它是通过在你的应用中建立所谓的消息映射Message Map来处理Windows系统的消息序列的。
首先是建立消息映射。 代码的头文件中应该有类似的片段:
class CTimeExitDlg : public CDialog
{
public:
...
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnSettime();
..
DECLARE_MESSAGE_MAP()
...
};
在相应的cpp中,应该有类似的东东:
BEGIN_MESSAGE_MAP(CTimeExitDlg, CDialog)
...
ON_WM_TIMER()
ON_BN_CLICKED(IDC_SETTIME, OnSettime)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
...
END_MESSAGE_MAP()
这样Dialog的消息映射就建立了。
其次是产生消息。 在int CTimeExitDlg::OnCreate(...) 或者 BOOL CTimeExitDlg::OnInitDialog(...)中应该有类似的函数调用: SetTimer(...); 这才是WM_TIMER的消息产生源头。 如果没有定义相应的TimerProc,那么Windows就会向你的窗口post一个WM_TIMER消息, ON_WM_TIMER()只是映射了这点,捕获消息后,交给你的程序处理。。。。。。
MFC是对Windows SDK的OO封装。 它是通过在你的应用中建立所谓的消息映射Message Map来处理Windows系统的消息序列的。
首先是建立消息映射。 代码的头文件中应该有类似的片段:
class CTimeExitDlg : public CDialog
{
public:
...
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnSettime();
..
DECLARE_MESSAGE_MAP()
...
};
在相应的cpp中,应该有类似的东东:
BEGIN_MESSAGE_MAP(CTimeExitDlg, CDialog)
...
ON_WM_TIMER()
ON_BN_CLICKED(IDC_SETTIME, OnSettime)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
...
END_MESSAGE_MAP()
这样Dialog的消息映射就建立了。
其次是产生消息。 在int CTimeExitDlg::OnCreate(...) 或者 BOOL CTimeExitDlg::OnInitDialog(...)中应该有类似的函数调用: SetTimer(...); 这才是WM_TIMER的消息产生源头。 如果没有定义相应的TimerProc,那么Windows就会向你的窗口post一个WM_TIMER消息, ON_WM_TIMER()只是映射了这点,捕获消息后,交给你的程序处理。。。。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯