如何使用win32编写通用警报消息?

时间:2009-09-08 13:31:27

标签: c++ winapi

我只想将以下方法扩展为更通用的方法,它应该接受任何类型的参数并使用MessageBox()显示它:

void alert(char *item)
{
  MessageBox(NULL, item,  "Message", MB_OK | MB_ICONINFORMATION);
}

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

#include <sstream>
template<typename T>
void alert(T item)
{
//this accepts all types that supports operator << 
  std::ostringstream os;
  os << item;
  MessageBoxA(NULL, os.str().c_str(),  "Message", MB_OK | MB_ICONINFORMATION);
}

//now you need specialization for wide char
void alert(const wchar_t* item)
{

  MessageBoxW(NULL, item,  "Message", MB_OK | MB_ICONINFORMATION);
}

答案 1 :(得分:2)

您可以写下类似内容:

template<typename T>
void alert(T item)
{
  MessageBox(NULL, boost::lexical_cast<std::string>(item).c_str(),  "Message", MB_OK | MB_ICONINFORMATION);
}

您应该将boost::lexical_cast专门用于您想要的任何参数类型,因为它支持的范围有限。


另一种方法是使用boost::format

// helper class
class msg_helper_t {
public:
    msg_helper_t(const char* msg ) : fmt(msg) {}
    ~msg_helper_t() { 
        MessageBox(NULL, str( fmt ).c_str(),  "Message", MB_OK | MB_ICONINFORMATION); 
    }

    template <typename T>
    msg_helper_t& operator %(const T& value) {
        try {
            fmt % value;
        } catch ( std::exception e ) {
            // some exceptional actions
        }
        return *this;
    }
    template <>
    msg_helper_t& operator %(const CString& value) {
        try {
            fmt % value.GetString();
        } catch ( std::exception e ) {
            // some exceptional actions
        }
        return *this;
    }

protected:
    boost::format   fmt;
};

// our message function
msg_helper_t MyMsgBox(const char* msg) { return msg_helper_t( msg ); }

稍后可以按以下方式使用:

   MyMsgBox( "Hello with %d arguments: %s" ) % 2 % "some text";
   MyMsgBox( "%d" ) % 123456;
   MyMsgBox( "%f" ) % 10.5f;

答案 2 :(得分:-1)

由于C ++是静态类型的,你可能需要做以下两件事之一:

  1. 使用类层次结构并使警报获取指向基类的指针/引用,该基类包含某种虚拟“toString()”函数(Java / .NET方法)。这里的缺点是alert()现在只适用于该类层次结构中的类型。
  2. 为无法直接转换为字符串的类型重载警报功能,但缺点是必须重复代码。
  3. 此外,如果您使用ANSI字符串,则应确保使用MessageBoxA,否则您应该考虑使用TCHAR和MessageBox或wchar_t和MessageBoxW。