MFC标签设计工具 图片控件上,移动鼠标显示图片控件内的鼠标xy的水平和垂直辅助线要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 源码

需求:要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小

我生成标签时,需要对齐和 调文字字体大小。这工具微调 能快速知道位置 和字体大小。
标签设计(点击图片,上下左右箭头移动 +或-调字体)

已经够用了,滚动条还没完全实现,如果能拖动文字、条型码、二维码到上面就更好了,就是有太多参数需要设置。
在这里插入图片描述

在MFC(Microsoft Foundation Classes)中,要实现在一个图片控件上移动鼠标时显示图片控件内鼠标位置的水平和垂直辅助线,你可以通过处理鼠标移动事件来绘制这些辅助线。以下是一个简化的示例,展示了如何在一个继承自CStatic的类中实现这个功能。

首先,你需要创建一个新的类,继承自CStatic,并在这个类中处理WM_MOUSEMOVE消息来绘制辅助线。

// PictureControl.h
#pragma once#include <afxwin.h>class CPictureControl : public CStatic
{
public:CPictureControl();virtual ~CPictureControl();protected:afx_msg void OnMouseMove(UINT nFlags, CPoint point);DECLARE_MESSAGE_MAP()void DrawCrossHair(CPoint point);
};

.cpp文件中,你需要实现OnMouseMoveDrawCrossHair方法。OnMouseMove方法会在鼠标移动时被调用,而DrawCrossHair方法用于在控件上绘制辅助线。

// PictureControl.cpp
#include "PictureControl.h"BEGIN_MESSAGE_MAP(CPictureControl, CStatic)ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()CPictureControl::CPictureControl()
{
}CPictureControl::~CPictureControl()
{
}void CPictureControl::OnMouseMove(UINT nFlags, CPoint point)
{CStatic::OnMouseMove(nFlags, point);// 绘制辅助线DrawCrossHair(point);
}void CPictureControl::DrawCrossHair(CPoint point)
{CDC* pDC = GetDC();CRect rect;GetClientRect(&rect);// 保存当前DC状态int nSavedDC = pDC->SaveDC();// 设置ROP模式为R2_NOT,这样可以用相同的操作来清除线条pDC->SetROP2(R2_NOT);// 绘制水平线pDC->MoveTo(0, point.y);pDC->LineTo(rect.right, point.y);// 绘制垂直线pDC->MoveTo(point.x, 0);pDC->LineTo(point.x, rect.bottom);// 恢复DC状态pDC->RestoreDC(nSavedDC);ReleaseDC(pDC);
}

最后,确保你的对话框或窗口中的图片控件使用了这个CPictureControl类。如果你是在对话框中使用,你可能需要在对话框的头文件中声明一个CPictureControl成员变量,并在对话框的OnInitDialog方法中将这个控件与实际的控件ID关联起来。

// 在对话框头文件中
CPictureControl m_picControl;// 在对话框的OnInitDialog方法中 
m_picControl.SubclassDlgItem(IDC_PICTURE_CONTROL, this);

请注意,这个示例仅提供了基本的实现框架。根据你的具体需求,你可能需要对代码进行调整,比如在绘制辅助线之前清除之前的线条,或者处理图片的缩放等问题。

最后绑定ID (m_picControl.SubclassDlgItem(IDC_PICTURE_CONTROL, this);)也可以这样

在这里插入图片描述

MFC调用自定义控件类OnMouseMove不响应

必须要将Notify设为True才行。
在这里插入图片描述

画出来了,但是没有清除鼠标移动前的所有辅助线痕迹

在这里插入图片描述

改成点击

必须要将Notify设为True才行。
在这里插入图片描述

// CDlgLableDesign.cpp: 实现文件
//#include "pch.h"
#include "afxdialogex.h"
#include "CDlgLableDesign.h"
#include "Resource.h"#define MAX_SCROLL_POS 2000typedef struct Para
{char templateName[200];LONG fontHeight=82;CPoint point;
}Para;
static Para para = {0};// CDlgLableDesign 对话框IMPLEMENT_DYNAMIC(CDlgLableDesign, CDialogEx)CDlgLableDesign::CDlgLableDesign(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG_LabelDesign, pParent)
{}CDlgLableDesign::~CDlgLableDesign()
{
}void CDlgLableDesign::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT_LOG2, m_editDisplay);//DDX_Control(pDX, IDC_STATIC_IMAGE, m_pictureCtrl);
}BEGIN_MESSAGE_MAP(CDlgLableDesign, CDialogEx)ON_BN_CLICKED(IDC_BUTTON_PRINT_OUTBOX, &CDlgLableDesign::OnBnClickedButtonPrintOutbox)ON_WM_TIMER()
//	ON_WM_MOUSEMOVE()
//	ON_WM_PAINT()
ON_STN_CLICKED(IDC_STATIC_IMAGE, &CDlgLableDesign::OnClickedStaticImage)
//ON_WM_VSCROLL()
ON_WM_CLOSE()
END_MESSAGE_MAP()void CDlgLableDesign::Log(CString szInfo)
{logger.INFO_F(szInfo.GetBuffer(0));CString strInfo;m_editDisplay.GetWindowText(strInfo);int nLength = strInfo.GetLength();m_editDisplay.SetSel(nLength, nLength, FALSE);m_editDisplay.SetFocus();m_editDisplay.SetSel(-1, -1);m_editDisplay.ReplaceSel(szInfo + "\r\n");
}// CDlgLableDesign 消息处理程序
BOOL CDlgLableDesign::LoadImageToPictureControl(CString bmpPath)
{CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);if (pPictureControl == nullptr || bmpPath.IsEmpty())return FALSE;// 加载图片CImage image;HRESULT hr = image.Load(bmpPath);if (FAILED(hr)){Log("加载图片失败"+ bmpPath);return FALSE;}// 获取图片大小int nWidth = image.GetWidth();int nHeight = image.GetHeight();//Log("宽高 "+CString(to_string(nWidth).c_str())+" * " + CString(to_string(nHeight).c_str()) +" 转为mm " + CString(to_string(nWidth* PixToMm600).c_str()) + " * " + CString(to_string(nHeight * PixToMm600).c_str()));// 调整控件大小以适应图片//CRect rect;//pPictureControl->GetWindowRect(&rect);pPictureControl->MoveWindow(208, 10, nWidth, nHeight);// 获取控件的DCCDC* pDC = pPictureControl->GetDC();if (pDC == nullptr)return FALSE;// 创建兼容DCCDC dcImage;if (!dcImage.CreateCompatibleDC(pDC))return FALSE;// 选择图片到DCCBitmap bmp;bmp.Attach(image.Detach());CBitmap* pOldBmp = dcImage.SelectObject(&bmp);// 将图片绘制到控件上pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);// 清理dcImage.SelectObject(pOldBmp);pPictureControl->ReleaseDC(pDC);//CImage image;//HRESULT hResult = image.Load(_T(bmpPath)); // 加载图片//if (SUCCEEDED(hResult))//{//	// 获取Picture Control的句柄//	CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);//	// 获取控件大小//	CRect rect;//	pPictureControl->GetClientRect(&rect);//	int controlWidth = rect.Width();//	int controlHeight = rect.Height();//	// 获取图片原始尺寸//	int imageWidth = image.GetWidth();//	int imageHeight = image.GetHeight();//	// 创建兼容的DC//	CDC* pDC = pPictureControl->GetDC();//	CDC memDC;//	memDC.CreateCompatibleDC(pDC);//	// 创建兼容的位图,并选入内存DC//	CBitmap bmp;//	bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);//	CBitmap* pOldbmp = memDC.SelectObject(&bmp);//	// 清空背景//	memDC.FillSolidRect(&rect, pDC->GetBkColor());//	// 使用CImage绘制到内存DC,这里使用缩放//	image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);//	// 将内存DC绘制到控件上//	pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);//	// 清理//	memDC.SelectObject(pOldbmp);//	ReleaseDC(pDC);//}//else//{//	Log("图片加载失败:" + bmpPath);//}return TRUE;
}
BOOL ReadPara()
{CString DebugPara = "";GetPrivateProfileString("DEBUG", "DebugPara", "", DebugPara.GetBuffer(2000), 2000, configFileName); DebugPara.ReleaseBuffer();if (DebugPara.GetLength() > 0){utlStrToHex((BYTE*)&para, DebugPara.GetBuffer(), DebugPara.GetLength() / 2);return TRUE;}return FALSE;
}
BOOL WritePara()
{char DebugPara[4000] = {0};utlHexToStr(DebugPara, (BYTE*)&para, sizeof(para));if (WritePrivateProfileString("DEBUG", "DebugPara", DebugPara, configFileName)){return TRUE;}return FALSE;
}
BOOL CDlgLableDesign::OnInitDialog()
{CDialogEx::OnInitDialog();SetTimer(1, 100, NULL);ShowWindow(SW_MAXIMIZE);// 启用垂直滚动条SetScrollRange(SB_VERT, 0, MAX_SCROLL_POS); // 假设滚动范围是0到200//log位置自动长度CRect rect;GetDlgItem(IDC_EDIT_LOG2)->GetWindowRect(&rect);GetClientRect(&rect);rect.left = 8;rect.top = 70;rect.right = 8+195;rect.bottom = rect.bottom -10;GetDlgItem(IDC_EDIT_LOG2)->MoveWindow(&rect);return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}void CDlgLableDesign::OnBnClickedButtonPrintOutbox()
{CFileDialog fileDlg(TRUE, _T("bmp"), NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("Bitmap Files (*.bmp)|*.bmp||"));if (fileDlg.DoModal() == IDOK){memset((char*) & para, 0, sizeof(para));memcpy(para.templateName, fileDlg.GetPathName().GetBuffer(), fileDlg.GetPathName().GetLength());WritePara();Log("加载模板:" + CString(para.templateName));LoadImageToPictureControl(para.templateName); // 加载图片}}void CDlgLableDesign::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (nIDEvent == 1){if (ReadPara()){if (strlen(para.templateName) > 0){Log("加载模板:" + CString(para.templateName));LoadImageToPictureControl(para.templateName); // 加载图片}}KillTimer(1); // 销毁定时器}CDialogEx::OnTimer(nIDEvent);
}//void CDlgLableDesign::OnMouseMove(UINT nFlags, CPoint point)
//{// TODO: 在此添加消息处理程序代码和/或调用默认值// 获取图片控件的位置和大小
//	CRect rect;
//	CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);
//	pPictureControl->GetWindowRect(&rect);
//	ScreenToClient(&rect);
//// 计算鼠标相对于图片控件的坐标
//	int x = point.x - rect.left;
//	int y = point.y - rect.top;
//// 在log中输出坐标
//	CString str;
//	str.Format(_T("x: %d, y: %d"), x, y);
//
//
//// 判断点是否在矩形内
//	if (rect.PtInRect(point)) { 获取鼠标的当前位置//CPoint mousePos = point; 绘制水平和垂直辅助线//CClientDC dc(this);//CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); // 红色辅助线//dc.SelectObject(&pen);//dc.MoveTo(mousePos.x, 0);//dc.LineTo(mousePos.x, rect.Height());//dc.MoveTo(0, mousePos.y);//dc.LineTo(rect.Width(), mousePos.y); 重绘图片控件//Invalidate();//CClientDC dc(this); 设置字体//CFont font;//font.CreatePointFont(100, _T("Arial"), &dc);//CFont* pOldFont = dc.SelectObject(&font); 使用TextOut函数在鼠标位置下方绘制文本//dc.TextOut(point.x, point.y + 20, str); 清除原来的文本CRect rect;GetClientRect(&rect);InvalidateRect(rect); 恢复原始字体//dc.SelectObject(pOldFont);Invalidate();
//	}//Log(str);
//	CDialogEx::OnMouseMove(nFlags, point);
//}void CDlgLableDesign::OnClickedStaticImage()
{::GetCursorPos(&para.point); // 获取当前鼠标位置ScreenToClient(&para.point); // 将屏幕坐标转换为窗口坐标ShowImage();
}
void CDlgLableDesign::ShowImage()
{LoadImageToPictureControl(para.templateName); // 加载图片// 获取图片控件的位置和大小CRect rect;CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);pPictureControl->GetWindowRect(&rect);// 获取控件位置ScreenToClient(&rect); // 将屏幕坐标转换为窗口坐标// 计算鼠标相对于图片控件的坐标int x = para.point.x - rect.left;int y = para.point.y - rect.top;// 在log中输出坐标CString str;str.Format(_T("%d, %d "), x, y);Log(str);SetClipboard(str);//画辅助线CDC* pDC = GetDC();//CRect rect;//GetClientRect(&rect);// 保存当前DC状态int nSavedDC = pDC->SaveDC();DrawSomething(pDC, para.point.x, para.point.y);  //画一些别的东西// 设置ROP模式为R2_NOT,这样可以用相同的操作来清除线条//pDC->SetROP2(R2_NOT);CPen redPen;redPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); // 1像素宽的实线,红色// 保存旧的画笔CPen* pOldPen = pDC->SelectObject(&redPen);// 绘制水平线pDC->MoveTo(rect.left, para.point.y);pDC->LineTo(rect.right, para.point.y);// 绘制垂直线pDC->MoveTo(para.point.x, rect.top);pDC->LineTo(para.point.x, rect.bottom);// 恢复旧的画笔pDC->SelectObject(pOldPen);// 恢复DC状态pDC->RestoreDC(nSavedDC);ReleaseDC(pDC);
}
BOOL CDlgLableDesign::DrawSomething(CDC* pDC,int x,int y)
{// 设置字体CFont font;LOGFONT lf;memset(&lf, 0, sizeof(LOGFONT));lf.lfHeight = para.fontHeight; // 字体大小lf.lfWeight = FW_HEAVY; // 加粗_tcscpy_s(lf.lfFaceName, ("黑体")); // 字体名称font.CreateFontIndirect(&lf);//font.CreatePointFont(240, "Arial", NULL);CFont* pOldFont = pDC->SelectObject(&font);SetBkMode(pDC->m_hDC, TRANSPARENT);pDC->TextOut(x, y, _T("DEV1"));pDC->SelectObject(pOldFont);return TRUE;
}BOOL CDlgLableDesign::PreTranslateMessage(MSG* pMsg)
{if (pMsg->message == WM_KEYDOWN){switch (pMsg->wParam){case VK_LEFT:para.point.x--;ShowImage();break;case VK_RIGHT:para.point.x++;ShowImage();break;case VK_UP:para.point.y--;ShowImage();break;case VK_DOWN:para.point.y++;ShowImage();break;case VK_PRIOR:case VK_OEM_MINUS:case VK_SUBTRACT:para.fontHeight--;Log("字高:"+ CString(to_string(para.fontHeight).c_str()));ShowImage();break;case VK_NEXT:case VK_OEM_PLUS:case VK_ADD:para.fontHeight++;Log("字高:" + CString(to_string(para.fontHeight).c_str()));ShowImage();break;default:break;}return TRUE;}return CDialogEx::PreTranslateMessage(pMsg);
}void CDlgLableDesign::OnClose()
{WritePara();CDialogEx::OnClose();
}
#pragma once
#include "afxdialogex.h"// CDlgLableDesign 对话框class CDlgLableDesign : public CDialogEx
{DECLARE_DYNAMIC(CDlgLableDesign)public:CDlgLableDesign(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CDlgLableDesign();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG_LabelDesign };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:virtual BOOL OnInitDialog();afx_msg void OnBnClickedButtonPrintOutbox();afx_msg void OnTimer(UINT_PTR nIDEvent);//	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//	afx_msg void OnPaint();
public:CEdit m_editDisplay;void Log(CString szInfo);BOOL CDlgLableDesign::DrawSomething(CDC* pDC, int x, int y);void CDlgLableDesign::ShowImage();BOOL LoadImageToPictureControl(CString pic);// 在对话框头文件中afx_msg void OnClickedStaticImage();
//	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);virtual BOOL PreTranslateMessage(MSG* pMsg);afx_msg void OnClose();
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571836.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态代理,jdk动态代理,cglib动态代理

文章目录 静态代理动态代理jdk动态代理JDK生成的动态代理类大概源码cglib动态代理 代理模式就是用代理对象代替真实对象去完成相应的操作&#xff0c;并且能够在操作执行的前后对操作进行增强处理。 静态代理 mybatis使用的就是静态代理&#xff0c;相比动态代理&#xff0c;…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

STL的基本概念

一、STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升 面向对象的三大特性(简单理解) 封装&#xff1a;把属性和行为抽象出来作为一个整体来实现事和物 继承&#xff1a;子类继承父类&a…

Gui guider使用自定义字体总结

在实际开发中&#xff0c;我们通常是使用自定义字体。 在 LVGL 中&#xff0c;用户需要使用自定义的字库&#xff0c;其实现方法可分为两类&#xff1a; ① 通过 C 语言数组&#xff08;内部读取&#xff09;&#xff1b; ② 通过文件系统读取字库&#xff08;外部读取&#…

【CAD建模号小技巧】边缘尖角光滑处理方法

教大家一个处理模型边缘的方法&#xff0c;处理后模型更美观&#xff0c;更不易坏&#xff0c;而且有些零件还必须经过这样的处理。 咱们看一个未经过边缘处理的模型&#xff0c;边缘是尖的&#xff0c;摸到会刺伤&#xff0c;一些接近刀口形状。 更危险了&#xff0c;所以要进…

javascript基础代码练习

一、输入新增病例数&#xff0c;累计确诊病例数&#xff0c;14天内聚集性疫情发生天数。新增或者累计确诊病例为0则该地区为低风险地区。新增大于0且累计确诊&#xff1c;50或者累计大于50且14天内聚集性疫情发生天数为0的地区为中风险地区。其他情况为高风险地区。 <!DOCT…

大数据开发(离线实时音乐数仓)

大数据开发&#xff08;离线实时音乐数仓&#xff09; 一、数据库与ER建模1、数据库三范式2、ER实体关系模型 二、数据仓库与维度建模1、数据仓库&#xff08;Data Warehouse、DW、DWH&#xff09;1、关系型数据库很难将这些数据转换成企业真正需要的决策信息&#xff0c;原因如…

C语言程序练习——汉诺塔递归

1. 题目 在终端输入汉诺塔层数n&#xff0c;实现将n层汉诺塔通过三座塔座A、B、C进行排列 2. 代码 #include <stdio.h>int hannuota(int len, int str, int tmp, int dst) {if (1 len){printf("%c -> %c\n", str, dst);}else{hannuota(len-1, str, dst, …

Python更改Word文档的页面大小

页面大小确定文档中每个页面的尺寸和布局。在某些情况下&#xff0c;您可能需要自定义页面大小以满足特定要求。在这种情况下&#xff0c;Python可以帮助您。通过利用Python&#xff0c;您可以自动化更改Word文档中页面大小的过程&#xff0c;节省时间和精力。本文将介绍如何使…

Python---Numpy学习

首先&#xff0c;先来认识一下Numpy数组对象&#xff0c;以及如何创建它 import numpy as np# 1.认识数组对象 # 指定取值范围和跨度创建数组对象 # 创建一个3行4列的数组 data np.arange(12).reshape(3, 4)print(data)print(type(data))# 维度 print(data.shape)# 维度的个数…

【Java程序设计】【C00364】基于Springboot的美发管理系统(有论文)

基于Springboot的美发管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…

「媒体宣传」如何针对不同行业制定媒体邀约方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 针对不同行业制定媒体邀约方案时&#xff0c;需要考虑行业特点、目标受众、媒体偏好以及市场趋势等因素。 一、懂行业 先弄清楚你的行业是啥样&#xff0c;有啥特别之处。 了解行业的热…