实现 1、鼠标放图片上 显示文字 2、该图片可以动态加载

时间:2022-02-08 20:24:07
我想要实现的功能是
界面上有张位图,把鼠标放在上面,会给出一段文字。并且该图片是可以动态加载的,就是我点某个按钮,该图片会被改变。

2个功能分开做可以成功,和在一起就出错了

我弄了个按钮,用来初始化界面上的图片控件,点它之后,图片控件会显示一张图片,然后,还有其他类似的控件,可以改变图片
CBitmap bitmap;  // CBitmap对象,用于加载位图   
HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
bitmap.LoadBitmap(IDB_101_2);  // 将位图IDB_BITMAP1加载到bitmap   
 hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
 m_101.SetBitmap(hBmp);    // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1 



然后,网上搜索了将鼠标放在图片上,会有文字说明的代码。我分开做可以成功,和在一起运行报错

1、CDlg**头文件中声明成员变量
CToolTipCtrl m_tooltip;

2、CDlg***::OnInitDialog() 中创建并设置参数
m_tooltip.Create(this);

//CToolTipCtrl与控件关联
m_tooltip.AddTool(GetDlgItem(IDC_EDIT_A), TTS_ALWAYSTIP);//当鼠标指向IDC_EDIT_A控件显示提示
//若如是句柄可以用FromHandle(hwnd)替换 GetDlgItem(IDC_EDIT_A)

//文字颜色
m_tooltip.SetTipTextColor(RGB(0,0,255));

//鼠标指向多久后显示提示,毫秒
m_tooltip.SetDelayTime(TTDT_INITIAL, 10); 

//鼠标保持指向,提示显示多久,毫秒
m_tooltip.SetDelayTime(TTDT_AUTOPOP, 30000); 

//设定显示宽度,超长内容自动换行
m_tooltip.SetMaxTipWidth(200);

3、重写PreTranslateMessage,增加以下内容:
if(m_tooltip.m_hWnd!=NULL) 
{
 m_tooltip.RelayEvent(pMsg);
}

9 个解决方案

#1


我想知道,该怎么改,或者有更好的方法

#2


图片和文字的显示都放在OnDraw函数里面。设置两个标记表示图片是否存在,以及鼠标是否在图片上。然后在单击按钮的时候,改变这些标记值,然后InvalidateRect( ),它就会刷新显示。

#3


引用 2 楼 shb8845369 的回复:
图片和文字的显示都放在OnDraw函数里面。设置两个标记表示图片是否存在,以及鼠标是否在图片上。然后在单击按钮的时候,改变这些标记值,然后InvalidateRect( ),它就会刷新显示。


能否给下代码,或例子  。
刚接触,目前只能达到改别人代码、看别人代码的水平。。。。。。谢谢

#4


感觉也没哪里错,异常在什么地方了

#5


头文件声明两个标记值
CBitmap  m_bitmap;   //保存位图
BOOL  m_bitmapExist;  //判断是否图片存在
BOOL  m_pointInBitmap; // 光标是否移入图片控件上

实现文件中
在构造函数中对上述成员变量初始化
在单击按钮响应时间中,重新给m_bitmap赋值然后::InvalidateRect(m_hwndBitmapControl,NULL,TRUE);图片就要 改变了;
重载图片控件的WndProc消息处理函数,在里面对WM_Paint消息进行处理,(也就是所谓的OnDraw了,可以这么理解~)
void CBitmapControl::WndProc(HWNd hwnd, MSG msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
   {
       case WM_PAINT:
         {
               if(m_bitmapExist)
                {
                   //加载位图
                }
              if(m_pointInBitmap)
               {
                  // 显示文字
              }
             break;
          }
   }
}

我只能帮到这了。

#6


跳转到这里界面就出错,
我猜测是
我猜测是这里,

2、CDlg***::OnInitDialog() 中创建并设置参数
3、重写PreTranslateMessage,增加以下内容:
if(m_tooltip.m_hWnd!=NULL) 
{
 m_tooltip.RelayEvent(pMsg);
}

因为我把对图片的显示写在一个按钮控件中,是不是因为 运行上面OnInitDialog()  PreTranslateMessage()的时候,我的图片还没出现,就是顺序颠倒了,,,

引用 4 楼 fishion 的回复:
感觉也没哪里错,异常在什么地方了

#7


图片控件属性那里添加一个notify属性看看。还有就是出错的地方是哪里?

#8


引用 7 楼 fishion 的回复:
图片控件属性那里添加一个notify属性看看。还有就是出错的地方是哪里?


之前就有设置那个属性了。现在已经解决了,在这里

BOOL  WORKERS::OnInitDialog(){

CDialog::OnInitDialog();//之前没有加这句话


EnableToolTips(TRUE);
 m_ttc.Create(this);
 m_ttc.Activate(TRUE);
 CWnd* pw = GetDlgItem(IDC_STATIC_101);
m_ttc.SetDelayTime(TTDT_INITIAL, 10); 
 
 m_ttc.SetMaxTipWidth(5000);
 m_ttc.AddTool(pw,_T("价格:100 元/天\n类型:标准房"));



return true;
}

#9


问题已经解决,谢谢各位

#1


我想知道,该怎么改,或者有更好的方法

#2


图片和文字的显示都放在OnDraw函数里面。设置两个标记表示图片是否存在,以及鼠标是否在图片上。然后在单击按钮的时候,改变这些标记值,然后InvalidateRect( ),它就会刷新显示。

#3


引用 2 楼 shb8845369 的回复:
图片和文字的显示都放在OnDraw函数里面。设置两个标记表示图片是否存在,以及鼠标是否在图片上。然后在单击按钮的时候,改变这些标记值,然后InvalidateRect( ),它就会刷新显示。


能否给下代码,或例子  。
刚接触,目前只能达到改别人代码、看别人代码的水平。。。。。。谢谢

#4


感觉也没哪里错,异常在什么地方了

#5


头文件声明两个标记值
CBitmap  m_bitmap;   //保存位图
BOOL  m_bitmapExist;  //判断是否图片存在
BOOL  m_pointInBitmap; // 光标是否移入图片控件上

实现文件中
在构造函数中对上述成员变量初始化
在单击按钮响应时间中,重新给m_bitmap赋值然后::InvalidateRect(m_hwndBitmapControl,NULL,TRUE);图片就要 改变了;
重载图片控件的WndProc消息处理函数,在里面对WM_Paint消息进行处理,(也就是所谓的OnDraw了,可以这么理解~)
void CBitmapControl::WndProc(HWNd hwnd, MSG msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
   {
       case WM_PAINT:
         {
               if(m_bitmapExist)
                {
                   //加载位图
                }
              if(m_pointInBitmap)
               {
                  // 显示文字
              }
             break;
          }
   }
}

我只能帮到这了。

#6


跳转到这里界面就出错,
我猜测是
我猜测是这里,

2、CDlg***::OnInitDialog() 中创建并设置参数
3、重写PreTranslateMessage,增加以下内容:
if(m_tooltip.m_hWnd!=NULL) 
{
 m_tooltip.RelayEvent(pMsg);
}

因为我把对图片的显示写在一个按钮控件中,是不是因为 运行上面OnInitDialog()  PreTranslateMessage()的时候,我的图片还没出现,就是顺序颠倒了,,,

引用 4 楼 fishion 的回复:
感觉也没哪里错,异常在什么地方了

#7


图片控件属性那里添加一个notify属性看看。还有就是出错的地方是哪里?

#8


引用 7 楼 fishion 的回复:
图片控件属性那里添加一个notify属性看看。还有就是出错的地方是哪里?


之前就有设置那个属性了。现在已经解决了,在这里

BOOL  WORKERS::OnInitDialog(){

CDialog::OnInitDialog();//之前没有加这句话


EnableToolTips(TRUE);
 m_ttc.Create(this);
 m_ttc.Activate(TRUE);
 CWnd* pw = GetDlgItem(IDC_STATIC_101);
m_ttc.SetDelayTime(TTDT_INITIAL, 10); 
 
 m_ttc.SetMaxTipWidth(5000);
 m_ttc.AddTool(pw,_T("价格:100 元/天\n类型:标准房"));



return true;
}

#9


问题已经解决,谢谢各位