MFC第十七天 CFont类与LOGFONT结构体、记事本文件打开和保存及是否保存的逻辑流程分析、PreTranslateMessage虚函数与快捷键

news/2024/11/8 15:05:01/

文章目录

  • CFont类与LOGFONT结构体
    • CFontDialog
    • 字体信息结构体与HFONT句柄的关系
  • 记事本文件拖入、打开和保存及是否保存的逻辑流程分析
  • PreTranslateMessage虚函数与快捷键
  • 附录

CFont类与LOGFONT结构体

CFontDialog

构造函数介绍

public:
//用于指定字体对话框的初始字体属性,可以是一个LOGFONT结构体指针。如果指定了这个参数,字体对话框将会显示该初始字体属性。 如果为NULL则使用默认字体样式CFontDialog(LPLOGFONT lplfInitial = NULL,DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,CDC* pdcPrinter = NULL,CWnd* pParentWnd = NULL);CFontDialog(const CHARFORMAT& charformat,DWORD dwFlags = CF_SCREENFONTS,CDC* pdcPrinter = NULL,CWnd* pParentWnd = NULL);
//用于指定字体对话框的父窗口指针。如果指定了这个参数,字体对话框将作为该窗口的子窗口显示;如果为NULL,则字体对话框将作为顶级窗口显示。

CFontDialog是一个对话框类,用于显示字体选择对话框,并允许用户选择字体的样式。

class CFontDialog : public CCommonDialog{// Get the selected font (works during DoModal displayed or after)void GetCurrentFont(LPLOGFONT lplf);CString GetFaceName() const;  // return the face name of the fontCString GetStyleName() const; // return the style name of the fontint GetSize() const;          // return the pt size of the fontCOLORREF GetColor() const;    // return the color of the fontint GetWeight() const;        // return the chosen font weightBOOL IsStrikeOut() const;     // return TRUE if strikeoutBOOL IsUnderline() const;     // return TRUE if underlineBOOL IsBold() const;          // return TRUE if bold fontBOOL IsItalic() const;        // return TRUE if italic fontvoid GetCharFormat(CHARFORMAT& cf) const;LOGFONT m_lf; // default LOGFONT to store the infoDWORD FillInLogFont(const CHARFORMAT& cf);
};

字体信息结构体与HFONT句柄的关系

a)CFont类有两个重要的函数是关于两者的转换。
b)如果你有句柄就可以调用CWnd::SetFont设置字体。
c)如果你有字体信息结构体对象,调用CFont::CreateFontIndirect来在CFont对象中产生句柄。
(有点类似于struct tm{年月日时分秒}转为time_t句柄)
d)如果你有句柄,可以调用CFont::GetLogFont获取这个字体的信息(通过LOGFONT对象)

使用句柄生成详细信息
CFont* pFont = m_edit.GetFont();//获取了字体的详细信息
if (!pFont)return;
LOGFONT lf{};
pFont->GetLogFont(&lf);
使用信息结构体生成句柄
LOGFONT lf{21};
lf.lfWeight = 400;//700是粗体 400正常
lf.lfCharSet = GB2312_CHARSET;
_tcscpy_s(lf.lfFaceName, _countof(lf.lfFaceName), _T("楷体"));
m_font.DeleteObject();//摧毁句柄
m_font.CreateFontIndirect(&lf);
m_edit.SetFont(&m_font);
typedef struct tagLOGFONTW{LONG      lfHeight; 字体大小LONG      lfWidth; 拉宽(揪脸蛋子),默认用0代表自然高宽。LONG      lfEscapement;   LONG      lfOrientation;LONG      lfWeight; 粗体:700 正常:400 BYTE      lfItalic; 斜体    //那个年代没有bool型BYTE      lfUnderline; 下划线BYTE      lfStrikeOut; 删除线(横穿)BYTE      lfCharSet; 字符集(ANSI_CHARSET)BYTE      lfOutPrecision;BYTE      lfClipPrecision;BYTE      lfQuality;BYTE      lfPitchAndFamily;WCHAR     lfFaceName[LF_FACESIZE]; //字体名
} LOGFONTW, *PLOGFONTW, NEAR *NPLOGFONTW, FAR *LPLOGFONTW;

示例代码:

void CMainDlg::OnFormatFont()
{CFontDialog dlg;if (dlg.DoModal() == IDCANCEL)return;LOGFONT lf;dlg.GetCurrentFont(&lf);m_font.DeleteObject();m_font.CreateFontIndirect(&lf);m_edit.SetFont(&m_font);
}	

记事本文件拖入、打开和保存及是否保存的逻辑流程分析

在这里插入图片描述

 void CMainDlg::OnDropFiles(HDROP hDrop)
{TCHAR s[MAX_PATH];int nCount = DragQueryFile(hDrop, 0, s, _countof(s));ReadText(s);DragFinish(hDrop);CDialog::OnDropFiles(hDrop);
}
BOOL CMainDlg::Prompt() {		//FALSE代表放弃if (m_edit.GetModify())	{CString str = m_sFile;if (str.IsEmpty())str = _T("无标题");int nRes = AfxMessageBox(_T("你想要更改保存文件") + str + _T(":吗?"), MB_YESNOCANCEL);if (nRes == IDCANCEL)return FALSE;if (nRes == IDYES)if (!SelectFile())return FALSE;}return TRUE;
}
void CMainDlg::UpdateTitle()
{CString str;int n = m_sFile.ReverseFind(_T('\\'));if (n > 0){str = m_sFile.Mid(1 + n);}if (str.IsEmpty())str = _T("无标题");str += _T(" - 记事本");SetWindowText(str);
}
void CMainDlg::OnFileOpen()
{if (m_edit.GetModify())if (!Prompt())return;CFileDialog dlg(TRUE,_T("txt"),NULL,0,m_szFilter);if (IDCANCEL == dlg.DoModal())return;ReadText(dlg.GetPathName());UpdateTitle();
}
BOOL CMainDlg::SelectFile()
{if (m_sFile.IsEmpty()){CFileDialog dlg(FALSE, _T("txt"), NULL, OFN_OVERWRITEPROMPT,m_szFilter);if (IDCANCEL == dlg.DoModal())return FALSE;m_sFile = dlg.GetPathName();OnFileSave();}return TRUE;
}
void CMainDlg::OnFileSave(){if (!SelectFile())return;ASSERT(!m_sFile.IsEmpty());CFile file;if (!file.Open(m_sFile,CFile::modeCreate| CFile::modeWrite))	{AfxMessageBox(_T("保存文件失败!"));return;	}CString str;m_edit.GetWindowText(str);WORD w{ 0xFEFF };		file.Write(&w,sizeof(w));file.Write(str, sizeof(TCHAR) * str.GetLength());file.Close();UpdateTitle();m_edit.SetModify(FALSE);	}
void CMainDlg::OnFileSaveAs()
{CFileDialog dlg(FALSE,_T("txt"), NULL,OFN_OVERWRITEPROMPT);if (IDCANCEL == dlg.DoModal())return;m_sFile =dlg.GetPathName();OnFileSave();
}

PreTranslateMessage虚函数与快捷键

a)我们经常看到消息被控件拐走了,所以好多消息包括:WM_MOUSEMOVE和WM_KEYDOWN等在消息都在主窗口不能用;
b)当然如果你做控件的派生类再进行子类化,是可以到控件类中去截获这些消息。比如:CEyeCtrl类。
c)预先翻译消息是什么意思?所有的消息被分配到控件或者主窗口之前的入口检查。

PreTranslateMessage函数允许我们在消息到达窗口过程之前对消息进行预处理和转换。通过重写这个函数,我们可以实现对消息的拦截、修改和处理,从而实现一些高级的交互功能,比如处理键盘快捷键。

定义句柄HACCEL m_hAccel;
初始化对话框时候加载
m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCEL));
BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)  //消息预处理函数  皇军的岗楼  
{if (m_hAccel){if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) //快捷键的处理return TRUE;}return CDialog::PreTranslateMessage(pMsg);
}

在这里插入图片描述
在这里插入图片描述

附录

CFile类的share模式:

enum OpenFlags {modeRead =         (int) 0x00000,modeWrite =        (int) 0x00001,modeReadWrite =    (int) 0x00002,shareCompat =      (int) 0x00000,shareExclusive =   (int) 0x00010, 拒绝共享执行shareDenyWrite =   (int) 0x00020, 拒绝共享写shareDenyRead =    (int) 0x00030, 拒绝共享读shareDenyNone =    (int) 0x00040, 不拒绝(可以共享读写都行)modeNoInherit =    (int) 0x00080,}

比如:shareDenyWrite 拒绝共享写,那么就是CFile打开期间别的进程可以读。


http://www.ppmy.cn/news/917793.html

相关文章

Opencv学习_3 (Opencv读取视频 视频进度控制 写视频)

opencv读取视频: 使用opencv读取视频主要用到这几个函数:cvCreateFileCapture cvQueryFrame (或cvGrabFrame cvRetrieveFrame) cvReleaseCapture。 1:简单介绍: CvCapture是一个结构体,用来保存图像捕获所需要的信息…

Spring+SpringMVC+Mybatis整合【L】

我喜欢直接上代码&#xff0c;这里做个解说&#xff0c;代码下载 http://download.csdn.net/detail/q260996583/9905047 项目框架图&#xff1a; 1、pom.xml 文件内容 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

java编写创建json,将json数据转换成xml,ftp发送到服务器

一.项目简介 1.环境 1).jdk 1.6 2.jar包 commons-net-1.4.1.jar gson-2.2.4.jar jar 建议大家去官网上下载 3.项目结构 二.创建Json 1.javaBean package kingdom.json;public class TransData {private String fq_name; //交易发起人private String js_name; //交…

React Hooks 实用指南

为什么80%的码农都做不了架构师&#xff1f;>>> 前言 在React Conf 2018会议中&#xff0c;Dan Abramov 介绍了 React Hooks。官方的描述为 Hook是一项新功能提案&#xff0c;可让您在不编写类的情况下使用状态和其他React功能。 它们目前处于React v16.7.0-alpha中…

iPhone开发入门(10)— 设备上运行程序

博主&#xff1a;易飞扬原文链接 : http://www.yifeiyang.net/introduction-to-iphone-development-10-devices-running-the-program/转载请保留上面文字。 注册 iPhone Developer Program 启动程序的准备 连接Xcode 生成证明 创建和下载配置文件 注册证明书 设备注册 生成App …

GeoTrellis 尝试(springboot + swagger + spark + GeoTrellis)

原始使用springboot spark 整合在一起做了一个通过请求来驱动spark计算的demo工程&#xff0c;最近看了下GeoSpark,Geotrellis,GeoMeca关于GIS方面的大数据相关技术&#xff0c;就写了一个Demo,我这里用的是Spark 2.4.0 版本 scala 2.11 版本 Geotrellis 2.3.1版本 GeoTools 2…

批处理Bat教程-第八章:番外篇

转载自&#xff1a;http://docs.30c.org/dosbat/chapter08/ 8.1 批量十六进制二进制格式转换 想把数据(流)以十六进制或二进制的形式显示出来&#xff1f;UltraEdit之类的编辑软件一定是首选。即使是要自己亲自转出来&#xff0c;C/C等语言也会方便的多。如果您跟我一样选择使…

day5-os、sys模块

一.概述 开发运维相关支撑系统现今已成为Devops下的一大热门领域&#xff0c;Python在这方面也有着自己独到的优势。这类场景以及其他一些场景下&#xff0c;需要调用一些操作系统的接口&#xff0c;这就涉及到今天要讲述的OS模块和sys模块。 二.OS模块的常见用法 os.getcwd()获…