Win32 编程进阶:打造自己的标准控件
作者:cntrump
前言
Windows给我们提供了很多的标准控件,基本上够用的。但是有时候我们会对标准控件不满意,这时候就可以考虑自己编写控件。
本教程的目的是编写一个出一个简单的标准控件,作用类似于网页上的超链接,除了可以接受Windows 常规消息还可以处理控件自定义的消息。
程序运行的效果如下:
鼠标点击之后就会打开在程序中所指定的链接。
准备工作:
这个控件很简单,只要响应鼠标消息进行处理就可以了,在开始编码之前,先定义几个控件使用的消息和宏:
1. 控件可以设置文字的对齐方式:
// 文字的对齐方式,默认左对齐
// 左对齐
#define HLS_LEFT DT_LEFT
// 居中对齐
#define HLS_CENTER DT_CENTER
// 右对齐
#define HLS_RIGHT DT_RIGHT
// 超链接控件可接收的消息
// 设置超链接
#define HLM_SETHYPERLINK (WM_USER+0x0001)
// 获取超链接
#define HLM_GETHYPERLINK (WM_USER+0x0002)
// 设置和获取超链接的宏
#define HyperLink_SetLink(hwnd, link) SendMessage(hwnd, HLM_SETHYPERLINK,
0, (LPARAM)link)
#define HyperLink_GetLink(hwnd, link, length) SendMessage(hwnd, HLM_GETHYPERLINK, (WPARAM)length, (LPARAM)link)
// 注册控件类
ATOM WINAPI RegisterHyperLinkCtrl(HINSTANCE hIns)
{
WNDCLASSEX wndClass;
ZeroMemory(&wndClass, sizeof(wndClass));
wndClass.cbSize = sizeof(wndClass);
wndClass.style = CS_PARENTDC|CS_GLOBALCLASS; // 使用全局类并和父窗口共享DC
wndClass.lpszClassName = HyperLinkCtrlClassName;
wndClass.hCursor = LoadCursor(NULL, IDC_HAND); // 手型鼠标
wndClass.hInstance = hIns;
wndClass.lpfnWndProc = (WNDPROC)CtrlProc; // 控件的消息处理过程
wndClass.cbWndExtra = sizeof(INT*); // 为窗口分配额外内存,用来保存我们自己的指针.
return RegisterClassEx(&wndClass);
}
// 创建一个超链接控件
HWND WINAPI CreateHyperLink(LPCTSTR pszTitle, // 显示的文本
DWORD style, // 窗口风格
INT x, // x 坐标
INT y, // y 坐标
INT nWidth, // 宽度
INT nHeight, //高度
HWND hWndParent, // 父窗口句柄
UINT CtrlID) // 控件 ID
{
return CreateWindow(HyperLinkCtrlClassName,
pszTitle,
WS_CHILD|style, // 必须是子窗口
x,
y,
nWidth,
nHeight,
hWndParent,
(HMENU)CtrlID,
NULL,
0);
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)