tiny tool - get_file_path_name_by_drop_file

文章目录

    • tiny tool - get_file_path_name_by_drop_file
    • 概述
    • 工程效果
    • 收获的知识点
    • vs2022工程, 必须自己设置对话框可以接受文件的风格
    • vs2022建立的工程, 默认是unicode编码, 设置剪贴板数据时, 必须要设置为unicode的格式, 否则剪切板中只有第一个字符
    • 工程主要实现
    • END

tiny tool - get_file_path_name_by_drop_file

概述

用EPLAN做黑盒时, 需要插入元件图片. 觉得有点麻烦.
用win10资源管理器自带的文件属性, 需要自己将路径和文件名拼在一起.
自己做一个小工具, 将文件拖入程序, 然后自动得到文件全路径, 然后点击拷贝按钮, 拷贝进剪切板.
在EPLAN插入图片时, 就可以用剪切板中的文件全路径了.

工程效果

在这里插入图片描述

收获的知识点

vs2022工程, 必须自己设置对话框可以接受文件的风格

BOOL CgetfilepathnamebydropfileDlg::OnInitDialog()
{
...this->DragAcceptFiles(TRUE); // 资源文件UI中, 已经没有接受文件这个选项, 只能用API来设置return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

vs2022建立的工程, 默认是unicode编码, 设置剪贴板数据时, 必须要设置为unicode的格式, 否则剪切板中只有第一个字符

BOOL CgetfilepathnamebydropfileDlg::EditCopy(VOID)
{
...::SetClipboardData(CF_TEXT | CF_UNICODETEXT, hglbCopy); // 如果不带 CF_UNICODETEXT 选项, 剪切板中只有第一个字符(即使是都是英文的字符串)// Close the clipboard. ::CloseClipboard();return TRUE;
}

开始用的代码片段都是MS官方的, 还不好使, 给自己整的愣住了.
自己捣鼓了一会, 才怀疑到剪切版数据格式的设置问题上.

工程主要实现


// get_file_path_name_by_drop_fileDlg.cpp: 实现文件
//#include "pch.h"
#include "framework.h"
#include "get_file_path_name_by_drop_file.h"
#include "get_file_path_name_by_drop_fileDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialog(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()// CgetfilepathnamebydropfileDlg 对话框CgetfilepathnamebydropfileDlg::CgetfilepathnamebydropfileDlg(CWnd* pParent /*=nullptr*/): CDialog(IDD_GET_FILE_PATH_NAME_BY_DROP_FILE_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CgetfilepathnamebydropfileDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT_FILE_PATH_NAME, m_ctrlFilePathName);
}BEGIN_MESSAGE_MAP(CgetfilepathnamebydropfileDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_COPY, &CgetfilepathnamebydropfileDlg::OnBnClickedBtnCopy)ON_WM_DROPFILES()
END_MESSAGE_MAP()// CgetfilepathnamebydropfileDlg 消息处理程序BOOL CgetfilepathnamebydropfileDlg::OnInitDialog()
{CDialog::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO: 在此添加额外的初始化代码this->DragAcceptFiles(TRUE); // 资源文件UI中, 已经没有接受文件这个选项, 只能用API来设置return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CgetfilepathnamebydropfileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CgetfilepathnamebydropfileDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CgetfilepathnamebydropfileDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}BOOL CgetfilepathnamebydropfileDlg::EditCopy(VOID)
{LPTSTR  lptstrCopy;HGLOBAL hglbCopy;int cch = 0;// Open the clipboard, and empty it. if (!::OpenClipboard(NULL))return FALSE;::EmptyClipboard();CString str;m_ctrlFilePathName.GetWindowTextW(str);cch = str.GetLength();hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE,(cch + 1) * sizeof(TCHAR));if (hglbCopy == NULL){::CloseClipboard();return FALSE;}// Lock the handle and copy the text to the buffer. lptstrCopy = (LPTSTR)::GlobalLock(hglbCopy);memcpy(lptstrCopy, str,cch * sizeof(TCHAR));lptstrCopy[cch] = (TCHAR)'\0';    // null character ::GlobalUnlock(hglbCopy);// Place the handle on the clipboard. ::SetClipboardData(CF_TEXT | CF_UNICODETEXT, hglbCopy); // 如果不带 CF_UNICODETEXT 选项, 剪切板中只有第一个字符(即使是都是英文的字符串)// Close the clipboard. ::CloseClipboard();return TRUE;
}void CgetfilepathnamebydropfileDlg::OnBnClickedBtnCopy()
{// TODO: 在此添加控件通知处理程序代码EditCopy();
}void CgetfilepathnamebydropfileDlg::OnDropFiles(HDROP hDropInfo)
{// TODO: 在此添加消息处理程序代码和/或调用默认值TCHAR szTmp[MAX_PATH * 2];UINT nRc = 0;nRc = ::DragQueryFile(hDropInfo, 0, szTmp, sizeof(szTmp) / sizeof(szTmp[0]));if (nRc > 0) {m_ctrlFilePathName.SetWindowTextW(szTmp);}::DragFinish(hDropInfo);CDialog::OnDropFiles(hDropInfo);
}

END

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

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

相关文章

【Linux】线程同步(互斥锁和读写锁)

概念 线程同步是指多个线程之间协调和管理彼此的执行顺序&#xff0c;以避免竞态条件和不确定的结果。线程同步的目的是确保共享资源的正确访问和保护临界区的完整性。 作用 避免竞态条件&#xff1a;当多个线程同时访问和修改共享资源时&#xff0c;可能会导致竞态条件的发生…

微信小程序的跨页面传参以及data-方法的相关细节

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;微信小程序的跨页面传参以及data-方法的相关细节 目录 前言wx.navigateTo()方法微信小程序传参的几种方式通过data-属性传参关于data-方法配合点击事件传参的细节 前言 其实在学习新东西的过程中&a…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…

R+VIC 模型融合实践技术应用及未来气候变化模型预测

目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&#xff0c;由于适用的尺度主要的是中小流域&#xff0c;所以在预测气候变化对水文过程影响等方面都有所不足。 VIC模型…

Web服务器群集:部署Tomcat

目录 一、理论 1.Tomcat 2.JDK 3.Tomcat安装 4.Tomcat优化 5.Tomcat虚拟主机设置 二、实验 1.JDK安装 2.Tomcat安装 3.Tomcat优化 4.Tomcat 虚拟主机配置 三、总结 一、理论 1.Tomcat &#xff08;1&#xff09;概念 Tomcat服务器是一个免费的开放源代码的Web应用…

UE5 读写本地JSON,发送HTTP请求(get)

UE5 读写本地JSON&#xff0c;发送HTTP请求&#xff08;get&#xff09; 没有使用插件&#xff0c;就用UE提供的库开发&#xff08;推荐使用插件VaRest在虚幻商城里有&#xff09; PCHUsage PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new …

vue 启动项目报错:TypeError: Cannot set property ‘parent‘ of undefined异常解决

场景&#xff1a;从git上面拉下来一个项目 npm i 下载完依赖以后 npm run serve 去运行项目的时候 报错TypeError: Cannot set property ‘parent’ of undefined 如图所示 原因&#xff1a;首先排查发现判断得出是less解析失败导致 但是经过长时间的查询解决方案发现是因为v…

DAY39——动态规划part2

1.考虑障碍在起点和终点的特殊状况&#xff0c;可直接返回0 2.判断是否存在障碍物&#xff1a;初始化时需要设置障碍物后的坐标为0

windows环境使用cmake配置pcl

安装环境 cmake版本&#xff1a;cmake-3.26.3-windows-x86_64 pcl版本&#xff1a;PCL 1.13.1 vs版本&#xff1a;vs2022 配置流程 cmake编译准备&#xff1a;新建两个文件夹source和cmake_bin。source用于存放.cpp文件和CMakeLists.txt 文件&#xff1b;cmake_bin存放配置生…

【Java】Java核心 73:XML (中)

文章目录 5 XML的组成&#xff1a;字符区(了解)**6** **DTD约束(能够看懂即可)****1** **什么是DTD****2** **DTD约束的实现和语法规则&#xff08;看懂dtd约束&#xff0c;书写符合规范的xml文件&#xff09;** 5 XML的组成&#xff1a;字符区(了解) 当大量的转义字符出现在x…

「网络编程」第二讲:网络编程socket套接字(一)

「前言」文章是关于网络编程的socket套接字方面的&#xff0c;下面开始讲解&#xff01; 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 春风得意马蹄疾&#xff0c;一日看尽长安花。 ——孟郊《登科后》 目录 一…

【Python笔记】之-bash: python: command not found

问题&#xff1a; 在服务器环境&#xff0c;使用python命令时提示&#xff1a;-bash: python: command not found 查看服务器python版本&#xff0c;一般是在/usr/bin目录下&#xff0c;在终端输入命令如下&#xff1a; find /usr/bin -iname python*得到输出&#xff1a; …