我有一些代码,如下所示:
voID MyClass::OnbuttonClick() { int retVal = SomeDialog.DoModal(); if(retVal == MYCLASS_ERROR) { MessageBox("Error"...blah ...blah); } else if(retVal == IDOK) // IDOK is returned on clicking the 'OK' button { MessageBox("All is well"...blah ...blah); } }
SomeDialog只是显示一个进度条。 在出现任何错误时,通过调用EndDialog(MYCLASS_ERROR)来自动closures进度条。 只有成功完成后,用户才可以点击“确定”。
MYCLASS_ERROR是enum一个值,它包含各种返回types和状态。
我发现单击SomeDialog确定,错误信息仍然显示! 我挖得更深一点,发现MYCLASS_ERROR = IDOK = 1。
所以我的问题是,我应该如何定义所有这些返回状态,使它不会与任何其他实现的状态相冲突? 意思是,我的函数应该返回不是由其他函数返回的值(或尽可能less的其他函数)。
我想修改我的devise,使所有的function只返回TRUE或FALSE。 但是,这在所有情况下都是不可行的。 我也search了很多答案,到目前为止还没有find答案。
Cython包装使用cl.exe将.c文件编译为.pyd(windows)
C程序打印当前时间
如何在VC ++中复制文件?
GDB回溯没有用户input?
对于不同的平台(linux,windows等),C ++编译器是多次编写的,这是真的吗?
感谢您的期待!
如何从windows 10创build者更新上运行的WPF应用程序注册BLE通知?
C#控制台应用程序在windows Server上无法正常工作(在win XP和win 7上工作正常)
如何从C程序在linux中刷新cpucaching?
在`fwprintf'之后使用'fprintf'时没有输出
信号处理程序中设置标志
有办法解决这个问题,但他们有点难看。
最干净的设计通常是避免与标准的Win32成语相冲突的设计,在Win32的世界中,模式对话框返回一个ID值来指示用户点击它们时按下的按钮(就像消息框一样)。 严格来说,它是传递给EndDialog函数的nResult参数,用于关闭模式对话框。
我建议不要试图用额外的含义来重载这个返回值。 试图这样做只会让你陷入困境(例如,你可能还没有注意到返回值-1意味着创建对话框失败)。
相反,在对话框类中定义一个额外的成员变量,并用它来报告你的附加信息。 成功后,您将从对话框返回IDOK 。 失败( 任何一种失败),返回像IDCANCEL 。 OnbuttonClick代码将检查返回值是IDOK还是IDCANCEL 。 如果是IDCANCEL ,则还需要查询添加到对话框的成员变量的值以获取更多信息。
希望这是有道理的。 如果没有,也许这个代码示例将(假设m_errStatus是您添加到CDialog的子类的成员变量):
voID MyClass::OnbuttonClick() { if (SomeDialog.DoModal() == IDOK) { // Success! // The OK button was clicked,so IDOK was returned. MessageBox("All is well"...blah ...blah); } else { // Failure! // Some error occurred,so IDCANCEL (or any other value) was returned. // Determine what to do Now,based on additional information that the // dialog set upon failure. switch (SomeDialog.m_errStatus) { case MYCLASS_ERROR_1: MessageBox("Error 1 occurred."); break; case MYCLASS_ERROR_2: MessageBox("Error 2 occurred."); break; // etc. } } }
您可以简单地定义您的自定义错误代码,使其不与windows返回值“冲突”。 当然,你不知道微软什么时候会添加新的返回值,所以这总是会有一点小小的风险。
你可以尝试这样的事情:
enum MYERR { MYERR_FirsT_ERROR = 0x0F000000,/* large and unlikely to be used */ MYERR_SECOND_ERROR,MYERR_THIRD_ERROR,/* and so on */ };
但是,正如上面的Cody Gray所说,我认为最好从DoModal返回一个标准的错误代码,比如IDABORT而不是像这样重载代码。 然后,只需要用户必须显式检索的第二个错误代码,这是您自己的“内部”错误代码。
您可以使用枚举而不是宏定义的返回码,并使用名称空间来避免名称冲突。 查看Boost错误处理策略 :
namespace boost { namespace math { namespace policIEs { enum error_policy_type { throw_on_error = 0,// throw an exception. errno_on_error = 1,// set ::errno & return 0,NaN,infinity or best guess. ignore_error = 2,// return 0,infinity or best guess. user_error = 3 // call a user-defined error handler. }; }}} // namespaces
总结以上是内存溢出为你收集整理的需要一个强大的错误系统的Win32 gui应用程序全部内容,希望文章能够帮你解决需要一个强大的错误系统的Win32 gui应用程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)