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

文章目录

  • 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.mfbz.cn/a/40521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端】自制密码展示隐藏按钮

效果 一、前期准备 使用的图片是iconfront上拿的svg代码环境是Vue2 Element 二、创建组件 showPasswordAndclose <template><span class"show-password-container"><span v-if"chooseType CLOSE" click"changeType"><…

手机图片怎么转pdf格式?这几个图片转换方式了解一下

手机图片怎么转pdf格式&#xff1f;将图片转换为PDF的应用场景非常广泛。例如&#xff0c;你可以将多张照片转换为PDF&#xff0c;然后将其作为一本电子相册保存。你也可以将多张图片转换为PDF&#xff0c;然后将其作为一份报告或文档的附件发送给他人。此外&#xff0c;许多人…

数据结构双向链表,实现增删改查

一、双向链表的描述 在单链表中&#xff0c;查找直接后继结点的执行时间为O(1)&#xff0c;而查找直接前驱的执行时间为O(n)。为克服单链表这种单向性的缺点&#xff0c;可以用双向链表。 在双向链表的结点中有两个指针域&#xff0c;一个指向直接后继&#xff0c;另一个指向直…

Python应用实例(二)数据可视化(二)

数据可视化&#xff08;二&#xff09; 1.随机漫步1.1 创建RandomWalk类1.2 选择方向1.3 绘制随机漫步图1.4 模拟多次随机漫步1.5 设置随机漫步图的样式 1.随机漫步 使用Python来生成随机漫步数据&#xff0c;再使用Matplotlib以引人瞩目的方式将这些数据呈现出来。随机漫步是…

vscode远程连接提示:过程试图写入的管道不存在(删除C:\Users\<用户名>\.ssh\known_hosts然后重新连接)

文章目录 复现过程原因解决方法总结 复现过程 我是在windows上用vscode远程连接到我的ubuntu虚拟机上&#xff0c;后来我的虚拟机出了点问题&#xff0c;我把它回退了&#xff0c;然后再连接就出现了这个问题 原因 本地的known_hosts文件记录服务器信息与现服务器的信息冲突了…

reggie优化06-项目部署

1、部署架构 2、部署环境 3、部署前端 4、部署后端 修改图片位置&#xff0c;并push至仓库

【System Verilog and UVM基础入门17】Using get_next_item()

从小父亲就教育我&#xff0c;做一个对社会有用的人&#xff01; 关于握手协议的文章&#xff0c;网上有很多很多&#xff0c;这篇文章是最原滋原味的介绍&#xff0c;希望可以帮助到有缘人&#xff01; uvm_driver #(REQ,RSP) The base class for drivers that initiate req…

k8s如何访问 pod 元数据

如何访问 pod 元数据 **我们在 pod 中运行容器的时候&#xff0c;是否也会有想要获取当前 pod 的环境信息呢&#xff1f;**咱们写的 yaml 清单写的很简单&#xff0c;实际上部署之后&#xff0c; k8s 会给我们补充在 yaml 清单中没有写的字段&#xff0c;那么我们的 pod 环境信…

Python:基于matplotlib与mayavi的3D可视化(点云+等值面)

文章目录 一、3D可视化常用方法二、三维图像在numpy、cv2、以及tifffile.imread中通道的区别三、项目实战 1、基于matplotlib的3D可视化&#xff08;体素体&#xff09; 2、基于mayavi的3D可视化2.0、mayavi使用指南&#xff08;鼠标&#xff09;2.1、mlab.points3d()参数详解…

青岛大学_王卓老师【数据结构与算法】Week05_10_顺序栈的操作3_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

【区块链+体育】“数智化”的杭州亚运会,中创助力区块链技术发展

“智能”&#xff0c;是杭州亚运会的办赛理念之一。除了数字藏品开亚运先河&#xff0c;杭州亚组委充分应用区块链、大数据、人工智能等前沿技术&#xff0c;为观众提供从购票、出行、观赛到住宿、美食和旅游等“一站式”服务。 本次亚运会将全程智能陆续落到了实处&#xff0…

简述直线导轨的预压力

直线导轨的预压力是预先给予钢珠负荷力&#xff0c;通俗来说就是加大钢珠直径&#xff0c;利用钢珠和珠道之间负向间隙给予预压&#xff0c;这个举动可以提高直线滑轨的刚性和消除间隙&#xff0c;值得注意的一点是小规格建议选用轻预压以下的预压&#xff0c;避免因为预压选用…

【Spring Boot】Web开发 — Web开发简介

Web开发简介 首先介绍Spring Boot 提供的Web组件spring-boot-starter-web&#xff0c;然后介绍Controller和RestController注解&#xff0c;以及控制数据返回的ResponseBody注解&#xff0c;最后介绍Web配置&#xff0c;以便让读者对使用Spring Boot开发Web系统有初步的了解。…

C# 动态字典(可以随机实时增删访问,保证先入先出的字典)

如果你有以下需求&#xff1a; 1. 需要对Dictionary进行遍历的同时移除或者添加元素 2. 需要按顺序遍历Dictionary并且保证先入先出 3. 需要即时的获取字典内的元素数量&#xff0c;即时增删 如果你觉得好&#xff0c;请给我的框架点一个免费的star&#xff0c;球球啦 Yueh0607…

TX Barcode .NET for WPF Crack

TX Barcode .NET for WPF Crack 用于WPF软件的TX Barcode.NET包括一天完成的功能以及用于WPF的软件的2D条形码控制。 用于WPF的TX Barcode.NET的功能和属性&#xff1a; 它具有以下特性和属性&#xff0c;如&#xff1a; 常见的文字处理功能&#xff1a;它可以为用户和开发人员…

一百三十、海豚调度器——用DolphinScheduler定时调度HiveSQL任务

一、目标 用海豚调度器对Hive数仓各层数据库的SQL任务进行定时调度。比如&#xff0c;DWD层脱敏清洗表的动态插入数据、DWS层指标表的动态插入数据 二、工具版本 1、海豚调度器&#xff1a;apache-dolphinscheduler-2.0.5-bin.tar.gz 2、Hive&#xff1a;apache-hive-3.1.2…

selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()

目录 强制等待:sleep() 隐式等待:implicitly_wait() 显示等待:WebDriverWait() 与until()或者until_not()方法结合使用 WebDriverWait与expected_conditions结合使用 显示等待,自定义等待条件 强制等待:sleep() import time sleep(5) #等待5秒 设置固定休眠时间&#x…

webpack打包

webpack打包 1、webpack再次打包2、webpack的入口和出口 1、webpack再次打包 背景&#xff1a;代码增加之后&#xff0c;如何打包呢&#xff1f; 1、确保在src/index.js引用和使用 2、重新执行yarn build打包命令 2、webpack的入口和出口 1、新建webpack.config.js配置文件 …

Redis的五大数据类型和各自的

- 字符串(String) string 数据结构是简单的 key-value 类型。简单动态字符串**&#xff08;simple dynamic string&#xff0c;SDS&#xff09;。相比于 C 的原生字符串&#xff0c;Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据&#xff0c;并且获取字符串长度复杂度…

django框架向DRF框架演变过程详解

一、Django框架实现项目查询接口 主要知识点&#xff1a; Django框架视图函数 1、在 Django 项目中创建一个应用&#xff08;如果还没有创建&#xff09;&#xff1a; python manage.py startapp projects 2、在项目的 models.py 文件中定义项目模型 from django.db impor…
最新文章