WIN32SDK自绘Tooltip

这篇博客介绍了如何在WIN32SDK中实现自绘Tooltip,支持混合文字和图片,可配置字体颜色、字体样式及背景色。文章提供了一张效果图,并提供了详细的源码,包括tipinfo.class.h, tooltip.class.cpp, tooltip.class.h等文件,注释清晰。" 130711904,15557416,C语言实现动态内存管理的通讯录,"['C语言', '内存管理', '数据结构']
摘要由CSDN通过智能技术生成

WIN32SDK自绘Tooltip


支持文字和图片穿插,可设置位,置字体颜色,字体,背景色


效果图:


用法你懂的。

看源码吧,注释里写的很清楚:

函数Polygon(...)使用参数轮廓点示意图

******************************************************************************************

tipinfo.class.h文件

******************************************************************************************

//
// 信息提示类--cTooltip
//
#pragma once
#include "stdafx.h"
#include "main.h"


// 提示信息数据类型
#define TIPINFO_DATATYPE_TXT	0
#define TIPINFO_DATATYPE_BMP	1


/*
* 数据原型
*/
class INFODATA{
public:
	INFODATA(unsigned dataid) :m_dataid(dataid) {}
	virtual int getid() = 0;

	// 友元声明
	friend bool operator == (const INFODATA&, const INFODATA&);
	friend bool operator != (const INFODATA&, const INFODATA&);
protected:
	// 数据类型
	// 0: bmp
	// 1: txt
	unsigned m_dataid;
};

/*
* INFODATA 的 == 重载
*/
inline bool operator == (const INFODATA &a, const INFODATA &b) 
{ return a.m_dataid == b.m_dataid; }

/*
* INFODATA 的 != 重载
*/
inline bool operator != (const INFODATA &a, const INFODATA &b)
{ return a.m_dataid != b.m_dataid; }


/*
* 图像提示信息
*/
class INFOBMP :public INFODATA {
public:
	struct BMPDATA{
		HBITMAP bmp;
		int destw, desth;
		int srcw, srch;
	};
public:
	/*
	* @bmp: 位图句柄
	* @destw: 希望图像显示的宽度
	* @desth: 希望图像显示的高度
	* @srcw: 原始宽度
	* @srch: 原始高度
	* 注意:如果 w 或 h 一者为0将显示为一个字体方块哦尺寸(和一个汉字一样大小)
	*/
	INFOBMP(HBITMAP bmp, int destw = 0, int desth = 0, int srcw = 0, int srch = 0)
		:INFODATA(TIPINFO_DATATYPE_BMP), m_bmp(BMPDATA{ bmp, destw, desth , srcw, srch})
	{}
public:
	int getid() { return m_dataid; }		// 返回数据类型
	BMPDATA getbmp() { return m_bmp; }			// 返回数据

	BMPDATA m_bmp;	// 图像数据
};

/*
* 文本提示信息
*/
class INFOTXT :public INFODATA {
public:
	INFOTXT(char* txt)
		:INFODATA(TIPINFO_DATATYPE_TXT)
		, m_txt(txt)
	{
		m_size = strlen(txt);
	}
public:
	int getid() { return m_dataid; }		// 返回数据类型

	char* m_txt;	// 文本数据
	int m_size;
};

/*
* 提示信息
* vector<INFODATA*>的数组
* 为了断行方便每行数据(图片,文本)放到同一个数组vector<INFODATA*>之中
*/
struct TIPINFO{
public:
	vector<vector<INFODATA*>> m_infos;
};

******************************************************************************************
tooltip.class.cpp文件

******************************************************************************************

//
// 信息数据类--cTooltip
//
#include "stdafx.h"
#include "main.h"
#include "tipinfo.class.h"



******************************************************************************************
tooltip.class.h文件

******************************************************************************************

//
// 信息提示类--cTooltip
// 
// <cTooltip class>
// 提示信息类,通过气泡形状圆角窗口显示包括文本和图片的提示信息
// 
// <总览>
// 方法:bool lock() 锁定提示信息(只有提示信息锁定之后下列所有函数的操作才会有效)
//		 当前类调用 lock 会将会将上一个调用过lock函数的提示信息类改变为未锁定状态,
//		 即:同一时刻只能有一个提示信息类处于锁定状态
// 方法:bool unlock() 解锁提示信息
// 方法:bool settipinfo(TIPINFO tipinfo) 设置提示信息的内容
// 方法:bool setshowposition(unsigned sp) 设置提示信息窗口相对于"父窗口(注释1)"的
//		 相对位置,避免遮挡或提示信息窗口显示在桌面以外的位置。
// 方法:bool setshowposition(POINT ltanchor)  指定锚点坐标
// 方法:bool showtip(HWND hparent, bool isshow) 显示或者隐藏提示信息窗口
// 方法:bool setbkcolor(COLORREF color) 设置背景颜色,默认为RGB(45. 45, 45)
// 方法:bool settxtcolor(COLORREF color) 设置字体颜色,默认为RGB(150, 150, 150)
// 方法:bool setoutlinecolor(COLORREF color) 设置轮廓颜色
// 方法:bool setfont(HFONT font) 设置字体,默认使用CreateFont(12, 6, 0, 0, 500, 
//		 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, "新宋体")参数
//
// 效果示例:
//
#pragma once
#include "stdafx.h"
#include "main.h"
#include "tipinfo.class.h"

#pragma region 自定义消息
// 锁定提示信息
// @wparam: cTooltip指针
#define WMAPP_TT_LOCK			(WM_APP + 2)

// 解锁
#define WMAPP_TT_UUNLOCK		(WM_APP + 3)

// 显示隐藏 tooltip 消息
#define WMAPP_TT_SHOW			(WM_APP + 4)
#define WMAPP_TT_HIDE			(WM_APP + 5)
#pragma endregion 自定义消息

// 显示位置宏
#define SP_LEFT		0		// 左
#define SP_RIGHT	1		// 右
#define SP_TOP		2		// 上
#define SP_BOTTOM	3		// 下


/*
* 信息提示类
*/
class cTooltip{
public:
	cTooltip(TIPINFO tipinfo, HWND hparent);
	~cTooltip() { this->__release(); }
public:
	bool lock();									// 锁定提示信息
	bool unlock();									// 解锁提示信息
	bool settipinfo(TIPINFO tipinfo);				// 设置提示信息
	bool setshowposition(unsigned sp);				// 设置显示位置(相对于父窗口来说)
	bool setshowposition(POINT ltanchor);			// 指定锚点坐标
	bool showtip(HWND hparent, b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值