我用的方法是在WndProc中响应鼠标事件WM_MOUSEMOVE:case WM_MOUSEMOVE:
//<---------------------------------------------------------------->
//追踪鼠标事件 TRACKMOUSEEVENT eventTrack;
eventTrack.cbSize = sizeof(eventTrack);
eventTrack.dwFlags = TME_HOVER | TME_LEAVE;
eventTrack.dwHoverTime = 20; //20ms
eventTrack.hwndTrack = hWnd;
if (TrackMouseEvent(&eventTrack))
{
return FALSE;
} //<---------------------------------------------------------------->
break;
然后响应WM_MOUSEHOVER:
case WM_MOUSEHOVER:
{
POINTS curPoint = MAKEPOINTS(lParam);
POINT  cPoint;
cPoint.x = curPoint.x;
cPoint.y = curPoint.y;
//cPoint.x = 40;
//cPoint.y = 40; HWND currHwnd = WindowFromPoint(cPoint);
if (currHwnd == btnHwd[0])
{
HBITMAP b1bmp = (HBITMAP)LoadImage(0,"Nav_NNN.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
HDC srcHDC =  CreateCompatibleDC(NULL);
SelectObject(srcHDC,b1bmp);
GetObject(b1bmp,sizeof(BITMAP),&bmp);
BitBlt(GetDC(currHwnd), 0, 0, bmp.bmWidth, bmp.bmHeight, srcHDC, 0, 0, SRCCOPY);
//<--------------------------------------------->
//SetBkMode(GetDC(currHwnd), TRANSPARENT);
//<--------------------------------------------->
//设置字体
LOGFONT lf;
HFONT h_font;
memset(&lf,0,sizeof(lf));
lf.lfHeight = 14;
lf.lfCharSet = DEFAULT_CHARSET;
strcpy(lf.lfFaceName,"仿宋_GB2312");
h_font = CreateFontIndirect(&lf);
SelectObject(GetDC(currHwnd), h_font);
//<--------------------------------------------->
SetTextColor (GetDC(currHwnd), RGB(0x00, 0x00, 0xAF));
TextOut(GetDC(currHwnd), 4, 12, "菜单", 8);
DeleteDC(srcHDC);
}
return 0;
}
break;结果WindowFromPoint好像无法得到鼠标所在控件的句柄,
最后我强制的给了一个坐标值,
这一次是找到了控件了
结果背景图片是输出来了
但是输出的字体根本不是我想要的字体……现在请诸位看一下问题处在那里
请指点一二

解决方案 »

  1.   

    结果WindowFromPoint好像无法得到鼠标所在控件的句柄,
    ==========
    你调用ScreentoClient把point转换一下呢?如果是自己的进程中,你不需用WindowFromPoint函数呀.
      

  2.   

    但是输出的字体根本不是我想要的字体……
    ========
    字体你可以换另一种方法创建来试一下呀.如:m_Font.cratepointfont(100", "宋体");
    SelectObject(GetDC(currHwnd), HGDIOBJ(m_font.GetSafeHandle());
      

  3.   

    响应PreTranslateMessage消息。
    判断pMsg是否是WM_MOUSEMOVE消息。
    获得当前鼠标在屏幕的坐标   ::GetCursorPos(&point);
    转为客户区坐标   ::ScreenToClient(this->m_hWnd,&point);
    判断当前坐标上的控件   hwnd=::ChildWindowFromPoint(this->m_hWnd,point);
    如果是你想要显示其他图片的控件那么就执行转化成另外一张图片的操作
      

  4.   

    结果WindowFromPoint好像无法得到鼠标所在控件的句柄,
    ==========
    你调用ScreentoClient把point转换一下呢?如果是自己的进程中,你不需用WindowFromPoint函数呀.
    -----------------------------------------------------------------------------我对MFC\SDK也不熟悉呀
    以前从来都没有碰过相关的东西
    主要是要做一个东西
    才硬着头皮看的
    于是逮着一个可能的函数
    看了一下子SDK文档
    觉得可行
    就开始了
    最后发现有问题了
    就上来提问了……
      

  5.   

    这里我用的全部是SDK
    没用过MFC诸位用MFC给出的解释
    我都是查了文档
    再写出相应的方法的还是不行
    估计是我的程序结构有问题不知道诸位有没有类似的例子
    如果有的话
    给我一个
    不胜感激