【win32 API】仿微软记事本V2.0

2024-04-21 05:48
文章标签 api 微软 记事本 win32 v2.0

本文主要是介绍【win32 API】仿微软记事本V2.0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

更新:
更换了ico.....
新增选择字体和颜色的功能;
修正:
资源文件都已经打包到工程目录里了,路径也改成了相对路径;
解决了保存100KB以上的文件会丢失数据的问题。


 

核心代码:
#include "resource.h"
#include <windows.h>
#include <stdio.h>
#include <Richedit.h>
#include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
#define WM_FILENAME WM_USER+1//自定义消息,这个消息用来发送用户选择的文件全路径
#define OPEN                WM_USER+2//一个Flag,标识这个文件是在打开对话框里选择的还是保存对话框
#define SAVE                 WM_USER+3INT_PTR ExitCode1;//用来保存主对话框的退出代码
INT_PTR ExitCode2;//About对话框的退出代码
HINSTANCE hMain;//用来保存实例句柄
//主对话框过程函数声明
INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
//About对话框过程函数声明
INT_PTR CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);BOOL OnInitDialog(HWND hwndDlg);//相应WM_ONINITDIALOG消息时调用的函数
BOOL OnOpen(HWND hwndDlg,DWORD Flag);//当用户点击Open菜单项时调用
//void GetTitle(char *pSourceBuf,char *pDestBuf);
void ChooseFont(HWND hwndDlg,CHOOSEFONT &font,LOGFONT &log);int WINAPI WinMain(HINSTANCE hIns,HINSTANCE hPrev,LPSTR lpCmd,int nShowCmd)//入口函数
{LoadLibrary("Riched20.dll");//要用Rich Edit控件就必须要先加载这个库,否则程序无法运行hMain=hIns;ExitCode1=DialogBox(hIns,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);//创建主对话框return 0;
}//主对话框过程函数
INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{switch(uMsg){case WM_INITDIALOG://初始化OnInitDialog(hwndDlg);break;//当用户改变主对话框的大小时,Edit控件大小也应该改变。case WM_SIZE:{RECT rect;ZeroMemory(&rect,sizeof(RECT));GetWindowRect(hwndDlg,&rect);//获取主对话框窗口的大小,详见MSDNHWND hEdit=GetDlgItem(hwndDlg,IDC_TEXT);//改变Edit控件的大小SetWindowPos(hEdit,HWND_TOP,0,0,rect.right-rect.left-5,rect.bottom-rect.top-50,SWP_SHOWWINDOW);CloseHandle(hEdit);}break;case WM_COMMAND:if(IDM_OPEN==wParam)//Open被用户点击OnOpen(hwndDlg,OPEN);if(IDM_EXIT==wParam)//Exit被用户点击SendMessage(hwndDlg,WM_CLOSE,NULL,NULL);//发送WM_CLOSE消息if(IDM_ABOUT==wParam)//About被点击,创建ABOUT对话框ExitCode2=DialogBox(hMain,MAKEINTRESOURCE(IDD_ABOUT),hwndDlg,AboutProc);if(IDM_SAVE==wParam)//用户点击Save{OnOpen(hwndDlg,SAVE);}if(IDM_CLOSEFILE==wParam){SetDlgItemText(hwndDlg,IDC_TEXT,"");SetWindowText(hwndDlg,"NotePadV2.0  By 小司");}if(IDM_FORMAT==LOWORD(wParam)){LOGFONT log;CHOOSEFONT font;CHARFORMAT2 cm;ZeroMemory(&cm,sizeof(cm));ChooseFont(hwndDlg,font,log);if(ChooseFont(&font)){strcpy(cm.szFaceName,log.lfFaceName);cm.cbSize=sizeof(cm);cm.dwMask=CFM_FACE | CFM_SIZE | CFM_WEIGHT | CFM_COLOR;cm.yHeight=log.lfHeight * log.lfHeight;cm.wWeight=log.lfWeight;cm.bPitchAndFamily=log.lfPitchAndFamily;cm.crTextColor=font.rgbColors;HWND hText=GetDlgItem(hwndDlg,IDC_TEXT);SendMessage(hText,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&cm);}}break;case WM_FILENAME://自定义的消息,用来接收文件路径if(OPEN==lParam){//打开文件的目的是为了用GetFileSize函数获取文件大小HANDLE hFile=CreateFile((LPCSTR)wParam,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(INVALID_HANDLE_VALUE==hFile){MessageBox(hwndDlg,"Open File Failed!","Error",0);CloseHandle(hFile);break;}DWORD dwFileSize=GetFileSize(hFile,NULL);//获取文件大小CloseHandle(hFile);TCHAR *pszData=new TCHAR[dwFileSize];memset(pszData,0,dwFileSize);FILE *fp=fopen((char*)wParam,"r");//wParam里保存了文件的路径fread(pszData,dwFileSize,1,fp);fclose(fp);SetDlgItemText(hwndDlg,IDC_TEXT,pszData);//显示数据}if(SAVE==lParam){HWND hText=GetDlgItem(hwndDlg,IDC_TEXT);int len=GetWindowTextLength(hText);TCHAR *pBuf=new TCHAR[len];memset(pBuf,0,len);GetDlgItemText(hwndDlg,IDC_TEXT,pBuf,len);char szFilePath[MAX_PATH+10];sprintf_s(szFilePath,"%s.txt",(char*)wParam);//凑出来.txtFILE *fp=fopen(szFilePath,"w");fwrite(pBuf,1,len,fp);fclose(fp);}break;//这个消息无用,调试用的..case WM_LBUTTONDOWN:break;case WM_CLOSE:if(IDYES==MessageBox(hwndDlg,"Are you sure to exit?","Warming",MB_YESNO | MB_ICONWARNING)){EndDialog(hwndDlg,ExitCode1);break;}break;default:break;}return FALSE;
}//about窗口过程函数
INT_PTR CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{switch(uMsg){case WM_CLOSE:EndDialog(hwndDlg,ExitCode2);break;case WM_COMMAND:if(IDOK==wParam){SendMessage(hwndDlg,WM_CLOSE,NULL,NULL);}break;default:break;}return FALSE;
}
BOOL OnInitDialog(HWND hwndDlg)
{HICON hIcon=LoadIcon(hMain,MAKEINTRESOURCE(IDI_ICON1));//载入图标SendMessage(hwndDlg,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);//设置图标return TRUE;
}
BOOL OnOpen(HWND hwndDlg,DWORD Flag)
{//见MSDN中关于GetOpenFileName的说明TCHAR szFile[MAX_PATH];TCHAR szFileTitle[MAX_PATH];OPENFILENAME op;memset(szFile,0,MAX_PATH);memset(szFileTitle,0,MAX_PATH);ZeroMemory(&op,sizeof(op));op.lStructSize=sizeof(op);op.hwndOwner=hwndDlg;op.lpstrFile=szFile;op.nMaxFile=MAX_PATH;op.lpstrFilter="All\0*.*\0文本文件(*.txt)\0*.txt\0";op.nFilterIndex=2;op.lpstrFileTitle=NULL;op.nMaxFileTitle=0;op.lpstrInitialDir=NULL;op.Flags=OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;if(OPEN==Flag){if(GetOpenFileName(&op)){//把文件的路径发送给主对话框StrCpy(szFileTitle,szFile);PathStripPath(szFileTitle);SetWindowText(hwndDlg,szFileTitle);SendMessage(hwndDlg,WM_FILENAME,(WPARAM)szFile,(LPARAM)Flag);}}if(SAVE==Flag){if(GetSaveFileName(&op)){SendMessage(hwndDlg,WM_FILENAME,(WPARAM)szFile,(LPARAM)Flag);}}return TRUE;
}void ChooseFont(HWND hwndDlg,CHOOSEFONT &font,LOGFONT &log)
{TCHAR szStyle[256];HDC dc=GetDC(NULL);memset(szStyle,0,256);WORD wFontType=0;COLORREF color=RGB(0,0,0);ZeroMemory(&log,sizeof(log));ZeroMemory(&font,sizeof(font));font.lStructSize=sizeof(font);font.hwndOwner=hwndDlg;font.lpLogFont=&log;font.Flags=CF_EFFECTS | CF_FORCEFONTEXIST | CF_BOTH;font.rgbColors=color;font.lpszStyle=szStyle;font.hDC=dc;font.nFontType=wFontType;}


 

这篇关于【win32 API】仿微软记事本V2.0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922292

相关文章

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3