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);

但是将“确定”和“取消”硬编码为按钮标题,这不是我想要的。有什么办法可以解决这个问题,或者可以使用替代功能吗?

4

3 回答 3

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 回答
4

Windows MessageBox 函数仅支持有限数量的样式。如果您想要比所提供的更复杂的东西,您需要创建自己的对话框。有关可能的 MessageBox 类型的列表,请参阅MessageBox

如果您决定制作自己的对话框,我建议您查看DialogBox Windows 功能。

于 2009-12-11T01:50:41.243 回答
1

如果您愿意将自己绑定到 Windows Vista 及更高版本,您可能需要考虑“ TaskDialog ”功能。我相信它会让你做你想做的事。

于 2009-12-11T02:26:17.627 回答