0

CoreFoundationを使用して、次のアラートダイアログを表示できます。

CFUserNotificationDisplayAlert(0.0, 
                               kCFUserNotificationPlainAlertLevel, 
                               NULL, NULL, NULL, 
                               CFSTR("Alert title"), 
                               CFSTR("Yes?), 
                               CFSTR("Affirmative"), 
                               CFSTR("Nah"), 
                               NULL, NULL);

Windows C APIを使用してこれを複製するにはどうすればよいですか?私が得た最も近いものは次のとおりです。

MessageBox(NULL, "Yes?", "Alert title", MB_OKCANCEL);

しかし、それはボタンのタイトルとして「OK」と「キャンセル」をハードコードします。これは私が望むものではありません。これを回避する方法、または使用する代替関数はありますか?

4

3 に答える 3

4

Windows MessageBox関数は、限られた数のスタイルのみをサポートします。提供されているものよりも複雑なものが必要な場合は、独自のダイアログボックスを作成する必要があります。可能なMessageBoxタイプのリストについては、MessageBoxを参照してください。

独自のダイアログボックスを作成する場合は、DialogBoxのWindows関数を確認することをお勧めします。

于 2009-12-11T01:50:41.243 に答える
4

SetWindowTextを使用して、ボタンの凡例を変更できます。MessageBox()は実行の流れをブロックするため、これを回避するための何らかのメカニズムが必要です。以下のコードはタイマーを使用しています。

FindWindowコードは、MessageBox()の親がないことに依存している可能性があると思いますが、よくわかりません。

int CustomMessageBox(HWND hwnd, const char * szText, const char * szCaption, int nButtons)
{
    SetTimer( NULL, 123, 0, TimerProc );
    return MessageBox( hwnd, szText, szCaption, nButtons );
}

VOID CALLBACK TimerProc(      
    HWND hwnd,
    UINT uMsg,
    UINT_PTR idEvent,
    DWORD dwTime
)
{
    KillTimer( hwnd, idEvent );
    HWND hwndAlert;
    hwndAlert = FindWindow( NULL, "Alert title" ); 
    HWND hwndButton;
    hwndButton = GetWindow( hwndAlert, GW_CHILD );
    do
    {
        char szBuffer[512];
        GetWindowText( hwndButton, szBuffer, sizeof szBuffer );
        if ( strcmp( szBuffer, "OK" ) == 0 )
        {
            SetWindowText( hwndButton, "Affirmative" );
        }
        else if ( strcmp( szBuffer, "Cancel" ) == 0 )
        {
            SetWindowText( hwndButton, "Hah" );
        }
    } while ( (hwndButton = GetWindow( hwndButton, GW_HWNDNEXT )) != NULL );
}
于 2009-12-18T15:03:35.007 に答える
1

Windows Vista以降に接続する場合は、「TaskDialog」関数を検討することをお勧めします。私はそれがあなたがあなたが望むことをすることを可能にするだろうと信じています。

于 2009-12-11T02:26:17.627 に答える