【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

相关文章

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.