MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

news2024/12/26 12:36:46

文章目录

  • CCommonDialog
  • CFileDialog
  • CEdit
  • 托盘技术
  • 进程的启动
  • 附录1:启动线程方式
  • 附录2:MFC对话框的退出过程

CCommonDialog

通用对话框 CCommonDialog
这些对话框类封装 Windows 公共对话框。 它们提供了易于使用的复杂对话框实现。
CFileDialog
提供用于打开或保存文件的标准对话框。

CColorDialog
提供用于选择颜色的标准对话框。

CFontDialog
提供用于选择字体的标准对话框。

CFindReplaceDialog
为搜索和替换操作提供标准对话框。

CPrintDialog
提供用于打印文件的标准对话框。

CPrintDialogEx
提供 Windows 打印属性表。

CPageSetupDialog
显示和配置页面设置的标准对话框

CFileDialog

其中较为常用的是CFileDialog的构造函数以及GetPathName()

GetPathName()是CFileDialog类的一个成员函数,用于获取用户选择的文件的完整路径名。当用户在打开或保存对话框中选择了一个文件后,可以通过调用GetPathName()函数来获取该文件的完整路径名。该函数的返回值是一个CString对象,包含了用户选择的文件的完整路径名。

class CFileDialog : public CCommonDialog
{
	DECLARE_DYNAMIC(CFileDialog)

public:
// Attributes
	__declspec(property(get=GetOFN)) OPENFILENAME m_ofn;
	const OPENFILENAME& GetOFN() const;
	OPENFILENAME& GetOFN();
	LPOPENFILENAME m_pOFN;

// Constructors
	explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
		LPCTSTR lpszDefExt = NULL,
		LPCTSTR lpszFileName = NULL,
		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		LPCTSTR lpszFilter = NULL,
		CWnd* pParentWnd = NULL,
		DWORD dwSize = 0,
		BOOL bVistaStyle = TRUE);
	virtual ~CFileDialog();

// Operations
	virtual INT_PTR DoModal();

	/// <summary>
	/// Determines if the current dialog in folder picker mode.</summary>
	/// <returns>
	/// If the dialog in the folder picker mode, the return value is TRUE. Otherwise - FALSE</returns>
	BOOL IsPickFoldersMode() const { return m_bPickFoldersMode; }

	/// <summary>
	/// Determines if the current dialog in non-file system folder picker mode.</summary>
	/// <returns>
	/// If the dialog in the non-file system folder picker mode, the return value is TRUE. Otherwise - FALSE</returns>
	BOOL IsPickNonFileSysFoldersMode() const { return m_bPickNonFileSysFoldersMode; }

	// Helpers for parsing file name after successful return
	// or during Overridable callbacks if OFN_EXPLORER is set
	CString GetPathName() const;  // return full path and filename
	CString GetFileName() const;  // return only filename
	CString GetFileExt() const;   // return only ext
	CString GetFileTitle() const; // return file title
	BOOL GetReadOnlyPref() const; // return TRUE if readonly checked

	// Enumerating multiple file selections
	POSITION GetStartPosition() const;
	CString GetNextPathName(POSITION& pos) const;

	// Helpers for custom templates
	void SetTemplate(UINT nWin3ID, UINT nWin4ID);
	void SetTemplate(LPCTSTR lpWin3ID, LPCTSTR lpWin4ID);

	// Other operations available while the dialog is visible
	CString GetFolderPath() const; // return full path
	void SetControlText(int nID, LPCTSTR lpsz);
	void HideControl(int nID);
	void SetDefExt(LPCTSTR lpsz);

	virtual void UpdateOFNFromShellDialog();
	void ApplyOFNToShellDialog();
	IFileOpenDialog* GetIFileOpenDialog() throw();
	IFileSaveDialog* GetIFileSaveDialog() throw();
	IFileDialogCustomize* GetIFileDialogCustomize() throw();
protected:
	BOOL m_bVistaStyle;
	BOOL m_bPickFoldersMode;
	BOOL m_bPickNonFileSysFoldersMode;
	DWORD m_dwCookie;
	void* m_pIFileDialog;
	void* m_pIFileDialogCustomize;

	BOOL m_bOpenFileDialog;       // TRUE for file open, FALSE for file save
	CString m_strFilter;          // filter string
						// separate fields with '|', terminate with '||\0'
	TCHAR m_szFileTitle[_MAX_FNAME];       // contains file title after return
	TCHAR m_szFileName[_MAX_PATH]; // contains full path name after return

	OPENFILENAME*  m_pofnTemp;
};

下面对其构造函数参数详解与CFileDialog的相应属性

explicit CFileDialog(
   BOOL bOpenFileDialog, 	//指定什么类型对话框去创建
   LPCTSTR lpszDefExt = NULL,	//指定默认的文件扩展名。可以为NULL,表示没有默认扩展名。
   LPCTSTR lpszFileName = NULL, //指定默认的文件名。可以为NULL,表示没有默认文件名
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //指定对话框的标志
   LPCTSTR lpszFilter = NULL, //指定文件过滤器。用于过滤文件类型,使用户只能选择指定类型的文件
   CWnd* pParentWnd = NULL, //指定父窗口。可以为NULL,表示使用默认的父窗口
   DWORD dwSize = 0,	//指定对话框的大小。可以为0,表示使用默认大小。
   BOOL bVistaStyle = TRUE //指定对话框的样式是否为Vista风格。如果为TRUE,表示使用Vista风格;如果为FALSE,表示使用旧的样式。
);
Set it to TRUE to construct a File Open dialog box. 代入这个参数(TRUE)去构建文件打开的对话框。
Set it to FALSE to construct a File Save As dialog box.代入FALSE去构建一个另存为对话框。
#define OFN_READONLY                 0x00000001
#define OFN_OVERWRITEPROMPT          0x00000002
#define OFN_HIDEREADONLY             0x00000004
#define OFN_NOCHANGEDIR              0x00000008
#define OFN_SHOWHELP                 0x00000010
#define OFN_ENABLEHOOK               0x00000020
#define OFN_ENABLETEMPLATE           0x00000040
#define OFN_ENABLETEMPLATEHANDLE     0x00000080
#define OFN_NOVALIDATE               0x00000100
#define OFN_ALLOWMULTISELECT         0x00000200
#define OFN_EXTENSIONDIFFERENT       0x00000400
#define OFN_PATHMUSTEXIST            0x00000800
#define OFN_FILEMUSTEXIST            0x00001000
#define OFN_CREATEPROMPT             0x00002000
#define OFN_SHAREAWARE               0x00004000
#define OFN_NOREADONLYRETURN         0x00008000
#define OFN_NOTESTFILECREATE         0x00010000
#define OFN_NONETWORKBUTTON          0x00020000
#define OFN_NOLONGNAMES              0x00040000     // force no long names for 4.x modules
#if(WINVER >= 0x0400)
#define OFN_EXPLORER                 0x00080000     // new look commdlg
#define OFN_NODEREFERENCELINKS       0x00100000
#define OFN_LONGNAMES                0x00200000     // force long names for 3.x modules
// OFN_ENABLEINCLUDENOTIFY and OFN_ENABLESIZING require
// Windows 2000 or higher to have any effect.
#define OFN_ENABLEINCLUDENOTIFY      0x00400000     // send include message to callback
#define OFN_ENABLESIZING             0x00800000
#endif /* WINVER >= 0x0400 */
#if (_WIN32_WINNT >= 0x0500)
#define OFN_DONTADDTORECENT          0x02000000
#define OFN_FORCESHOWHIDDEN          0x10000000    // Show All files including System and hidden files
#endif // (_WIN32_WINNT >= 0x0500)

CEdit

CEdit是MFC中的一个类,用于创建和操作单行或多行的文本框控件。CEdit类继承自CWnd类,并提供了一系列函数和属性来管理文本框的内容、样式和行为。

通过CEdit类,你可以创建一个文本框控件,并对其进行各种操作,如设置文本内容、获取文本内容、设置文本样式、处理文本框消息等。

// NOTE: This class must remain a binary-compatible subset
// of CEditView. Do not add data members or virtual functions
// directly to this class.
class CEdit : public CWnd
{
public:	
	BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
//WS_CHILD|WS_VISIBLE|ES_MULTILINE...

	BOOL GetModify() const; //被修改过的标识
	void SetModify(BOOL bModified = TRUE); //清理或者设置修改标识
#if defined(UNICODE) Unicode版本支持显示气球
	CString GetCueBanner() const;

	BOOL ShowBalloonTip(_In_z_ LPCWSTR lpszTitle, _In_z_ LPCWSTR lpszText, _In_ INT ttiIcon = TTI_NONE); 	//气球提示
	BOOL ShowBalloonTip(_In_ PEDITBALLOONTIP pEditBalloonTip);
	BOOL HideBalloonTip(); //隐藏气球提示
#endif  // (UNICODE)
// Attributes
	
	int GetLineCount() const; //获取文本框中的行数
	
	void GetRect(LPRECT lpRect) const; //获取矩形
	DWORD GetSel() const; //获取选中文字的位置
	void GetSel(int& nStartChar, int& nEndChar) const;
	
	void SetMargins(UINT nLeft, UINT nRight); //设置边栏
	DWORD GetMargins() const;

	void SetLimitText(UINT nMax);//设置编辑框最大文字数量
	UINT GetLimitText() const;
	CPoint PosFromChar(UINT nChar) const; //坐标与字符索引的映射
	int CharFromPos(CPoint pt) const;//相反的映射

	int LineFromChar(int nIndex = -1) const; //行数和字符索引的映射
	int LineIndex(int nLine = -1) const;//反向映射
	int LineLength(int nLine = -1) const; //获取第几行的长度
	void LineScroll(int nLines, int nChars = 0);//滚动多少行,负数向上,正数向下
	
	int GetLine(_In_ int nIndex, _Out_ LPTSTR lpszBuffer) const; //获取第几行文字(\r\n)
	// NOTE: may not return null character
	int GetLine (int nIndex, LPTSTR lpszBuffer,int nMaxLength) const; //有缓冲区边界限制

// Operations
	
	BOOL FmtLines(BOOL bAddEOL);

	void LimitText(int nChars = 0);
	
	void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);
	void SetPasswordChar(TCHAR ch); //设置密码
	void SetRect(LPCRECT lpRect);
	void SetRectNP(LPCRECT lpRect);
	void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE);
	void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE);
	BOOL SetTabStops(int nTabStops, LPINT rgTabStops);
	void SetTabStops();
	BOOL SetTabStops(const int& cxEachStop);    // takes an 'int'

	// Clipboard operations
	BOOL CanUndo() const;
	void EmptyUndoBuffer(); //清空Undo的内容
	BOOL Undo();
	void Clear();
	void Copy();
	void Cut();
	void Paste();

	BOOL SetReadOnly(BOOL bReadOnly = TRUE);
	int GetFirstVisibleLine() const;
	TCHAR GetPasswordChar() const;
};

托盘技术

可参照下方链接: https://blog.csdn.net/japhydream/article/details/5062635

在主对话框的头文件添加相应消息

enum { UM_NOTIFYICON = WM_USER +888 };

在这里插入图片描述

初始化对话框时添加

auto hIcon = theApp.LoadIcon(IDR_MAINFRAME);
NOTIFYICONDATA nd;
	nd.cbSize = sizeof(NOTIFYICONDATA);
	nd.hWnd = m_hWnd;
	nd.uID = IDR_MAINFRAME; //编号 类似于SetTimer(1,
	nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	nd.uCallbackMessage = UM_NOTIFYICON; //用户消息
	nd.hIcon = hIcon;
_tcscpy_s(nd.szTip, _countof(nd.szTip), _T("记事本平台"));
Shell_NotifyIcon(NIM_ADD, &nd);

对话框关闭时添加删除

	NOTIFYICONDATA nd{sizeof(nd),m_hWnd,IDR_MAINFRAME};
	//nd.cbSize = sizeof(NOTIFYICONDATA);
	//nd.hWnd = m_hWnd;
	//nd.uID = IDR_MAINFRAME;  
	Shell_NotifyIcon(NIM_DELETE, &nd);

对对应消息的进行处理

void CMainDlg::ShowMenu()
{
	CMenu menu;	//全部菜单的加载
	if (!menu.LoadMenu(IDR_MAINFRAME)) //加载托盘的菜单栏      
		return;
	CMenu* pPopup = menu.GetSubMenu(0); //获取第几列
	ASSERT(pPopup != NULL);
	CPoint Point;

	GetCursorPos(&Point);
	SetForegroundWindow();
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
}
LRESULT CMainDlg::OnUmNotifyicon(WPARAM wParam, LPARAM lParam)
{
	switch (lParam)
	{
	case WM_LBUTTONDBLCLK:
		ShowWindow(SW_SHOWNORMAL);//显示窗口主体
		break;
	case WM_RBUTTONDOWN://点击右键
		ShowMenu();
		break;
	default:
		break;
	}
	return 0;
}

进程的启动

启动进程方法:
a)system:只用于DOS程序(控制台程序)
b)WinExec:早期windows简单进程启动函数
c)ShellExecute(推荐):网页链接、文档和执行文件
d)CreateProcess

可参照下方链接:https://blog.csdn.net/weixin_34378969/article/details/92450910

void CMainDlg::OnFileNew()
{
	if(Prompt())
		m_edit.SetWindowText(_T(""));
}
	CString str =s;
	str += _T(" C:\\Finish.log");
	WinExec(_bstr_t(str), SW_SHOWNORMAL);  //早期Windows

ShellExecute(NULL, _T("open"), _T("C:\\Finish.log"), NULL, NULL, SW_SHOWNORMAL);  //打开文档
ShellExecute(NULL, _T("open"), _T("http://www.4399.com"), NULL, NULL, SW_SHOWNORMAL);//打开链接
ShellExecute(NULL, _T("open"), _T("mspaint.exe"), _T("F:\\2023\\MFC开发\\6、MFC智能工业开发第21天\\MFC对话框的退出过程.png"), NULL, SW_SHOWNORMAL);  //打开执行文件
void CMainDlg::OnFileNewWindow()
{
	TCHAR s[MAX_PATH];
	if (GetModuleFileName(theApp.m_hInstance, s, _countof(s)) <= 0)
	{
		AfxMessageBox(_T("新建窗口失败"));
		return;
	}
	ShellExecute(m_hWnd, _T("open"), s, NULL, NULL, SW_SHOWNORMAL);
	//_tsystem(s); //建立新进程时会带有dos窗口  仅执行文件
}

附录1:启动线程方式

a)beginthread和beginthreadex:
b)API:CreateThread:类似于fopen的底层CreateFile,beginthread的底层也是CreateThread
c)AfxBeginThread好像也是重新改写一下参数,还是调用CreateThread底层API
d)MFC还有一个CWinThread类也可以启动线程。

CWinThread* AfxBeginThread( 
   AFX_THREADPROC pfnThreadProc, 
   LPVOID pParam, 
   int nPriority = THREAD_PRIORITY_NORMAL, 
   UINT nStackSize = 0, 
   DWORD dwCreateFlags = 0, 
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL  
); 
HANDLE WINAPI CreateThread(
  _In_opt_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_       SIZE_T dwStackSize,
  _In_       LPTHREAD_START_ROUTINE lpStartAddress,
  _In_opt_   LPVOID lpParameter,
  _In_       DWORD dwCreationFlags,
  _Out_opt_  LPDWORD lpThreadId
);

附录2:MFC对话框的退出过程

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Git上传大文件模型(超过100MB)教程

目录 modelscope官方教程 服务器拒绝的解决方案 检查.gitattributes文件 modelscope官方教程 我们

Amazon 上的数字孪生:使用 L3 预测性数字孪生来预测“行为”

在上一篇博文中&#xff0c;我们讨论了数字孪生的定义和框架&#xff0c;这与我们的客户在其应用中使用数字孪生的方式一致。我们将数字孪生定义为“单个物理系统的动态数字表示&#xff0c;它通过数据进行动态更新以模仿物理系统的真实结构、状态和行为&#xff0c;从而加快获…

Vue3+ts;枚举(enum);Partial全部可选/Pick选一部分/配置 svg 图标/unplugin-vue-components组件自动按需加载

项目的创建 使用 create-vue 脚手架创建项目。 1.执行创建命令 pnpm create vue # or npm init vuelatest # or yarn create vue2.选择项目依赖内容。 ✔ Project name: … //项目名 ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router …

macOS 开发 - 纯代码生成 Window

文章目录 1、创建项目删除项目自带 window创建 BaseWindowController 继承自 NSWindowController子 WC 继承 BaseWC个人更喜欢纯代码:控制力、方便复制,不用卡卡的打开 xib 这里不使用各种项目自带的 storyboard/xib,使用纯代码创建 window(controller) 本示例代码将创建如下…

记录一下Mybatis中的if标签使用时遇到的问题

记录一下Mybatis中的if标签使用时遇到的问题 前言一、if标签遇到的问题二、if标签中""和的问题字符串等于条件的两种写法&#xff1a; 三 、总结 前言 今天在项目中进行查询时使用了if标签&#xff0c;遇到了问题&#xff1a; 开始时拉过代码来的时候是这样的 <…

Java关键字interface(接口)

文章目录 接口的理解接口的声明接口的成员说明接口的使用规则类实现接口&#xff08;implements&#xff09; 接口的多实现接口的多继承(extends)接口与实现类对象构成多态引用使用接口的静态成员使用接口的非静态方法JDK8中相关冲突问题总结小测试接口与抽象类之间的对比练习 …

不允许你不知道的 MySQL 优化实战(二)

文章目录 11、使用联合索引时&#xff0c;注意索引列的顺序&#xff0c;一般遵循最左匹配原则。12、对查询进行优化&#xff0c;应考虑在where及order by涉及的列上建立索引&#xff0c;尽量避免全表扫描。13、如果插入数据过多&#xff0c;考虑批量插入。14、在适当的时候&…

[QT编程系列-9]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自动布局

目录 3. QT窗体设计 3.7 自动布局 3.7.1 自动布局 3.7.2 在主窗口中自动布局 3.7.3 在自动布局容器中自动布局 3.7.4 在widget中自动布局 3.7.5 自动布局工件 3. QT窗体设计 3.7 自动布局 3.7.1 自动布局 在QT中&#xff0c;自动布局是一种灵活而强大的方式来管理和排…

【ArcGIS Pro二次开发】(47):要素类追加至空库(批量)

本工具主要是针对国空数据入库而做的。 如果你手头已经整理了一部分要素类数据&#xff0c;但是数据格式&#xff0c;字段值可能并没有完全按照规范设置好&#xff0c;需要将这些数据按规范批量和库&#xff0c;就可以尝试用这个工具。 准备数据&#xff1a;标准空库、你已做…

Vue源码分析拓展 - Vue 模板编译渲染函数原理分析

目录 Vue 模板编译渲染函数 编译 Vue 模板编译渲染函数原理分析.html compiletoFunctions.html compileToFunctions.js vue.2.5.1.源码学习.js 一张AI生成图~ Vue 模板编译渲染函数 new Vue():初始化 $mount:挂载 compile():编译 parse:解析 optimize&#xff1a;静态节…

身份证读卡器安卓SDK在安卓12版本targetSdkVersion=32报错解决办法

之前的东信智能的EST-100身份证读卡器安卓SDK版本V1.0.40在安卓12版本&#xff0c;targetSdkVersion32的时候会出现以下错误&#xff1a; Targeting S (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingInten…

Nginx 解决漏洞扫描 弱CORS策略

主要在nginx配置允许通过的地址 如&#xff1a; if ($http_host !~* 192.168.0.1|127.0.0.1|localhost) { # 允许的ipreturn 403 ; }add_header Access-Control-Allow-Origin $http_origin; #跨域请求

高压放大器到底有什么作用

高压放大器是一种重要的电子元器件&#xff0c;其作用是将信号放大到更高的电压水平&#xff0c;以便供给需要高电压的负载使用。高压放大器被广泛应用于通讯设备、医疗仪器、仿真模拟、气体激光、光学器件等领域。下面安泰电子将详细介绍高压放大器的作用以及其在各领域中的应…

Win11 设置FTP服务详细教程

起因&#xff1a; 因测试需要&#xff0c;本机建立FTP服务测试使用&#xff0c;此文章用于记录使用&#xff01; 操作步骤&#xff1a; 1、配置FTP功能 ①、"winR" > 在运行窗口输入"control" 回车&#xff1b; ②、打开"控制面板" > 点击…

图文讲解Redis延时双删原因及必要性

目录 一、前言 二、常见更新策略 2.1 先删缓存&#xff0c;再更新数据库 2.2 先更新数据库&#xff0c;再删除缓存 2.3 普通双删 2.4 延迟双删 三、建议 一、前言 我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力&#xff0c;但是当更新数据库时&#xff0c;…

今天实习第三天,vue(cli部分)

01.创建第一个vue-cli。这里用的是node.js。早上的时候&#xff0c;就需要把node.js安装上去 02.node.js安装 第一步.去官网下载node.js https://nodejs.org/en 第二步.运行官网下载的node.js的msi文件&#xff08;记住所有的node.js文件的安装包都是msi文件的形式&#xff0…

算法笔记\python 笔记: 相似性度量

1 欧氏距离 1.1 python实现&#xff1a; from scipy.spatial import distance distance.euclidean([1,2],[2,1]) #1.4142135623730951 1.2 标准化欧氏距离 先将数据标准化 &#xff08;减去的均值两两抵消&#xff09; 2 曼哈顿距离 又称为城市街区距离 2.1 python 实现 f…

C++图形开发(16):绘制一个圆环和一根针

文章目录 绘制一个圆环和一根针1.1 绘制1.2 line()函数1.3 circle()函数1.4 setlinestyle()函数1.5 setlinecolor()函数 接下来&#xff0c;我会继续制作一些小游戏&#xff0c;但因为整个难度的上升&#xff08;毕竟我也是初学者&#xff09;&#xff0c;可能文章不会再像之前…

吐血整理,性能测试-Jmeter分布式压测实战(超细详解)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Jmeter的集群模式…

InsCode Stable Diffusion使用教程【InsCode Stable Diffusion美图活动一期】

记录一下如何使用 InsCode Stable Diffusion 进行 AI 绘图以及使用感受。 一、背景介绍 目前市面上比较权威&#xff0c;并能用于工作中的 AI 绘画软件其实就两款。一个叫 Midjourney&#xff08;简称 MJ&#xff09;&#xff0c;另一个叫 Stable Diffusion&#xff08;简称 …