【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

相关文章

基于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.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加