如何避免在 MFC 应用程序中使用按钮?
Posted
技术标签:
【中文标题】如何避免在 MFC 应用程序中使用按钮?【英文标题】:How to avoid using a button in an MFC application? 【发布时间】:2010-02-10 13:39:35 【问题描述】:这是我的第一个 MFC 应用程序,不幸的是我不明白它是如何工作的。我找到了一个简单的 MFC 应用程序,它获取给定路径的文件列表。我根据需要修改了此代码,但现在我遇到了一个问题。我的应用程序应该执行以下操作。它从一个文件中读取两个驱动器号。然后获取两个驱动器的文件列表,然后比较它们。如果主驱动器具有不在辅助驱动器上的文件,则它会自动复制它。我做了所有这一切,但现在我希望我的应用程序在没有用户交互的情况下运行。它应该只显示数据。不幸的是,当我按下一个按钮时,原始的 MFC 应用程序就启动了。我想把它拿出来,我不应该按任何按钮,它只是自动复制新文件。所以我的问题如下。我应该在哪里调用我的函数,所以我不需要按下按钮。我想我应该在这里调用它:
BEGIN_MESSAGE_MAP(CGetFileListDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_GET_FILE_LIST, &CGetFileListDlg::OnBnClickedButtonGetFileList) //this is the original
//call my function here
END_MESSAGE_MAP()
但我不知道,我应该使用哪个事件。我在 CGetFileListDlg::OnBnClickedButtonGetFileList() 函数中进行了我需要的所有更改,所以这就是我要调用它的原因。我不知道这是否重要,但在复制过程中我想显示我当前正在复制哪个文件。
请有人帮助我!
提前致谢!
坎皮
【问题讨论】:
【参考方案1】:您可以在OnInitDialog()
函数中模拟您的按钮单击(就在return TRUE;
之前):
PostMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON_GET_FILE_LIST, BN_CLICKED), 0);
注意:您可能需要在按钮处理程序上调用 UpdateWindow()
才能刷新窗口。
【讨论】:
嗨!这可能是一个愚蠢的问题,但我应该在哪里调用 OnCreate() 函数?这是我的第一个 MFC 应用程序,所以我不太了解您所说的 :( 能否请您发布一些代码,以便我理解? 嗨!感谢您的代码,现在我正在尝试理解。您的方法几乎可以正常工作,但是现在,我已经注释掉了很多行。这是(我认为)因为我的函数是在创建窗口之前调用的,所以我无法打印我想要的行。但是如果我可以打印,那么我什么都看不到,因为当创建 tge 窗口时,复制已经完成。我对吗?我只是猜测。您知道创建窗口后调用我的函数的方法吗?再次感谢! 嗨。我做了一些测试,毕竟 WM_CREATE 处理程序似乎不起作用。我现在发布了一个替代答案。希望它有效。 嗨!伙计,你真是个天才!我不敢相信事情就这么简单。自 3 天以来,我一直在寻找解决方案,但没有人给我一个有用的答案。谢谢! :) 现在我还有两个问题。 1.:如果我切换到另一个窗口,比如总指挥官,然后回到我的应用程序,那么窗口不再刷新。它显示最后复制的文件(但在后台它仍然有效,只是不更新窗口)。 2:有没有简单的方法,显示当前复制文件的百分比?再次感谢! 抱歉,我还有一个问题。你知道为什么,在复制过程中,我无法点击我的列表框吗?【参考方案2】:在对话框的代码文件中查找覆盖面板。为 OnInitDialog 添加一个条目。如果您真的希望在初始化对话框后执行所有文件处理代码。
【讨论】:
嗨!如果我将我的代码粘贴到 OnInitDialog 中,那么它几乎可以正常工作,但是直到复制尚未完成,窗口才会出现。如果复制完成,然后才会出现我的窗口。我应该只为复制创建另一个函数并从其他任何地方调用它吗?【参考方案3】:您应该将所有文件处理转移到它自己的方法中,然后您可以从任何需要的地方调用该方法。
这样做的好处是,您现在可以通过在按下按钮时调用该方法来测试代码,然后一旦您对新方法正常工作感到满意,您就可以从 OnInitDialog 或其他任何看起来合适的地方调用它.
【讨论】:
他已经说过他的文件处理代码在一个单独的函数中。 EDIT ack,他实际上后来提到了函数名称,我只是看到了。它是按钮处理程序。哎呀!以上是关于如何避免在 MFC 应用程序中使用按钮?的主要内容,如果未能解决你的问题,请参考以下文章