我想制作一个自定义消息框。我想要自定义的是按钮的文本。
MessageBoxW(
NULL,
L"Target folder already exists. Do you want to overwrite the folder?",
L"No title",
MB_YESNOCANCEL | MB_ICONQUESTION
);
我想将按钮文字更改为Overwrite
,Skip
,Cancel
。
什么是最简单的方法?
我必须使其与Windows默认消息框具有相同的外观。
答案 0 :(得分:7)
正如其他人所说,一种典型的方法是创建一个对话框资源并拥有一个完全独立的对话框,您需要以看起来像标准对话框的方式设计GUI(以满足您的感觉和外观请求)。如果您想接受短信,可能需要添加适当调整窗口大小的代码。
不过,对于那些想要深入了解高级事物的人来说,还有另一种选择。虽然MessageBox
API不能为fint调整提供太多帮助,但您手中仍然有SetWindowsHookEx
。注册了钩子后,您可以截取标准MessageBox
窗口过程并按照您喜欢的方式对其进行子类化。
典型的事情包括:
挂钩标准窗口可以完成所有这些。
UPD。嘿,我意识到我有一些代码与SetWindowsHookEx
分享:http://alax.info/blog/127
答案 1 :(得分:2)
您可以创建自己的对话框。或者您可以使用in this article所述的窗口挂钩。
答案 2 :(得分:1)
创建一个对话框资源(使用GUI编辑器或手动编写)并在其上调用DialogBox
。除了其论点所支持的行为之外,没有办法改变MessageBox
行为。
也就是说,您的留言框可以很好地使用库存是/否选项。
答案 3 :(得分:1)
Here是一个小型开放源代码库,可让您自定义消息框。由Hans Ditrich开发。
我已经在另一个POC中成功使用了它,它甚至可以从embedding a custom icon in such MessageBox调用Console application。
我也应该指向Task Dialog。这是一个使用它的示例:
int nButtonPressed = 0;
TaskDialog(NULL, hInst,
MAKEINTRESOURCE(IDS_APPLICATION_TITLE),
MAKEINTRESOURCE(IDS_DOSOMETHING),
MAKEINTRESOURCE(IDS_SOMECONTENT),
TDCBF_OK_BUTTON | TDCBF_CANCEL_BUTTON,
TD_WARNING_ICON,
&nButtonPressed);
if (IDOK == nButtonPressed)
{
// OK button pressed
}
else if (IDCANCEL == nButtonPressed)
{
// Cancel pressed
}
答案 4 :(得分:1)
我知道这个问题很老,但我现在才偶然发现。
我想扩展有关使用 TaskDialog
而不是 MessageBox
的其他答案。这是一个使用 TaskDialog 精确完成要求的简明示例; 更改按钮的文本:
const TASKDIALOG_BUTTON buttons[] = { {IDYES, L"Overwrite"}, {IDNO, L"Skip"}, {IDCANCEL, L"Cancel"} };
TASKDIALOGCONFIG taskDialogConfig = {
.cbSize = sizeof(TASKDIALOGCONFIG),
.pszMainIcon = TD_WARNING_ICON, // TaskDialog does not support a question icon; see below
.pButtons = buttons,
.cButtons = ARRAYSIZE(buttons),
.pszWindowTitle = L"No title",
.pszContent = L"Target folder already exists. Do you want to overwrite the folder?"
};
TaskDialogIndirect(&taskDialogConfig, NULL, NULL, NULL);
一些值得注意的事情:
TaskDialogIndirect
,而不是基本的 TaskDialog
函数pszMainIcon
中指定的图标也会显示在标题栏中MB_ICONQUESTION
,引用来自 this forumpost 的引用:Don't use the question mark icon to ask questions. Again, use the question mark icon only for Help entry points. There is no need to ask questions using the question mark icon anyway—it's sufficient to present a main instruction as a question.
TaskDialogIndirect
的第二个参数并在返回时检查其值(documentation 应该很清楚)来检查选择了哪个按钮。立>
答案 5 :(得分:0)
Vista中引入的task dialog功能完全符合您的要求,并遵循当前的系统主题。但是,如果你必须支持XP,那么这对你来说不太舒服。