100分求消息提示窗口
本人根据网上的一些资料写了一个消息提示窗口,但是一直不太理想,
主要存在以下两个问题
1:有些时候不能自动弹出
2:当前正在使用的对话框会在提示窗口弹出时失去焦点
请高手给出相关改正指示,感激++高分 奖励
问题点数:100、回复次数:28Top
1 楼WecanHuang(曾阿牛)回复于 2005-08-18 09:27:17 得分 0
AfxMessageBox()没有这种情况吧Top
2 楼teli_eurydice(哭泣的仙人掌。。。。)回复于 2005-08-18 09:31:37 得分 0
AfxMessageBox()Top
3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-08-18 09:31:40 得分 0
代码?
MesasgeBox/AfxMessageBox?Top
4 楼legendhui(秋天的叶子)回复于 2005-08-18 09:35:50 得分 0
不能自动弹出,跟踪看看你的弹出条件是否满足
Top
5 楼bohut(●伯虎● )回复于 2005-08-18 09:36:36 得分 0
是否是类似于msn的消息提示窗口?Top
6 楼happyparrot(快乐鹦鹉)回复于 2005-08-18 09:42:24 得分 0
楼主是要tooltip效果吧?楼上的怎么都说是MessageBox呢?Top
7 楼skyrakehell(天涯浪子)回复于 2005-08-18 09:42:25 得分 0
对呀,就是像msn一样的,要位于所有窗口的最前列显示,并且不影响当前的输入工作就好Top
8 楼skyrakehell(天涯浪子)回复于 2005-08-18 09:47:07 得分 0
好像要用到顶层窗口中的一些技术,但是不知道怎么处理,才不让现有的正在输入窗口失去焦点Top
9 楼lixiaosan(小三)回复于 2005-08-18 09:48:07 得分 0
呵呵。。。被一楼的影响了,
应该说的是tooltip
网上关于tooltip的资料太多了。。Top
10 楼hejiwangbaggio()回复于 2005-08-18 09:49:16 得分 0
把他设成当前窗口的子窗口行不?
你说的就是tooltip吧?Top
11 楼skyrakehell(天涯浪子)回复于 2005-08-18 09:53:10 得分 0
有点像 tooltip的效果吧,但是最好要过到类似 msn 提示那样的效果,就以控制关闭,有事件响应处理的,
一些现有的代码如下
#define ID_TIMER_POP_WINDOW10
#define ID_TIMER_CLOSE_WINDOW11
#define ID_TIMER_DISPLAY_DELAY12
#define WIN_WIDTH181
#define WIN_HEIGHT116
// CMsgWnd
CMsgWnd::CMsgWnd()
{
m_Bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_SHOWMSG)); //Load Bitmap
m_Bitmap.GetBitmap(&bmBitmap); //Get Bitmap Info
m_bFlag=false;
m_strMessage="消息提示";
m_strCaption="提示文字";
}
void CMsgWnd::CreateMsgWindow()
{CreateEx(0,
AfxRegisterWndClass(
0,
::LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_HAND_1)),(HBRUSH)(COLOR_DESKTOP+1),NULL),
"",
WS_POPUP|WS_EX_TOPMOST|WS_TABSTOP,
0,
0,
0,//bmBitmap.bmWidth, //Bitmap Width = Splash Window Width
0,//bmBitmap.bmHeight, //Bitmap Height = Splash Window Height
NULL,//AfxGetMainWnd()->GetSafeHwnd(),
NULL,
NULL);
SetTimer(ID_TIMER_POP_WINDOW,2,NULL);
}
void CMsgWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC dcMemory;
CRect rect;
GetClientRect(&rect);
dcMemory.CreateCompatibleDC(NULL);
dcMemory.SelectObject(&m_Bitmap);
dc.StretchBlt(0,
0,
rect.right-rect.left,//bmBitmap.bmWidth,
rect.bottom-rect.top,//bmBitmap.bmHeight,
&dcMemory,
0,
0,
bmBitmap.bmWidth,
bmBitmap.bmHeight,
SRCCOPY);
CFont font;
font.CreatePointFont(90,"Impact");
dc.SelectObject(&font);
dc.SetTextColor(RGB(0,64,128));
dc.SetBkMode(TRANSPARENT);
dc.TextOut(30,10,m_strCaption);
rect.top=30;
dc.DrawText(m_strMessage,-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
// Do not call CWnd::OnPaint() for painting messages
}
void CMsgWnd::OnTimer(UINT nIDEvent)
{
static int nHeight=0;
int cy=GetSystemMetrics(SM_CYSCREEN);
int cx=GetSystemMetrics(SM_CXSCREEN);
RECT rect;
SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
int y=rect.bottom-rect.top;
int x=rect.right-rect.left;
x=x-WIN_WIDTH;
switch(nIDEvent)
{
case ID_TIMER_POP_WINDOW:
if(nHeight<=WIN_HEIGHT)
{
++nHeight; //连续增加两次,以加快上声速度
++nHeight;
++nHeight;
++nHeight;
MoveWindow(x,
y-nHeight,
WIN_WIDTH,
WIN_HEIGHT);
Invalidate(FALSE);
}
else
{
KillTimer(ID_TIMER_POP_WINDOW);
SetTimer(ID_TIMER_DISPLAY_DELAY,5000,NULL);
}
break;
case ID_TIMER_CLOSE_WINDOW:
if(nHeight>=0)
{
nHeight--; //连续递减两次,以加快下降速度
nHeight--;
MoveWindow(x,
y-nHeight,
WIN_WIDTH,
nHeight);
}
else
{
KillTimer(ID_TIMER_CLOSE_WINDOW);
SendMessage(WM_CLOSE);
}
break;
case ID_TIMER_DISPLAY_DELAY:
KillTimer(ID_TIMER_DISPLAY_DELAY);
SetTimer(ID_TIMER_CLOSE_WINDOW,2,NULL);
break;
}
CWnd::OnTimer(nIDEvent);
}
int CMsgWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
AnimateWindow(GetSafeHwnd(),1000,AW_CENTER|AW_VER_NEGATIVE);
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
BringWindowToTop();
return 0;
}
void CMsgWnd::OnKillFocus(CWnd* pNewWnd)
{
CWnd::OnKillFocus(pNewWnd);
if(m_bFlag)
SetTimer(ID_TIMER_DISPLAY_DELAY,3000,NULL);
// TODO: Add your message handler code here
}
Top
12 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-18 09:53:22 得分 0
设置WS_EX_TOOLWINDOW扩展风格,另外ShowWindow时用SW_SHOWNOACTIVATE和SW_SHOWNA。Top
13 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:03:24 得分 0
急呀,还是会被失去焦点,每当这个提示窗口一弹出时就失去原来的焦点了,
我该怎么办?Top
14 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-18 11:17:37 得分 0
提示窗口弹出的代码Top
15 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:33:38 得分 0
CMsgWnd *pMsgWindow1=new CMsgWnd;
CMsgWnd& msgWindow1=*pMsgWindow1;
msgWindow1.SetPromptCaption("秘书消息提示");
msgWindow1.SetPrompt("你有新的事务");
msgWindow1.CreateMsgWindow();
msgWindow1.ShowWindow(SW_SHOWNOACTIVATE);
msgWindow1.ShowWindow(SW_SHOWNA);
msgWindow1.UpdateWindow();Top
16 楼hejiwangbaggio()回复于 2005-08-18 11:33:46 得分 0
我这有个示例源代码!
要不?Top
17 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:34:24 得分 0
CMsgWnd *pMsgWindow1=new CMsgWnd;
CMsgWnd& msgWindow1=*pMsgWindow1;
msgWindow1.SetPromptCaption("秘书消息提示");
msgWindow1.SetPrompt("你有新的事务");
msgWindow1.CreateMsgWindow();
msgWindow1.ShowWindow(SW_SHOWNOACTIVATE);
msgWindow1.ShowWindow(SW_SHOWNA);
msgWindow1.UpdateWindow();Top
18 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:35:29 得分 0
to --> hejiwangbaggio()
你有用过吗?
能否正常使用?Top
19 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-08-18 11:38:28 得分 0
http://www.vckbase.com/document/finddoc.asp?keyword=msnTop
20 楼hejiwangbaggio()回复于 2005-08-18 11:39:36 得分 0
呵呵,可以正常使用啊!Top
21 楼skyrakehell(天涯浪子)回复于 2005-08-18 11:48:44 得分 0
好呀,发给我看看,
有什么方法能解决。
我的Email为skyrakehell@126.comTop
22 楼hejiwangbaggio()回复于 2005-08-18 11:59:16 得分 0
好,这就发给你!
收到后给我回复一个!Top
23 楼skyrakehell(天涯浪子)回复于 2005-08-18 13:51:47 得分 0
上班时收到了,这完全就是一个 tooltip 的例子嘛,我看看能不能改造先!Top
24 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-08-18 14:00:18 得分 0
http://www.codeproject.com/dialog/statusbarmsgwnd.aspTop
25 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-18 14:07:39 得分 0
估计是你在
msgWindow1.CreateMsgWindow();
已经把窗口Show出来了,看看你的窗口是否选了WS_VISIBLE去掉
Top
26 楼skyrakehell(天涯浪子)回复于 2005-08-18 14:36:14 得分 0
我要的是个要qq、msn那样的上线提示效果的类,如果有的就发给我呀,收到马上给分,不够可以再加!Top
27 楼hyg2008(蓝色雨)回复于 2005-08-18 16:15:31 得分 0
markTop
28 楼nanjian011()回复于 2005-08-22 15:11:20 得分 100
我有方法,发到你的e-mail去了Top




