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

这篇具有很好参考价值的文章主要介绍了MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 };

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

初始化对话框时添加

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对话框的退出过程

MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能),MFC开发,mfc,notepad++,c++文章来源地址https://www.toymoban.com/news/detail-570685.html

到了这里,关于MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习Bootstrap 5的第十六天

    目录 Flex(弹性)布局 弹性盒子(flexbox) 水平方向 垂直方向 对齐内容 等宽 伸展 顺序 自动外边距 包裹 对齐内容 子元素对齐 指定子元素对齐 响应式 Flex 类 Bootstrap 3 和 Bootstrap 4 5 的最大区别在于 Bootstrap 5 现在使用 flexbox 而不是浮动来处理布局。 弹性的框布局模块,可以更轻

    2024年02月06日
    浏览(38)
  • 秒懂百科,C++如此简单丨第十六天:指针

    目录 必看信息 Everyday English 前言  📝了解指针 📝定义指针 📝分析指针 📝运用指针 总结 ▶本篇文章由爱编程的小芒果原创,未经许可,严禁转载。 ▶本篇文章被收录于秒懂百科,C++如此简单专栏,欢迎订阅。 专栏亮点 1.每篇文章质量高,质量分保证在80分以上。 2.文章

    2024年02月01日
    浏览(57)
  • 数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)

    目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 从前的日色变得慢,车,马,邮件都慢,一生,只够爱一个人。 二叉树的层序遍历可以使用广度优先搜索(BFS)来实现。具体步骤如下: 创建一个队列 queue,并将根节点入队。 当队列不为空时,重复执行以下步骤:

    2024年02月22日
    浏览(36)
  • 【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

    1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.Keil配置使用(使用 RASC 生成 Keil 工程) 6.Keil配置使用(使用 RASC 生成 Keil 工程)

    2024年02月01日
    浏览(78)
  • 算法训练第四十六天

    139. 单词拆分 - 力扣(LeetCode) 总结:自己一开始想的利用回溯来解决但是也考虑到可能会超时,从动归角度入手,自己没有弄清楚dp数组的含义而导致没有正确解决问题,此题的dp数组是当字符串的子串长度为i时,dp[i]表示能否用给定字典中的串表示出来,此题是一个排列的

    2024年02月11日
    浏览(43)
  • 学习JAVA打卡第四十六天

    Date和Calendar类 Date类 ⑴使用无参数构造方法 使用Date 类的无参数构造方法创建的对象可以获取本机的当前日期和时间,例如: Date nowtime =new Date(); ⑵使用带参数的构造方法 计算机系统将其自身的时间的设“公元”设置在1970年1月1日零时可(格林威治时间),可以根据这个

    2024年02月11日
    浏览(46)
  • 代码随想录-刷题第五十六天

    先介绍单调栈类型的题目, 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时就要想到可以用单调栈 。时间复杂度为O(n)。 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优

    2024年01月17日
    浏览(38)
  • 学C的第二十六天【指针的进阶(二)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十五天【指针的进阶(一)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月13日
    浏览(64)
  • 第九十六天学习记录:Linux基础:实用操作Ⅰ

    注:第一张图与学习记录无关,是为了参与CSDN的AI绘图活动 1、Linux某些程序的运行,如果想要强制停止它,可以使用快捷键Ctrl+C中止 2、在命令输入错误时,也可以通过快捷键Ctrl+C快速退出当前输入 1、可以通过快捷键:Ctrl+D,退出账户的登录 2、退出某些特定程序的专属页面

    2024年02月12日
    浏览(55)
  • 第八十六天学习记录:Linux基础:基础指令Ⅰ

    Linux的目录结构是一个树型结构 Linux没有盘符的概念,只有一个根目录/,所有文件都在根目录下面 在Linux系统中,路径之间的层级关系使用:/来表示。(windows系统中用) 例如: /test/hello.txt /Chung.txt /Chung/test/hello.txt 无论是什么命令,用于什么用途,在Linux中,命令有其通用

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包