【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

相关文章

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

微软正式推出 Spartan 斯巴达浏览器

作为用于替代 IE 浏览器的下一代继任者,微软的 Project Spartan 斯巴达浏览器可算是吊足了玩家们的胃口!如今,在最新的 Windows 10 Build 10049 版本起,它终于正式登场了。 斯巴达浏览器搭载了全新的渲染引擎、新的用户界面并集成了 Cortana 语音助手。功能上新增了稍后阅读列表、阅读视图、F12开发者工具、支持网页注释 (手写涂鸦),可以保存到 O

Restful API 原理以及实现

先说说API 再说啥是RESRFUL API之前,咱先说说啥是API吧。API大家应该都知道吧,简称接口嘛。随着现在移动互联网的火爆,手机软件,也就是APP几乎快爆棚了。几乎任何一个网站或者应用都会出一款iOS或者Android APP,相比网页版的体验,APP确实各方面性能要好很多。 那么现在问题来了。比如QQ空间网站,如果我想获取一个用户发的说说列表。 QQ空间网站里面需要这个功能。

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

WordPress开发中常用的工具或api文档

http://php.net/ http://httpd.apache.org/ https://wordpress.org/ https://cn.wordpress.org/ https://core.svn.wordpress.org/ zh-cn:开发者文档: https://codex.wordpress.org/zh-cn:%E5%BC%80%E5%8F%91%E8%80%

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

Docker远程连接和Docker Remote Api

在Docker生态系统中一共有3种API:Registry API、Docker Hub API、Docker Remote API 这三种API都是RESTful风格的。这里Remote API是通过程序与Docker进行集成和交互的核心内容。 Docker Remote API是由Docker守护进程提供的。默认情况下,Docker守护进程会绑定到一个所在宿主机的套接字:unix:///v

Win32函数调用约定(Calling Convention)

平常我们在C#中使用DllImportAttribute引入函数时,不指明函数调用约定(CallingConvention)这个参数,也可以正常调用。如FindWindow函数 [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]public static extern IntPtr FindWindow