请问一下非模态对话框如何响应事件消息

ronekyng 2009-04-21 11:06:27
我的非模态对画框不能响应TIMER事件,
上网查了好久
只知道说非模态对话框没有自己的消息队列
所有的消息传递父窗口

那么我的问题是
1、为什么我的按钮可以用而TIMER却不可以
2、为什么在父窗口中OnTimer不行
3、PreTranslateMessage(MSG* pMsg)

while(GetMessage(&Msg,NULL,0,0))
{
if(!IsDialogMessage(hdlg,&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
这些代码应该在那里实现是重载函数里面,重载哪个函数?
4、有人用CreateDialog,使用CALLBACK DialogProc来处理,那么问一下这样做能否实现所有的事件,响应时间的函数参数如何写如OnTimer(UINT nIDEvent)中的nIDEvent,DialogProc中未定义的事件会有问题吗?



**********************************************
我问的很详细
无非是因为在网上搜索的关于非模态对话框的消息处理问题的答案大多含糊
你不用回答每个问题
我最想知道的事如何解决非模态对话框消息处理的问题
您不用回答所有解决方法,但是要把某一种解决方法说得详细点
否则我不会给分

50分按照30/20或者20/20/10来给
...全文
423 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2009-04-22
  • 打赏
  • 举报
回复
1.你用了SetTimer没有,
2.同上,
3.PreTranslateMessage(MSG* pMsg) 是MFC的消息预处理函数,在Add virtual function里添加

下面的常用于windows编程,是窗口的消息循环方法
while(GetMessage(&Msg,NULL,0,0))
{
if(!IsDialogMessage(hdlg,&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
在他乡奋斗 2009-04-22
  • 打赏
  • 举报
回复
这个问题我以前没有碰到过。居然你说模态对话框没有自己大消息队列,所有消息传到其父窗口中。那处理其消息必须在其父窗口中处理。但并非这样,比如模态对话框中可以响应按钮事件吧。
所以为觉得:在其父窗口中如果没有相应大消息处理映射,还是会传递给模态对话框处理的。
我估计你大父类窗口中有TIMER处理映射,这样就阻止了传递给模态对话框。
贪玩的老鼠 2009-04-22
  • 打赏
  • 举报
回复
非模态对话框可以响应TIMER消息的.
ronekyng 2009-04-22
  • 打赏
  • 举报
回复
知道了
我的对话框是继承的类
与父类的message ID有冲突
晕!!!!
zgl7903 2009-04-22
  • 打赏
  • 举报
回复
非模态对话框不响应定时器而响应是不应该的
用模态方式启动看看是否能响应?

很简单的用About测试一下


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
public:
virtual BOOL Create(CWnd* pParentWnd);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();

SetTimer(1,2000,0);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void CAboutDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent == 1)
{
EndDialog(0);
return;
}
CDialog::OnTimer(nIDEvent);
}

BOOL CAboutDlg::Create(CWnd* pParentWnd)
{
// TODO: Add your specialized code here and/or call the base class

return CDialog::Create(IDD, pParentWnd);
}


//测试
CAboutDlg *pDlg =0;

BOOL CT1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();


pDlg = new CAboutDlg();
if(pDlg->Create(0))
{
pDlg->ShowWindow(SW_SHOW);
pDlg->CenterWindow();
}
……

16,472

社区成员

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

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

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