lstrcpyn

本文详细介绍了 LPTSTRlstrcpyn 函数的使用方法及其参数意义。此函数用于将一个字符串复制到另一个缓冲区中,并允许指定复制的最大长度,包括 NULL 结束符。

 LPTSTR lstrcpyn( __out LPTSTR lpString1, __in LPCTSTR lpString2, __in int iMaxLength);

 该函数把第二个参数指定的字符串复制到第一个参数指定的字符串,第三个参数指定复制的长度。


       lpString1 :指向一个缓冲区,以存储第二参数的内容。需足够长以容纳第三参数设定的TCHAR值,以及NULL结束符“\0”;

  lpString2 :指向以NULL结尾"\0"的字符串;
  iMaxLength :指定从第二参数复制至第一参数内容的大小,包括NULL结束符"\0"(谨记bytes字节数对应ANSI 版本以及WCHAR值对应Unicode版本)

#include "pch.h" #include "TraceService.h" #include <locale.h> #include <cstdio> #pragma warning(disable:4996) /////////////////////////////////////////////////////////////////////////// //颜色定义 #define COLOR_TIME RGB(0,0,0) #define COLOR_NORMAL RGB(125,125,125) #define COLOR_WARN RGB(255,128,0) #define COLOR_EXCEPTION RGB(200,0,0) #define COLOR_DEBUG RGB(0,128,128) #define EVENT_LEVEL_COUNT 5 /////////////////////////////////////////////////////////////////////////// //追踪服务 /////////////////////////////////////////////////////////////////////////// static ITraceService* g_pITraceService = NULL; //函数定义 /////////////////////////////////////////////////////////////////////////// //构造函数 CTraceService::CTraceService() { } //服务配置 /////////////////////////////////////////////////////////////////////////// //设置服务 bool CTraceService::SetTraceService(ITraceService * pIUnknownEx) { g_pITraceService = pIUnknownEx; return NULL != g_pITraceService; } //获取服务 VOID* CTraceService::GetTraceServiceManager() { ASSERT(g_pITraceService); if (g_pITraceService) return NULL; return (VOID*)g_pITraceService; } //追踪控制 bool CTraceService::EnableTrace(enTraceLevel TraceLevel, bool bEnableTrace) { return false; } //功能函数 /////////////////////////////////////////////////////////////////////////// //追踪信息 bool CTraceService::TraceString(LPCTSTR pszString, enTraceLevel TraceLevel) { if ((g_pITraceService)) return g_pITraceService->TraceString(pszString, TraceLevel); } bool CTraceService::TraceStringEx(enTraceLevel TraceLevel, LPCTSTR pszFormat, ...) { TCHAR szBuffer[1024] = { 0 }; va_list arglist; va_start(arglist, pszFormat); _vstprintf_s(szBuffer, CountArray(szBuffer), pszFormat, arglist); va_end(arglist); if (g_pITraceService) return g_pITraceService->TraceString(szBuffer, TraceLevel); return false; } /////////////////////////////////////////////////////////////////////////// //追踪服务 /////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CTraceServiceControl, CRichEditCtrl) ON_WM_RBUTTONDOWN() ON_COMMAND(IDM_MENU0, &CTraceServiceControl::OnCopyString) ON_COMMAND(IDM_MENU1, &CTraceServiceControl::OnSelectAll) ON_COMMAND(IDM_MENU2, &CTraceServiceControl::OnDeleteString) ON_COMMAND(IDM_MENU3, &CTraceServiceControl::OnClearAll) ON_COMMAND(IDM_MENU4, &CTraceServiceControl::OnSaveString) END_MESSAGE_MAP() //函数定义 /////////////////////////////////////////////////////////////////////////// //构造函数 CTraceServiceControl::CTraceServiceControl() { //CTraceService::SetTraceService(this); } //析构函数 CTraceServiceControl::~CTraceServiceControl() { CTraceService::SetTraceService(NULL); } //基础接口 /////////////////////////////////////////////////////////////////////////// //接口查询 VOID* CTraceServiceControl::QueryInterface() { //QueryInterface(ITraceService, Guid, dwQueryVer); //QueryInterface_IUNKNOWNEX(ITraceService, Guid, dwQueryVer); return this; } //信息接口 /////////////////////////////////////////////////////////////////////////// //追踪信息 bool CTraceServiceControl::TraceString(LPCTSTR pszString, enTraceLevel TraceLevel) { //变量定义 CHARFORMAT2 CharFormat; ZeroMemory(&CharFormat, sizeof(CharFormat)); //构造数据 CharFormat.cbSize = sizeof(CharFormat); CharFormat.dwMask = CFM_COLOR | CFM_BACKCOLOR; CharFormat.crTextColor = RGB(0, 0, 0); CharFormat.crBackColor = RGB(255, 255, 255); lstrcpyn(CharFormat.szFaceName, TEXT("宋体"), sizeof(CharFormat.szFaceName)); //获取时间 SYSTEMTIME SystemTime; TCHAR szTimeBuffer[1024 * 2] = { 0 }; GetLocalTime(&SystemTime); _sntprintf(szTimeBuffer,sizeof(szTimeBuffer),TEXT("【 %04d-%02d-%02d %02d:%02d:%02d 】"), SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond); _sntprintf(szTimeBuffer, sizeof(szTimeBuffer), TEXT("%s%s\n"), szTimeBuffer, pszString); CharFormat.crTextColor = GetTraceColor(TraceLevel); return InsertString(szTimeBuffer, CharFormat); } //重载函数 /////////////////////////////////////////////////////////////////////////// //绑定函数 VOID CTraceServiceControl::PreSubclassWindow() { __super::PreSubclassWindow(); // 在这里设置服务,此时控件已完全创建 CTraceService::SetTraceService(this); // 测试输出 //CTraceService::TraceString(_T("CTraceServiceControl 已初始化\n"), TraceLevel_Normal); } //功能函数 /////////////////////////////////////////////////////////////////////////// //加载消息 bool CTraceServiceControl::LoadMessage(LPCTSTR pszFileName) { if (static_cast<CTraceServiceControl*>(g_pITraceService) == NULL) return false; return static_cast<CTraceServiceControl*>(g_pITraceService)->LoadMessage(pszFileName); } //保存信息 bool CTraceServiceControl::SaveMessage(LPCTSTR pszFileName) { if (static_cast<CTraceServiceControl*>(g_pITraceService) == NULL) return false; return static_cast<CTraceServiceControl*>(g_pITraceService)->SaveMessage(pszFileName); } //设置参数 bool CTraceServiceControl::SetParameter(LONG lMaxLineCount, LONG lReserveLineCount) { m_lMaxLineCount = lMaxLineCount; //最大行数 m_lReserveLineCount = lReserveLineCount; //保留函数 return true; } //辅助函数 /////////////////////////////////////////////////////////////////////////// //配置服务 VOID CTraceServiceControl::InitializeService() { } //获取颜色 COLORREF CTraceServiceControl::GetTraceColor(enTraceLevel TraceLevel) { switch (TraceLevel) { case TraceLevel_Info: return RGB(133, 124, 129); break; case TraceLevel_Normal: return RGB(133, 124, 129); break; case TraceLevel_Warning: return RGB(255, 0, 0); break; case TraceLevel_Exception: return RGB(255, 0, 0); break; case TraceLevel_Debug: return RGB(19, 127, 140); break; } return RGB(0, 0, 0); } //字符判断 bool EFFicacyUrlChar(TCHAR chChar) { //特殊字符 if (chChar == TEXT('.')) return true; if (chChar == TEXT('=')) return true; if (chChar == TEXT('+')) return true; if (chChar == TEXT('?')) return true; if (chChar == TEXT('#')) return true; if (chChar == TEXT('%')) return true; if (chChar == TEXT('/')) return true; if (chChar == TEXT(':')) return true; if (chChar == TEXT('&')) return true; //字符范围 if ((chChar >= TEXT('a')) && (chChar <= TEXT('z'))) return true; if ((chChar >= TEXT('A')) && (chChar <= TEXT('Z'))) return true; if ((chChar >= TEXT('0')) && (chChar <= TEXT('9'))) return true; return false; } //地址判断 bool EFFicacyUrlString(LPCTSTR pszUrl) { for (WORD i = 0; i < lstrlen(pszUrl); i++) { if(!EFFicacyUrlChar(pszUrl[i])) return false; } return true; } //插入字串 bool CTraceServiceControl::InsertString(LPCTSTR pszString, CHARFORMAT2& CharFormat) { //保存状态 if (GetTextLength() >= 1024 * 512) OnClearAll(); //插入消息 //变量定义 bool bResumeSelect; CHARRANGE CharRange; //保存状态 SetSel(-1L, -1L); GetSel(CharRange.cpMin, CharRange.cpMax); bResumeSelect = (CharRange.cpMax != CharRange.cpMin); //搜索变量 LPCTSTR pszHttp = TEXT("http://"); const INT nHttpLength = lstrlen(pszHttp); const INT nStringLength = lstrlen(pszString); //索引定义 INT nStringStart = 0; INT nStringPause = 0; //字符解释 for (INT i = 0; i < nStringLength; i++) { //变量定义 INT nUrlPause = i; //地址判断 if (((i + nHttpLength) < nStringLength) && (memcmp(&pszString[i], pszHttp, nHttpLength * sizeof(TCHAR)) == 0)) { //设置索引 nUrlPause = i + nHttpLength; //地址搜索 while (nUrlPause < nStringLength) { //字符判断 if (EFFicacyUrlChar(pszString[nUrlPause]) == true) { nUrlPause++; continue; } break; } } //终止字符 if (nUrlPause <= (i + nHttpLength)) nStringPause = (i + 1); //插入字符 if ((i == (nStringLength - 1)) || (nUrlPause > (i + nHttpLength))) { //普通字符 if (nStringPause > nStringStart) { //获取缓冲 CString strNormalString; LPTSTR pszNormalString = strNormalString.GetBuffer(nStringPause - nStringStart + 1); //拷贝字符 pszNormalString[nStringPause - nStringStart] = 0; CopyMemory(pszNormalString, &pszString[nStringStart], (nStringPause - nStringStart) * sizeof(TCHAR)); //释放缓冲 strNormalString.ReleaseBuffer(); //插入消息 SetSel(-1L, -1L); SetWordCharFormat(CharFormat); ReplaceSel((LPCTSTR)strNormalString); } //设置索引 nStringStart = __max(i, nUrlPause); } //设置索引 i += (nUrlPause - i); } //状态设置 if (bResumeSelect == true) SetSel(CharRange); else PostMessage(WM_VSCROLL, SB_BOTTOM, 0); return true; } //回调函数 /////////////////////////////////////////////////////////////////////////// //加载回调 DWORD CALLBACK CTraceServiceControl::LoadCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb) { return 0; } //保存回调 DWORD CALLBACK CTraceServiceControl::SaveCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb) { return 0; } //菜单命令 /////////////////////////////////////////////////////////////////////////// //删除消息 VOID CTraceServiceControl::OnClearAll() { SetWindowText(NULL); } //全部选择 VOID CTraceServiceControl::OnSelectAll() { __super::SetSel(0, __super::GetTextLength()); } //拷贝字符 VOID CTraceServiceControl::OnCopyString() { __super::Copy(); } //保存信息 VOID CTraceServiceControl::OnSaveString() { char* old_local = _strdup(setlocale(LC_CTYPE, NULL)); setlocale(LC_CTYPE, "chs"); CFileDialog dlg(FALSE, TEXT("*.txt"), NULL, 4 | 2, TEXT("信息|*.txt||")); if (dlg.DoModal() == IDOK) { CString m_filename = dlg.GetPathName(); CString strInput; GetWindowText(strInput); CFile file(m_filename, CFile::modeCreate | CFile::modeWrite); #ifdef UNICODE WCHAR wFlag = 0xFEFF; file.Write(&wFlag, sizeof(WCHAR)); #endif //UNICODE file.Write(strInput, strInput.GetLength()); file.Close(); } setlocale(LC_CTYPE, old_local); free(old_local); } //删除字符 VOID CTraceServiceControl::OnDeleteString() { ReplaceSel(NULL, true); } //消息映射 /////////////////////////////////////////////////////////////////////////// //建立消息 INT CTraceServiceControl::OnCreate(LPCREATESTRUCT lpCreateStruct) { /*return __super::OnCreate(lpCreateStruct);*/ if (__super::OnCreate(lpCreateStruct) == -1) return -1; CTraceService::SetTraceService(this); return 0; } //右键消息 void CTraceServiceControl::OnRButtonDown(UINT nFlags, CPoint point) { CMenu menu; // 创建弹出菜单 if (menu.CreatePopupMenu()) { ClientToScreen(&point); CHARRANGE sel; GetSel(sel); int nTextLength = GetTextLength(); // 启用删除菜单 - 当有选中文本时可以删除 BOOL bCanDelete = (sel.cpMax != sel.cpMin); // 有选中文本才能删除 menu.AppendMenu(MF_STRING | ((sel.cpMax != sel.cpMin) ? 0 : (MF_DISABLED | MF_GRAYED)), IDM_MENU0, TEXT("复制(&C)\tCtrl+C")); menu.AppendMenu(MF_STRING | ((nTextLength > 0 && (sel.cpMax - sel.cpMin) < nTextLength) ? 0 : (MF_DISABLED | MF_GRAYED)), IDM_MENU1, TEXT("全选(&A)\tCtrl+A")); // 启用删除菜单(当有选中文本时) menu.AppendMenu(MF_STRING | (bCanDelete ? 0 : (MF_DISABLED | MF_GRAYED)), IDM_MENU2, TEXT("删除(&D)\tDel")); menu.AppendMenu(MF_STRING | ((nTextLength > 0) ? 0 : (MF_DISABLED | MF_GRAYED)), IDM_MENU3, TEXT("清除信息")); menu.AppendMenu(MF_SEPARATOR); menu.AppendMenu(MF_STRING | ((nTextLength > 0) ? 0 : (MF_DISABLED | MF_GRAYED)), IDM_MENU4, TEXT("保存信息")); // 显示菜单 menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); } // 调用基类处理 __super::OnRButtonDown(nFlags, point); } //追踪消息 LRESULT CTraceServiceControl::OnTraceServiceMessage(WPARAM wParam, LPARAM lParam) { return 0; }
最新发布
11-07
// Copyright 2022 Dexter.Wan. All Rights Reserved. // EMail: 45141961@qq.com #include "DTSelectFileBPLib.h" #include "Misc/Paths.h" #include "Framework/Application/SlateApplication.h" #include "Windows/AllowWindowsPlatformTypes.h" #include <windows.h> #include <commdlg.h> #include <shlobj.h> #include "Windows/HideWindowsPlatformTypes.h" // 生成文件格式 void UDTSelectFileBPLib::GenerateFileType(const TMap<FString, FString>& FileType, TCHAR szFileTypes[MAX_TYPES], TArray<FString>& ArraySuffix) { // 重置输出数据 ArraySuffix.Empty(); // 开始转换 int nIndex = 0; FString Suffix; for ( const TTuple<FString, FString> & Type : FileType ) { // 无效的选项 if (Type.Key.IsEmpty() || Type.Value.IsEmpty()) { continue; } // 添加显示信息 for ( const TCHAR & C : Type.Key ) { if ( nIndex < MAX_TYPES - 2 ) { szFileTypes[nIndex] = C; Suffix += C; nIndex++; } } // 保存数据 ArraySuffix.Add(Suffix); Suffix.Empty(); // 空\0 nIndex++; // 实际后缀 for ( const TCHAR & C : Type.Value ) { if ( nIndex < MAX_TYPES - 2 ) { szFileTypes[nIndex] = C; Suffix += C; nIndex++; } } // 保存数据 ArraySuffix.Add(Suffix); Suffix.Empty(); // 空\0 nIndex++; } } // 打开文件选择窗口(单选) bool UDTSelectFileBPLib::OpenFileDialog(const FString& DialogTitle, const FString& DefaultPath, const TMap<FString, FString>& FileType, FString& FilePath) { // 重置输出数据 FilePath.Empty(); // 后缀数据 TArray<FString> ArraySuffix; // 格式化拓展名 TCHAR szFileTypes[MAX_TYPES] = {}; memset(szFileTypes, 0, sizeof(szFileTypes)); GenerateFileType(FileType, szFileTypes, ArraySuffix); // 选择窗口属性 TCHAR szBuffer[MAX_PATH] = {0}; memset(szBuffer, 0, sizeof(szBuffer)); OPENFILENAME OepnFile = {}; memset(&OepnFile, 0, sizeof(OepnFile)); OepnFile.lStructSize = sizeof(OepnFile); OepnFile.hwndOwner = (HWND)FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr); OepnFile.lpstrTitle = *DialogTitle; OepnFile.lpstrFilter = szFileTypes; OepnFile.lpstrInitialDir = *DefaultPath; OepnFile.lpstrFile = szBuffer; OepnFile.nMaxFile = sizeof(szBuffer)/sizeof(TCHAR); OepnFile.nFilterIndex = 0; OepnFile.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER; // 打开窗口 if (!GetOpenFileNameW(&OepnFile)) { return false; } // 保存地址 FilePath = szBuffer; return true; } // 打开文件选择窗口(多选) bool UDTSelectFileBPLib::OpenFileMultipleDialog(const FString& DialogTitle, const FString& DefaultPath, const TMap<FString, FString>& FileType, TArray<FString>& FilePath) { // 重置输出数据 FilePath.Empty(); // 后缀数据 TArray<FString> ArraySuffix; // 格式化拓展名 TCHAR szFileTypes[MAX_TYPES] = {}; memset(szFileTypes, 0, sizeof(szFileTypes)); GenerateFileType(FileType, szFileTypes, ArraySuffix); // 选择窗口属性 TCHAR szBuffer[MAX_PATH * 80] = {}; memset(szBuffer, 0, sizeof(szBuffer)); OPENFILENAME OepnFile = {}; memset(&OepnFile, 0, sizeof(OepnFile)); OepnFile.lStructSize = sizeof(OepnFile); OepnFile.hwndOwner = (HWND)FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr); OepnFile.lpstrTitle = *DialogTitle; OepnFile.lpstrFilter = szFileTypes; OepnFile.lpstrInitialDir = *DefaultPath; OepnFile.lpstrFile = szBuffer; OepnFile.nMaxFile = sizeof(szBuffer)/sizeof(TCHAR); OepnFile.nFilterIndex = 0; OepnFile.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER|OFN_ALLOWMULTISELECT; // 打开窗口 if (!GetOpenFileNameW(&OepnFile)) { return false; } // 保存目录 TCHAR szPath[MAX_PATH] = {}; memset(szPath, 0, sizeof(szPath)); lstrcpyn(szPath, OepnFile.lpstrFile, OepnFile.nFileOffset); szPath[OepnFile.nFileOffset] = '\0'; // 把指针移到第一个文件 TCHAR * pName = OepnFile.lpstrFile + OepnFile.nFileOffset; while(*pName) { FString File(szPath); File += TEXT("\\"); File += pName; FilePath.Add(File); pName += lstrlen(pName) + 1; //移至下一个文件 } return true; } // 保存文件选择窗口(单选) bool UDTSelectFileBPLib::SaveFileDialog(const FString& DialogTitle, const FString& DefaultPath, const TMap<FString, FString>& FileType, FString& FilePath) { // 重置输出数据 FilePath.Empty(); // 后缀数据 TArray<FString> ArraySuffix; // 格式化拓展名 TCHAR szFileTypes[MAX_TYPES] = {}; memset(szFileTypes, 0, sizeof(szFileTypes)); GenerateFileType(FileType, szFileTypes, ArraySuffix); // 选择窗口属性 TCHAR szBuffer[MAX_PATH] = {0}; memset(szBuffer, 0, sizeof(szBuffer)); OPENFILENAME SaveFile = {}; memset(&SaveFile, 0, sizeof(SaveFile)); SaveFile.lStructSize = sizeof(SaveFile); SaveFile.hwndOwner = (HWND)FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr); SaveFile.lpstrTitle = *DialogTitle; SaveFile.lpstrFilter = szFileTypes; SaveFile.lpstrInitialDir = *DefaultPath; SaveFile.lpstrFile = szBuffer; SaveFile.nMaxFile = sizeof(szBuffer)/sizeof(TCHAR); SaveFile.nFilterIndex = 0; SaveFile.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER; // 打开窗口 if (!GetSaveFileNameW(&SaveFile)) { return false; } // 保存地址 FilePath = szBuffer; if (FPaths::GetExtension(FilePath).IsEmpty()) { const int nIndex = SaveFile.nFilterIndex * 2 - 1; if (nIndex < ArraySuffix.Num()) { FilePath += FPaths::GetExtension(ArraySuffix[nIndex], true); } } return true; } // 目录回调函数 FString OpenDefaultDirectory; int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { if (uMsg == BFFM_INITIALIZED) { ::SendMessageW(hwnd, BFFM_SETSELECTION, 1, (LPARAM)(*OpenDefaultDirectory)); } return 0; } // 选择目录(单选) bool UDTSelectFileBPLib::OpenDirectoryDialog(const FString& DialogTitle, const FString& DefaultDirectory, bool bNewFolder, FString& DirectoryPath) { // 重置输出数据 DirectoryPath.Empty(); // 保存地址 OpenDefaultDirectory = DefaultDirectory; // 文件浏览信息 BROWSEINFO BrowseInfo; BrowseInfo.hwndOwner = (HWND)FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr); BrowseInfo.pidlRoot = nullptr; BrowseInfo.pszDisplayName = nullptr; BrowseInfo.lpszTitle = *DialogTitle; // 显示位于对话框左上部的提示信息 BrowseInfo.ulFlags = BIF_DONTGOBELOWDOMAIN|BIF_RETURNONLYFSDIRS; if (bNewFolder) BrowseInfo.ulFlags |= BIF_NEWDIALOGSTYLE; BrowseInfo.lpfn = BrowseCallbackProc; BrowseInfo.iImage = 0; // 调用选择对话框 const LPITEMIDLIST pItem = SHBrowseForFolderW(&BrowseInfo); if (pItem == nullptr) { return false; } // 获取选择目录 TCHAR szFolder[MAX_PATH]; SHGetPathFromIDListW(pItem, szFolder); DirectoryPath = szFolder; if (!FPaths::IsDrive(DirectoryPath)) { DirectoryPath += TEXT("\\"); } return true; } // 运行文件 bool UDTSelectFileBPLib::RunFile(const FString & FilePath) { if (FilePath.IsEmpty() || !FPaths::FileExists(FilePath)) { return true; } return FPlatformMisc::OsExecute(TEXT("open"), *FilePath); } 帮我看一下有选择文件夹并返回地址的选项吗
07-25
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值