使用的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);

但硬编码“确定”和“取消”的按钮标题,这不是我想要的。有任何方法解决这个问题,或者使用替代的功能?

有帮助吗?

解决方案

可以使用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 );
}

其他提示

在视窗MessageBox函数只支持的样式的数量有限。如果你想什么更复杂,商提供的是什么,你需要创建自己的对话框。请参见的MessageBox 可能的消息框列表类型。

如果您决定做自己的对话框,我建议看的对话框视窗函数。

如果你愿意自己绑到Windows Vista或以上,你可能要考虑“的 TaskDialog其实” 功能。我相信,它可以让你做你想要做什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top