如何控制MessageBox的弹出位置

allenhiman 2005-12-31 08:27:33
由于某种需要,我不希望调用MessageBox的时候弹出的消息窗口在父窗口的正中,而是自己指定位置
要怎么办啊,
其实我就是想控制这个消息窗口,比如改改它的大小,风格等等
哪位大校能帮忙啊?
MessageBox("msg", "title", MB_OK);
...全文
2565 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenhiman 2006-01-04
  • 打赏
  • 举报
回复
感谢pomelowu(羽战士)
如果我不知道hook的用法
你能写的在具体点吗?比如我想创建一个在屏幕(0,0)位置弹出,大小为100*100的msgbox
要如何做啊?
我在你的代码上这样做,但大不到效果,可能是因为hwnd是null吧
那要怎样做呢?
switch(nCode)
{
case HCBT_ACTIVATE:
// customize the messagebox as your wish
SetWindowpos( hwnd, NULL, 0, 0, 100, 100, NULL );
return 0;
}
allenhiman 2006-01-04
  • 打赏
  • 举报
回复
多谢各位的参与
pomelowu 2005-12-31
  • 打赏
  • 举报
回复
There's no other way other than hooks.
If you install a CBT_HOOK, you only hook window
creation, activation etc (in other words, not many
messages). But, it's enough to do whatever customization
you want.


//
// MsgBoxEx - how to customize a standard message box
// Written by J Brown 2002
// Freeware
//
#include <windows.h>
#include <tchar.h>


TCHAR szContents[] = _T("A simple message box");
TCHAR szTitle[] = _T("Test");


HHOOK hMsgBoxHook;


LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
TCHAR ach[40];
HWND hwnd;
HWND hwndButton;


if(nCode < 0)
return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);


switch(nCode)
{
case HCBT_ACTIVATE:


// customize the messagebox as your wish

return 0;


}


return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);



}


int MsgBoxEx(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType)
{
int retval;

// Install a window hook, so we can intercept the message-box
// creation, and customize it
hMsgBoxHook = SetWindowsHookEx(
WH_CBT,
CBTProc,
NULL,
GetCurrentThreadId() // Only install for THIS thread!!!
);


// Display a standard message box
retval = MessageBox(hwnd, szText, szCaption, uType);


// remove the window hook
UnhookWindowsHookEx(hMsgBoxHook);


return retval;



}


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int
nShowCmd)
{
// Just display a standard message box.
// It doesn't matter that we have no parent window or a
// message-loop, because MessageBox has it's own message loop.

MsgBoxEx(NULL, szContents, szTitle, MB_OK | MB_ICONINFORMATION);


return 0;



}
vcmute 2005-12-31
  • 打赏
  • 举报
回复
hook WH_CBT

3.WH_CBT 钩子 (一般用于设定窗口位置和修改按钮文本)
a)设定窗口的位置(http://support.microsoft.com/default.aspx?scid=kb;en-us;180936)
HHOOK hHook;
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode == HCBT_ACTIVATE)
{
RECT rect;
GetWindowRect(hWnd, &rect);
MoveWindow((HWND)hWnd, 0, 0, rect.right-rect.left, rect.bottom-rect.top, TRUE);
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

使用方法
hHook = SetWindowsHookEx(WH_CBT, CBTProc, GetModuleHandle(NULL), 0);
MessageBox(NULL, "hello world!", "info", MB_OK);

http://community.csdn.net/Expert/topic/4194/4194156.xml?temp=.4313013
xuzheng318 2005-12-31
  • 打赏
  • 举报
回复

最好就自己重寫一個MessageBox, 又不是難, 用MFC可以直接插入, 用Win32API都只是:
BOOL CALLBACK MyMessageBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
MoveWindow(hDlg, x, y, width, height, TRUE);
break;
case WM_COMMAND:
EndDialog(hDlg, LOWORD(wParam));
}
return FALSE;
}
在WinMain中
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MESSAGEBOX), GetDesktopWindow(), MyMessageBoxProc);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧