SetTimer+OnTimer计时器不起作用!

pagesun 2005-05-19 02:24:29
CChipDlg chipDlg(this);
chipDlg.SetTimer(12,50,NULL);


//////////////
void CChipDlg::OnTimer(UINT nIDEvent)
{ //未调用!!!!!!!!!
switch(nIDEvent)
{
case 12:
this->OnCancel();
break;
}
.......
}
...全文
429 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
koko1998 2005-05-19
  • 打赏
  • 举报
回复
OnTimer的消息循环是在CChipDlg类中封状起来的,所以只有在CChipDlg类的对象窗体存在下还能正常使用.
Ariesman 2005-05-19
  • 打赏
  • 举报
回复
CChipDlg chipDlg(this);
这是临时变量,创建了一个新的实例,
在这个函数结束时会被自动销毁,所以不会响应OnTimer了,
因为它已经不存在了...
Ariesman 2005-05-19
  • 打赏
  • 举报
回复
CChipDlg chipDlg(this);
这是局部变量,创建了一个新的实例,
在这个函数结束时会被自动销毁,所以不会响应OnTimer了,
因为它已经不存在了...

oyljerry 2005-05-19
  • 打赏
  • 举报
回复
对话框保证没有销毁
chuanke 2005-05-19
  • 打赏
  • 举报
回复
最后还别忘了killtimer(12);
younggle 2005-05-19
  • 打赏
  • 举报
回复
你声明的变量chipDlg是局部变量,况且这个子窗口都没有创建起来,直接这样chipDlg.SetTimer(12,50,NULL);调用是不行的。
你可以这样做:
CChipDlg *pChipDlg = new CChipDlg(this);
pChipDlg->Create(对话框ID, this);
pChipDlg->ShowWindow(SW_SHOW);

然后在 CChipDlg::OnInitDialog() 中增加 SetTimer(12,50,NULL);就可以了。
最后别忘了 delete pChipDlg;
chen18s 2005-05-19
  • 打赏
  • 举报
回复
// API 关机程序
// 2000 server 以上操作系统无效 函数有变
// 印度神棍 2004.7.10
//

#include "stdafx.h"


const char pszAppName[] = "API Text Application" ; //窗口类名
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ; //窗口过程
LRESULT CALLBACK SetTime(HWND, UINT, WPARAM, LPARAM) ; //对话框处理
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM) ; //关于对话框处理函数
LRESULT CALLBACK ViewTime(HWND hInstan, UINT message, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst, hInstd, hInstan; //对话框句柄
int nSec = 0 ; //关机时间
BOOL bChange = FALSE ; //是否正常设置
HWND hWnd ;


//
// WinMain (HINSTANCE, HINSTANCE, PSTR, int )
//
// 入口函数。完成窗口注册,窗口创建并得到句柄,显示等功能
// 并设置计时器
//

int APIENTRY WinMain(HINSTANCE hInstance, //当前实例句柄
HINSTANCE hPrevInstance, //同样句柄
PSTR lpCmdLine, //命令行参数
int nCmdShow) //窗口打开方式
{

//窗口句柄
MSG msg ; //消息
WNDCLASS wndclass ; //窗口类结构
wndclass.style = CS_HREDRAW | CS_VREDRAW ; //重绘条件
wndclass.lpfnWndProc = WndProc ; //窗口处理函数指针
wndclass.cbClsExtra = 0 ; //类扩展预留空间
wndclass.cbWndExtra = 0 ; //窗口扩展预留空间
wndclass.hInstance = hInstance ; //窗口实例句柄
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION) ; //默认图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW) ; //箭头光标
wndclass.hbrBackground = (HBRUSH) GetStockObject (DKGRAY_BRUSH) ; //背景颜色 //or (HBRUSH)(COLOR_WINDOW)
wndclass.lpszMenuName = (LPCSTR)IDR_MENUMAIN ; //菜单
wndclass.lpszClassName = pszAppName ; //窗口类名

//注册,出错提示
if(!RegisterClass(&wndclass))
{
MessageBox(NULL, "This Program requires Windows NT!", pszAppName, 0);
return 0 ;
}

hWnd = CreateWindow(pszAppName, //窗口类名
"API Application Test", //窗口标题
WS_OVERLAPPEDWINDOW , //样式
CW_USEDEFAULT, //x
CW_USEDEFAULT, //y
300, //x size
200, //y size
NULL, //父窗句柄
NULL, //菜单句柄
hInstance, //当前实例句柄
NULL) ; //创造参数

SetTimer(hWnd, 1, 1000, 0); //计时器1000毫秒

ShowWindow(hWnd, nCmdShow) ;
UpdateWindow(hWnd) ;

while( GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
return msg.wParam ;

//return 0;

}


//
// WndProc 函数
// 处理菜单消息以及计时器。并实现定时关机功能
// 关机函数 ExitWindowsEx ( ) 需管理员权限
//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent ;
DWORD dwRet ;

switch (message)
{
case WM_CREATE:
EnableMenuItem(GetMenu(hWnd), ID_FILE_CANCEL, MF_GRAYED ) ;
break ;
case WM_INITDIALOG:
break ;
case WM_COMMAND: //命令消息
wmId = LOWORD(wParam) ; //消息ID 低位
wmEvent = HIWORD(wParam) ; //消息事件 高位
switch (wmId)
{
case ID_FILE_SETTIME:
//CreateDialog(hInst, /*(LPCTSTR)IDD_SETTIMER*/"name", hWnd, (DLGPROC)SetTime) ;
DialogBox(hInst, (LPCTSTR)IDD_SETTIMER, hWnd, (DLGPROC)SetTime) ;
break ;
case ID_FILE_PWOFF:
if(!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE , 0) )
{
dwRet = GetLastError();
if(dwRet == 1314)
MessageBox(hWnd, "2000 server 以上操作系统无效", "Sorry" , MB_OK) ;
}
break ;
case ID_ABOUT_ABOUT:
DialogBox(hInstd, (LPCTSTR)IDD_ABOUT, hWnd, (DLGPROC)About) ;
break ;
case ID_VIEW_TIME:
DialogBox(hInstan, (LPCTSTR)IDD_TIMEDLG, hWnd, (DLGPROC)ViewTime) ;
break ;
case ID_FILE_EXIT:
PostQuitMessage(0) ;
}
break ;
case WM_TIMER:
if( bChange == TRUE )
{//如果确定改变
nSec -- ;
if (nSec == 0 )
{
if(MessageBox(hWnd, "确定关机吗?", "确定", MB_OKCANCEL) == IDOK)
{
if ( !ExitWindowsEx(EWX_POWEROFF | EWX_FORCE , 0) )// ; //Ex(EWX_SHUTDOWN | EWX_FORCE, 0) ;
if((dwRet = GetLastError() ) == 1314)
MessageBox(hWnd, "此程序在2000 server以上操作系统无效", "Sorry", MB_OK);
}
}
}
break ;
case WM_DESTROY:
PostQuitMessage(0) ;
}
return DefWindowProc(hWnd, message, wParam, lParam) ;
}


//
// SetTime (HWND, UINT, WPARAM, LPARAM )
// 处理SetTime对话框消息
//
//


LRESULT CALLBACK SetTime(HWND hInst, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:

if( LOWORD(wParam) == IDOK)
{

//记录时间并开始比较 TODO
bChange = TRUE ;
char buffer[10] ;
GetDlgItemText(hInst, IDC_TIME, buffer, 10) ;
nSec = atoi(buffer) ;
if (nSec == NULL || nSec <= 0 )
{
MessageBox(hInst, "输入非0值!","错误", MB_OK) ;
}else
EndDialog(hInst, LOWORD(wParam)) ;
}else if( LOWORD(wParam) == IDCANCEL)
{
bChange = FALSE ;

EndDialog(hInst, LOWORD(wParam)) ;
}
break ;
case WM_INITDIALOG:
SetFocus(GetDlgItem(hInst, IDC_TIME)) ;
break ;
}
return FALSE ;
}



//
// LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM)
// 关于对话框处理函数
//
LRESULT CALLBACK About(HWND hInstd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmID = LOWORD(wParam) ;
int nSecond = 0 ;
BOOL bChan = TRUE ;
switch(message)
{
case WM_COMMAND:
switch( wmID )
{
case IDC_CLZ:
EndDialog(hInstd, LOWORD(wParam)) ;
break ;
}
break ;
case WM_INITDIALOG:
//SetWindowText(GetDlgItem(hInstd, IDC_LOGO), "\\") ;
SetFocus(GetDlgItem(hInstd, IDC_CLZ) ) ;
// case WM_PAINT:
// SetWindowText(GetDlgItem(hInstd, IDC_LOGO), strLogo) ;
// break ;

}
return FALSE ;
}

LRESULT CALLBACK ViewTime(HWND hInstan, UINT message, WPARAM wParam, LPARAM lParam)
{


int wmids = LOWORD(wParam) ;
switch(message)
{
// case WM_LBUTTONDOWN:
// MessageBox(hInstan, "啊啊啊", "oo", MB_OK) ;
case WM_CREATE:

break ;
case WM_INITDIALOG:
break ;
case WM_COMMAND:
switch(wmids)
{
case IDOK:
EndDialog(hInstan, wmids) ;
}

}
return FALSE ;
}
pagesun 2005-05-19
  • 打赏
  • 举报
回复
UP........






.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧