导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

弹出很多个MessageBox对话框

ufdxkm 2009-08-04 08:21:53
代码在下面, 大家帮我看下. 有哪些不合理 而且可以改进的地方. 关机那里的MessageBox是为了测试消息,但是却弹出好多MessageBox, 不知道为什么,谢谢啦!


#include <windows.h>
#include "resource.h"

#define ID_TIMER1 1

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam);
INT_PTR CALLBACK CloseWin_Proc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam);

HINSTANCE hInst=0;
HWND hbut1=0;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int iCmdShow)
{
HWND hwnd;
MSG msg;

WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=DLGWINDOWEXTRA;
wndclass.hbrBackground=(HBRUSH)COLOR_WINDOWFRAME;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=TEXT("ALLINONE");
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;

hInst=hInstance;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,
TEXT("必须运行在Window NT 下!"),
TEXT("错误"),MB_OK);
return 0;
}

hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN),
NULL,NULL);

ShowWindow(hwnd,iCmdShow);

while(GetMessage(&msg,NULL,NULL,NULL))
{
if(hbut1==NULL||!IsDialogMessage(hbut1,&msg))
{
DispatchMessage(&msg);
TranslateMessage(&msg);
}
}
return (int)msg.lParam;
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam)
{


switch(message)
{

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BUTTON1://创建关机对话框
hbut1=CreateDialog(hInst,MAKEINTRESOURCE(IDD_BUTTON1),hwnd,CloseWin_Proc);
ShowWindow(hwnd,SW_HIDE);
return 0;
}
break;

case WM_CTLCOLORSTATIC:
return (LRESULT)GetStockObject(WHITE_BRUSH);

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

return DefWindowProc(hwnd,message,wParam,lParam);
}

INT_PTR CALLBACK CloseWin_Proc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{

HWND hwndP=GetParent(hwnd);
SYSTEMTIME st;
static TCHAR time[50];
static int ci;
static int hour,minutes;
static BOOL close=FALSE;


switch(message)
{


case WM_INITDIALOG:
//填充combox列表
SetTimer(hwnd,ID_TIMER1,1000,NULL);
for(ci=0;ci<24;ci++)
{
if(ci<=9)
{
wsprintf(time,TEXT("0%d"),ci);
}
else
wsprintf(time,TEXT("%d"),ci);
SendMessage(GetDlgItem(hwnd,IDC_COMBO1),
CB_ADDSTRING,0,LPARAM(time));
}
for(ci=0;ci<=60;ci++)
{
if(ci<=9)
wsprintf(time,TEXT("0%d"),ci);
else
wsprintf(time,TEXT("%d"),ci);

SendMessage(GetDlgItem(hwnd,IDC_COMBO2),CB_ADDSTRING,
0,LPARAM(time));
}


return TRUE;


case WM_COMMAND:
switch(LOWORD(wParam))
{
//COMBOX的时间选择
case IDC_COMBO1:
if(HIWORD(wParam)==LBN_SELCHANGE)
hour=SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
return TRUE;

case IDC_COMBO2:
if(HIWORD(wParam)==LBN_SELCHANGE)
minutes=SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
return TRUE;
case IDC_OK://隐藏窗口,显示主窗口
close=TRUE;
ShowWindow(hwnd,SW_HIDE);
ShowWindow(hwndP,SW_SHOW);
return TRUE;

case IDC_CANCLE:
SendMessage(hwnd,WM_CLOSE,0,0);
return TRUE;


}
return FALSE;

case WM_TIMER:

GetLocalTime(&st);//获得系统时间
GetTimeFormat(NULL,
TIME_FORCE24HOURFORMAT,
&st,
TEXT("HH':'mm':'ss"),
time+wsprintf(time,TEXT(" %d-%d-%d "),st.wYear,st.wMonth,st.wDay),
50);

SetWindowText(GetDlgItem(hwnd,IDC_TIME),time);//更新时间显示

if(close && (st.wHour==hour) && (st.wMinute==minutes))//关机条件
{
//运行一下就会发现,这个消息框一直出..怎么回事
MessageBox(hwnd,TEXT("WM_TIMER 关机消息发送!"),TEXT("提示"),MB_OK);
//是否成功
//ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF,0);//关机函数
//SendMessage(hwnd,WM_CLOSE,0,0);
SendMessage(hwndP,WM_DESTROY,0,0);//退出程序


}

return TRUE;


case WM_CLOSE:
close=FALSE;
ShowWindow(hwndP,SW_SHOW);
hbut1=NULL;
KillTimer(hwnd,ID_TIMER1);
DestroyWindow(hwnd);
return TRUE;
}
return FALSE;

}
...全文
98 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ufdxkm 2009-08-04
嗯. 谢谢楼上各位.!
回复
oyljerry 2009-08-04
你SetTimer设置了定时器,因而会不停的触发case WM_TIMER:,从而根据你的条件弹出对话框
回复
ufdxkm 2009-08-04
哦 , 明白了, 那个比较的是 分钟 和 小时. 我看成秒了. 谢谢了!
回复
forimprove 2009-08-04
你的定时器是1秒执行1次
回复
forimprove 2009-08-04
不关闭的话要弹60次,除非你再比较个时间秒。
回复
ufdxkm 2009-08-04
假设那里 不 KillTimer的话, 那么 st 就会被GetLocalTime更新, if里的语句也就不会执行的呀 ?
回复
forimprove 2009-08-04

if(close && (st.wHour==hour) && (st.wMinute==minutes))//关机条件
{
KillTimer(ID_TIMER1); //添加一句,关闭定时器
//运行一下就会发现,这个消息框一直出..怎么回事
MessageBox(hwnd,TEXT("WM_TIMER 关机消息发送!"),TEXT("提示"),MB_OK);
//是否成功
//ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF,0);//关机函数
//SendMessage(hwnd,WM_CLOSE,0,0);
SendMessage(hwndP,WM_DESTROY,0,0);//退出程序


}

回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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