4

C++BuilderでVCLフォームアプリケーションを使用しています。はいいいえキャンセルボタンのあるメッセージボックスを表示し、はい、いいえ、またはキャンセルボタンが押されたかどうかを検出するために、いくつかのコードで助けを借りることができますか?

これが私のコードです:

if(MessageBox(NULL, "Test message", "test title",  MB_YESNOCANCEL) == IDYES)
{

}

私は以下を含めました:

#include <windows.h>

次のエラーが発生します。

E2034'charconst[13]'を'constwchar_t*'に変換できません

E2342パラメーター'lpText'の型の不一致(必要な'const wchar_t *'、取得した'const char *')

アップデート

これが私のコードです:

const int result = MessageBox(NULL, L"You have " + integerNumberOfImportantAppointments + " important appointments. Do you wish to view them?", L"test title",  MB_YESNOCANCEL);

値:integerNumberOfImportantAppointmentsは整数です。これをメッセージボックスに表示するにはどうすればよいですか?

次のエラーが発生します:無効なポインタの追加。

また、メッセージボックスのアイコンを選択できますか?この場合の質問。

4

4 に答える 4

15

どうぞ。toの呼び出しではワイド文字を使用する必要がMessageBoxあり、次に何をするかを決める前に、結果を変数に格納する必要があります。

const int result = MessageBox(NULL, L"Test message", L"test title",  MB_YESNOCANCEL);

switch (result)
{
case IDYES:
    // Do something
    break;
case IDNO:
    // Do something
    break;
case IDCANCEL:
    // Do something
    break;
}

更新、次の質問編集:

// Format the message with your appointment count.
CString message;
message.Format(L"You have %d important appointments. Do you wish to view them?", integerNumberOfImportantAppointments);

// Show the message box with a question mark icon
const int result = MessageBox(NULL, message, L"test title",  MB_YESNOCANCEL | MB_ICONQUESTION);

MessageBoxのドキュメントを読む必要があります。

于 2012-09-25T09:03:20.323 に答える
3

私はC++Builderの経験がありませんが、UNICODE(実際にはワイド文字ですが、今のところ詳細は無視します)文字列が必要なANSI文字列を使用しているようです。これを試して:

if(MessageBox(NULL, L"Test message", L"test title",  MB_YESNOCANCEL) == IDYES)

さらに良いことに、文字列がアプリの設定に準拠していることを確認するには、次を使用できます。

if(MessageBox(NULL, _T("Test message"), _T("test title"),  MB_YESNOCANCEL) == IDYES)

これにより、UNICODEビルドではワイド(wchar_t *)文字列が使用され、非UNICODEビルドではナロー(char *)文字列が使用されます(プロジェクトオプションの「_TCHARマップ」の部分を参照) 。

詳細については、こちらをご覧ください

于 2012-09-25T08:15:13.100 に答える
1

C ++ビルドでこれを行う方法はわかりませんが、有効にする必要があります。マルチビット文字のようなものだと思いますが、コンパイラでドキュメントを確認する必要があります。

于 2012-09-25T08:48:11.717 に答える
0

上に書かれていることはすべて、おそらくVS2015では廃止されています。私の場合

 MessageBox(NULL, L"Test message", L"test title",  MB_YESNOCANCEL);

最初の引数が過剰であるため、機能しません。エラー出力は次のとおりです。

to many arguments in functional call.

私が書いた場合:

const int result = MessageBox( L"Test message", L"test title",  MB_YESNOCANCEL); //Without NULL

switch (result)
{
case IDYES:
    // Do something
    break;
case IDNO:
    // Do something
    break;
case IDCANCEL:
    // Do something
    break;
}

動作します!

于 2018-02-28T11:06:53.300 に答える