如何指定MessageBox框的弹出位置 急

tulongdaozhu 2005-01-03 10:39:39
在一个基于一机双屏的程序中,MessageBox弹出老在两个屏幕中间位置,操作很不方便。我的问题是,如何固定MessageBox的弹出位置,如固定在左屏中心?请高手指教。
...全文
4540 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
EnochShen 2005-01-14
  • 打赏
  • 举报
回复
我把关于MessageBox的一系列的操作整理了一下:

DWORD WINAPI ThreadProc(LPVOID pParam)
{
while(TRUE)
{
HWND hWnd = ::FindWindow(NULL,"消息框标题");
if(hWnd != NULL)
{
//更改消息框按钮文字
//按钮的 ID
//MB_OKCANCEL: ID_OK = 1,IDCANCEL = 2
//MB_ABORTRETRYIGNORE: IDABORT = 3,IDRETRY = 4,IDIGNORE = 5
//MB_YESNO: IDYES = 6,IDNO = 7
//MB_OK: IDOK = 2
//MB_RETRYCANCEL: IDRETRY = 4,IDCANCEL = 2
//MB_YESNOCANCEL: IDYES = 6,IDNO = 7,IDCANCEL = 2
::SetDlgItemText(hWnd,2,"点我!");

//更改消息框图标
//注意:在创建消息框的时候只要要包含MB_ICONHAND...这样的属性,否则会失败。
HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
HWND hStatic = NULL;
hStatic = ::GetDlgItem(hWnd,20);
::SendMessage(hStatic, STM_SETICON, (WPARAM)hIcon, 0L);

//更改消息框位置
CRect rcMsgBox;
::GetWindowRect(hWnd,&rcMsgBox);
::MoveWindow(hWnd,150,150,rcMsgBox.Width(),rcMsgBox.Height(),TRUE);

return 0;
}
}

return 0;
}

void OnMessageBox()
{
CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
::MessageBox(NULL,"消息框文字。","消息框标题",MB_ICONINFORMATION|MB_OK);
}
weifirst118 2005-01-04
  • 打赏
  • 举报
回复
就解决问题而言理应自己写一个对话框。
要是做学问呢,就不要自己写。
Kudeet 2005-01-04
  • 打赏
  • 举报
回复
如何改变程序中弹出窗口的位置?
答】
使用WM_CBT钩子,安装钩子后,弹出一个窗口就会发出HCBT_ACTIVATE消息,然后就可以用SetWindowPos这个API函数来改变位置,
详细信息参考:
http://support.microsoft.com/default.aspx?scid=kb;en-us;180936
red-fly 2005-01-04
  • 打赏
  • 举报
回复
自己写个对话框类,最好了,以后还可以修改成自己想要的效果
uoyevoli 2005-01-04
  • 打赏
  • 举报
回复
引用:
有那么麻烦吗?直接用api messagebox,指定父窗口,他的位置总是基于父窗口的

呵呵
amziwei 2005-01-04
  • 打赏
  • 举报
回复
直接用api messagebox,指定父窗口,他的位置总是基于父窗口的

同意
kugou123 2005-01-03
  • 打赏
  • 举报
回复
自己写一个弹出窗口,动态创建
bobob 2005-01-03
  • 打赏
  • 举报
回复
有那么麻烦吗?直接用api messagebox,指定父窗口,他的位置总是基于父窗口的
EnochShen 2005-01-03
  • 打赏
  • 举报
回复
如果还有不明白的,发短信给我,我给你QQ号
EnochShen 2005-01-03
  • 打赏
  • 举报
回复
代码如下:

UINT ThreadProc( LPVOID pParam )
{
while(TRUE)
{
HWND hWnd = ::FindWindow(NULL,"caption");
if(hWnd != NULL)
{
CRect rcMsgBox;
::GetWindowRect(hWnd,&rcMsgBox);
::MoveWindow(hWnd,0,0,rcMsgBox.Width(),rcMsgBox.Height(),TRUE);

//这里可以作其他操作,比如窗口位置最前
return 0;
}
}
return 0;
}

void CMainFrame::OnTest55() //SDK也可以,替换MFC函数就可以了
{
CMainFrame* pMainFrame = new CMainFrame;
AfxBeginThread(ThreadProc,NULL);
pMainFrame->MessageBox("text","caption");
}
HunterForPig 2005-01-03
  • 打赏
  • 举报
回复
自己写个对话框吧!
EnochShen 2005-01-03
  • 打赏
  • 举报
回复
呵呵,用无模式的MessageBox,然后MoveWindow
krosjean 2005-01-03
  • 打赏
  • 举报
回复
DIY
老夏Max 2005-01-03
  • 打赏
  • 举报
回复
自己写的MessageBox就可以控制它的位置了,让它处于系统的最上层,在OnPaint中添加:
SetWindowPos( &wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
在Dialogl类的OnInitDialog函数的最后添加处理代码,让其显示在屏幕的中间,如:
CRect rcWindow;
GetWindowRect(&rcWindow);
int xSize = ::GetSystemMetrics (SM_CXSCREEN);
int ySize = ::GetSystemMetrics (SM_CYSCREEN);

int Width = rcWindow.Width();
int Height = rcWindow.Height();

rcWindow.left = (xSize- Width)/2;
rcWindow.right = rcWindow.left + Width;

rcWindow.top = (ySize - Height)/2;
rcWindow.bottom = rcWindow.top + Height;

MoveWindow(&rcWindow);

老夏Max 2005-01-03
  • 打赏
  • 举报
回复
很难吧,好像以前有人问过没有解决!
最好能自己写一个类似MessageBox的类,很简单的,放置一些按钮,然后做一些处理,呵呵,花不了多少时间的,至于返回值你也可以使用原MessageBox的返回值。呵呵,如:IDOK等等。
oyljerry 2005-01-03
  • 打赏
  • 举报
回复
自己弹出一个对话框,然后设置位置

15,980

社区成员

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

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