自学VC有几个星期了.前面几周把基础的内容给看了.然后就手痒了,想自己动手做点东西.
先做点简单的,做个定时关机的程序吧,调试了好久,运行后,调整日期日间先取器控件的时间,却出现了内存读错误.对这种错误真是一点办法都没有.把一些关键代码贴出来:
BOOL CPCTimeCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog(); AddIcon(); //启动计时器,一秒钟更新一次
SetTimer(0,1000,NULL);
bSetTime=false;
bSetTime1=false;
bSetTime2=false;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}void CPCTimeCtrlDlg::OnTimer(UINT nIDEvent)
{
int hour,min,sec;
int yhour,ymin,ysec;
CTime nowtime = CTime::GetCurrentTime();
m_sNowTime = nowtime.Format(_T("%Y-%m-%d %H:%M:%S"));
UpdateData(FALSE);
hour = nowtime.GetHour();
min = nowtime.GetMinute();
sec = nowtime.GetSecond();
yhour = m_Time.GetHour();
ymin = m_Time.GetMinute();
ysec = m_Time.GetSecond();
//如果时间到,则执行相应操作
if(bSetTime)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_SHUTDOWN,0);
}
if(bSetTime1)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_REBOOT,0);
}
if(bSetTime2)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_LOGOFF,0);
}
CDialog::OnTimer(nIDEvent);
}void CPCTimeCtrlDlg::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UpdateData(true); //更新控件显示
*pResult = 0;
}
像这种内存错误一直困扰我,一点办法都没有.高手指教,小弟感激不尽!
先做点简单的,做个定时关机的程序吧,调试了好久,运行后,调整日期日间先取器控件的时间,却出现了内存读错误.对这种错误真是一点办法都没有.把一些关键代码贴出来:
BOOL CPCTimeCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog(); AddIcon(); //启动计时器,一秒钟更新一次
SetTimer(0,1000,NULL);
bSetTime=false;
bSetTime1=false;
bSetTime2=false;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}void CPCTimeCtrlDlg::OnTimer(UINT nIDEvent)
{
int hour,min,sec;
int yhour,ymin,ysec;
CTime nowtime = CTime::GetCurrentTime();
m_sNowTime = nowtime.Format(_T("%Y-%m-%d %H:%M:%S"));
UpdateData(FALSE);
hour = nowtime.GetHour();
min = nowtime.GetMinute();
sec = nowtime.GetSecond();
yhour = m_Time.GetHour();
ymin = m_Time.GetMinute();
ysec = m_Time.GetSecond();
//如果时间到,则执行相应操作
if(bSetTime)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_SHUTDOWN,0);
}
if(bSetTime1)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_REBOOT,0);
}
if(bSetTime2)
{
if(hour == yhour && min == ymin )
ExitWindowsEx(EWX_LOGOFF,0);
}
CDialog::OnTimer(nIDEvent);
}void CPCTimeCtrlDlg::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UpdateData(true); //更新控件显示
*pResult = 0;
}
像这种内存错误一直困扰我,一点办法都没有.高手指教,小弟感激不尽!
对控件的操作要判断控件的句柄是不是为空,不然的话,你对控件的任何操作都会是无效的,你如果不清楚控件的生成流程的话,那么你每次使用控件之前,就要首先判定控件的句柄。还有就是你OnDatetimechangeDatetimepicker1是不是连续触发进入了,如果是连续循环触发的话,也有可能导致问题
纠正你的一个错误
UpdateData(true); //更新控件显示
这句是你写的吧?UpdateData(TRUE) -- 刷新控件的值到对应的变量,UpdateData(FALSE) -- 拷贝变量值到控件显示。你的参数应该是UpdateData(FALSE),而不是用TRUE。
sleep(time);
ExitWindowsEx(EWX_SHUTDOWN,0);这样子的话会节省很多很多的系统资源,实现起来又方便。
对应OnTimer(UINT nIDEvent)的nIDEvent,当设置了几个定时器,可以通过这个判别.
当设置了定时器时,一定要KillTimer(定时器标识ID)
最后还要killtimer释放内存