




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,第9章,文件及剪贴板操作,Windows 操作系统,文件操作是Windows应用程序经常要涉及的内容,利用Windows 的API函数,能很好地实现文件操作的功能。 32位操作系统,最大文件长度可达4GB 支持长达56字节的文件名 同一文件可被不同进程访问,HANDLE CreateFile ( LPCTSTR lpszName, /文件名 DWORD dwDesiredAccess,/文件访问形式标识, 读操作为GENERIC_READ,写操作为GENERIC_WRITE DWORD dwshareMode, /文件的共享模式标识 LPSECURITY_ATTRIBUTES lpsecur
2、ityAttributes, DWORD dwCreationDisposition, /文件创建操作标识, DWORD dwFlagsAndAttributes, /文件属性标识 HANDLE hTemplateFile /指向文件属性模板的句柄 ),文件共 享模式,该文件不能共享,则其值为0 可读共享,其值为FILE_SHARE_READ 可写共享,其值为FILE_SHARE_WRITE,指向安全属性 数据结构的指 针,常为NULL,常用的文件操作函数 CreateFile:创建或打开一个文件,ReadFile函数:从文件指针的位置开始读取一个现存文件中的数据 BOOL ReadFile
3、(,HANDLE LPVOID,hFile, lpBuffer,/打开的文件句柄; /指向接收读入数据缓冲区地址的指针;,DWORD LPDWORD,nNumberOfBytesToRead,/将从文件中读入的数据字数; lpNumberOfBytesRead,/指向实际读取字节数的指针;,LPOVERLAPPED,lpOverlapped /指向一个OVERLAPPED数据结构的指针。,) NULL表明从当 前位置读取数据,WriteFile函数:从文件指针的位置开始向现存文件中的写入数据。 BOOL WriteFile (,HANDLE LPVOID,hFile, lpBuffer,,/打
4、开的文件句柄: /指向写入数据的缓冲区地址的指针:,DWORD LPDWORD,nNumberOfBytesToWrite,/将向文件中写入的数据字数: lpNumberOfBytesWitten,/指向实际写入字节数的针:,LPOVERLAPPED,lpOverlapped,/指向一个OVERLAPPED数据结构的指针。,) NULL表明从当 前位置写入数据,GetFileInformartiomByHandle函数,获取指定文件的信息,并将其保存在,BY_HANDLE_FILE_INFORMATION数据结构中,BOOLGetFilelnformationByHandle,(,HANDLE
5、 hFile,LPBY_HANDEL_FILE_INFORMATION lpFilelnformation ),为指向BY_HANDLE_FILE_INFORMATION结构的指针,SearchPath函数,根据给定搜索路径查找指定文件并返回指定文件的路径,DWORD SearchPath (,LPCTSTR lpPath /指定搜索路径;若为NULL,则采用默认路径; LPCTSTR lpFileName,/搜索的文件名;,LPCTSTR lPExtension,/搜索文件的扩展名;,DWORD nBufferLength,/用来接收文件路径名的缓冲区长度; LPTSTR lpBuffer,
6、 /指向接收文件路径名的缓冲区;,LPTSTR * lPFilepart /指向路径名中文件名部分地址的指针。,/如果调用该函数未指定搜索路径, /则采用默认系统路径进行搜索,),lpFileName默认的搜索次序: (1)当前目录;,(2)Windows操作目录;,(3)Windows系统所在目录; (4)PATH环境变量包含的目录,SetFilePionter 函数:设置文件指针的位置 DWORD SetFilePoiner (,HANDLE LONG,hFile, lpistanceToMove,,/文件句柄 /指针移动的字节数,LPLONG,lpDistanceToMoveHigh,
7、/指向指针移动距离的高位指针,dwMoveMethod,/指针移动参考位置标识,DWORD ),文件操作应用举例,【例9-1】本例创建一个具有打开文件功能的对话框,并可进行文件的编 辑与保存。,LRESULT APIENTRY MainWndProc() 1. static HWND hWndEdit; 2. switch(message) 3. case WM_CREATE: 4. hWndEdit=CreateWindow(EDIT,NULL,WS_CHILD|WS_VISIBLE| WS_HSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL, 0,0,0
8、,0,hWnd,(HMENU)ID_EDITCHILD, (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL); 5. break;,6.,case WM_SIZE:,7. MoveWindow(hWndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE); break; 8. case WM_COMMAND: 9. switch (LOWORD(wParam) 10. case IDM_FILEOPEN: OpenTextFile(hWnd,hWndEdit); break;,case IDM_FILESAV
9、E: SaveTextFile(hWnd,hWndEdit); break; case IDM_EXIT: SendMessage(hWnd,WM_DESTROY,0L,0L); break; case IDM_ABOUT:DialogBox(hInst,AboutBox,hWnd,(DLGPROC)About);break ; default:return(DefWindowProc(hWnd,message,wParam,lParam);,11. 12. 13. 14. 15.,16. break; 17. case WM_DESTROY: PostQuitMessage(0); brea
10、k; 18. default: return(DefWindowProc(hWnd,message,wParam,lParam); return(0); ,/* 调用公共对话框函数,显示【打开】对话框,检取用户选择 的文本文件,然后打开该文本文件到编辑控件中。 void OpenTextFile(HWND hWnd,HWND hWndEdit) OPENFILENAME OpenFileName; char szDirNameMAX_PATH=; char szFileMAX_PATH=0; char szFileTitle MAX_PATH=0; / OPENFILENAME 结构的过滤器规
11、格说明。 char szFilter=“文本文件(*.txt)0*.txt0C源程序文件 (*.c)0*.c0所有文件0*.*0; OpenFileName.lStructSize=sizeof(OPENFILENAME); OpenFileName.lpstrDefExt=*.txt; OpenFileName.lCustData=0;,OpenFileName.Flags= OFN_PATHMUSTEXIST| OFN_FILEMUSTEXIST| OFN_HIDEREADONLY;,填写 OpenFileName 对象属性,1. if(GetOpenFileName( / 打开指定的文件
12、,4.,if(hFile!=INVALID_HANDLE_VALUE),5. dwFileSize=GetFileSize(hFile,NULL); /检取文件字节大小,6.,if(dwFileSize!=0 xFFFFFFFF),7. lpBufPtr=(char *)malloc(dwFileSize); /分配用来读入文件的缓冲区 8. if(lpBufPtr!=NULL) 9. ReadFile(hFile,(LPVOID)lpBufPtr,dwFileSize,10. if(dwBytesRead!=0) /把文件内容装入多行编辑控件中,11. SendMessage(hWndEdi
13、t,WM_SETTEXT,0,(LPARAM)lpBufPtr); 12. SetWindowText(hWnd,OpenFileName.lpstrFile); 13. else 14. MessageBox(hWnd,“读入字节数为零 ”,NULL,MB_OK|MB_ICONEXCLAMATION);,free(lpBufPtr);,15. 16.,17. else 18. MessageBox(NULL,内存分配失败!,NULL,MB_OK|MB_ICONEXCLAMATION);,19.,20. else 21. MessageBox(NULL,检取文件大小失败,NULL,MB_OK|
14、MB_ICONEXCLAMATION);,22.,CloseHandle(hFile) ;,23. 24. else MessageBox(hWnd, 打开文件失败,NULL,MB_OK|MB_ICONEXCLAMATION);,把文件内容读入缓冲区,/* 调用公共对话框函数,显示【另存为】对话框, /* 用户选择文本名,然后把编辑控件中的内容保存到该文件中 void SaveTextFile(HWND hWnd, HWND hWndEdit ),OPENFILENAME OpenFileName;,char szDirNameMAX_PATH=; char szFileMAX_PATH=0;
15、 char szFileTitleMAX_PATH=0; char szFilter=All Files0*.*0; OpenFileName.lStructSize=sizeof(OPENFILENAME); OpenFileName.hWndOwner=hWnd; OpenFileName.lCustData=0; OpenFileName.Flags=OFN_OVERWRITEPROMPT;,1. if (GetSaveFileName ( DWORD,dwFileSize,dwBytesWrite; char *lpBufPtr;,3. hFile=CreateFile(); 4. i
16、f(hFile!=INVALID_HANDLE_VALUE) 5. /检取编辑控件内容的字节大小。,6. dwFileSize=SendMessage(hWndEdit,WM_GETTEXTLENGTH,0,0);,7.,if(dwFileSize!=0),8. lpBufPtr=(char *)malloc(dwFileSize); / 分配文件缓冲区。,9.,if(dwFileSize!=0),10. / 把编辑控件中的内容装到文件缓冲区。 11. SendMessage(hWndEdit,WM_GETTEXT,dwFileSize,(LPARAM)lpBufPtr); 12. /把文件缓
17、冲区中的数据存写到文件中。 13. WriteFile(hFile,(LPVOID)lpBufPtr,dwFileSize,19.,20. else 21. MessageBox(NULL,编辑控件中内容为空,NULL,MB_OK|MB_ICONEXCLAMATION);,22.,CloseHandle(hFile);,23. 24. else 25. MessageBox(hWnd,创建文件失败!,NULL,MB_OK|MB_ICONEXCLAMATION);,26.,创建文件,如果已 有同名文件,则覆盖,BOOL APIENTRY About( HWND hDlg,UINT message
18、, WPARAM wParam, LPARAM lparam), switch (message),case WM_INITDIALOG: return (TRUE ); case WM_COMMAND:,if(LOWORD(wParam)=IDOK|LOWORD(wParam)=IDCANCEL),EndDialog(hDlg,TRUE); return (TRUE);,break;,return(FALSE); ,剪贴板: 通过剪贴板的操作,可对某一部分内容进行不同位置 的复制、移动。,使用剪贴板首先应考虑的问题是其支持的数据格式。,在使用剪贴板之前,应用程序需将准备操作剪贴板的数据初 始
19、化为系统预定义的数据格式。,剪贴板,应用程序向剪贴板发送文本 应用程序向剪贴板发送文本的操作过程可分为如下5个步骤: 1. 拷贝文本到全局内存 调用GlobalAlloc函数为文本分配全局存储空间 HGLOBAL GlobalAlloc (UINT uFlags, /函数分配内存形式标识 DWORD dwBytes) /分配字节数 然后调用 GlobalLock 函数锁定分配的内存块,LPVOID,GlobalLock(HGLOBAL hMem) /hMem为内存块地址,把数据拷贝到内存以后,应及时调用GlobalUnLock 解锁内存句柄 BOOL GlobalUnLock (HGLOBAL
20、 hMem) /hMem为内存句柄,2. 打开剪贴板,该步骤由应用程序调用OpenClipboard 函数完成,BOOL OpenClipboard (HWND hwnd),/hwnd为打开剪贴板的窗口句柄,3清除剪贴板中的所有句柄,该步骤由应用程序调用函数EmptyClipboard 完成 BOOL EmptyClipboard (VOID),4. 向剪贴板传送文本全局内存句柄,该步骤由应用程序调用函数 SetClipboardData 完成, HANDLE SetClipboardData,(UINT uFormat, /数据格式标识,HANDLE hMem) /数据句柄,应用程序一旦将文
21、本内存句柄传递给剪贴板,则该句柄属于剪 贴板,应用程序不能再对其进行操作。,5. 关闭剪贴板 该步骤由应用程序调用函数CloseClipboard完成: BOOL CloseClipboard(VOID) 下面的程序段是应用程序向剪贴板发送文本的一般过程: 1. HANDLE hText; LPTSTR lpString,lpText;,2.,3. case IDM_COPY; /分配全局内存 4. if(!(hText=GloalbAlloc(GWND,Sizeof(lpSring) 5. MessageBox(hwnd,“ 全局内存分配失败!”,“ 提示”,MB_OK);break; 6.
22、 lpText=GlobalLock(hText); /锁定文本内存句柄并返回文本指针 7. lstrcpy(lpText,lpString); /拷贝文本 8. GlobalUnlock(hText); /解锁文本内存句柄 9. If(!OpenClipboard(hwnd) 10. MessageBox(hwnd,剪贴板打开失败!,提示,MB_OK);break; 11. EmptyClipboard( ); /清除剪贴板 12. SetCilpboardData(CF_TEXT,hText); /设置剪贴板文本 13. CloseClipboard(); /关闭剪贴板 14. hText
23、=NULL /以避免应用程序再通过该句柄执行其他操作 15. break;,贴板中的数据后,只能调用函数 GlobalUnlock解锁该内存句柄而无 法将其释放。 4关闭剪贴板:调用函数CloseClipboard关闭剪贴板。,获取剪贴板文本 应用程序从剪贴板上获取文本的操作过程可分为如下4个步骤: 1打开剪贴板: 调用函数OpenClipboard打开剪贴板 2检查剪贴板数据格式:由函数IsClipboardFormatAvailable完成 BOOL IsClipboardFormatAvailable(UINT uformat) 3获取剪贴板文本:由函数GetClipboardData完
24、成 HANDLE GetClipboardData(UINT uformat) uformat为数,据格式标识 获取的内存句柄属于剪贴板,不属 于应用程序,因此应用程序读取剪,获取剪贴板文本内 存句柄后即可调用 GlobalLock返回指 向文本的指针,1. 下面的程序段是应用程序获取剪贴板文本的一般形式: 2. HANDLE hText; 3. LPTSTR lpString,lpText; 4. 5. case IDM_PASTE; 6. if(!IsClipboardFormstAvailable(CF_TEXT) /检查剪贴板的数据格式 7. MessageBox(hwnd,“剪贴板上
25、无文本数据”,“提示”,MB_OK); Break;,8.,if(!OpenClipboard(hwnd) /打开剪贴板,9. MessageBox(hwnd“剪贴板板开失败”,“提示”,MB_OK);Brdak;,10. 11.,/获取剪贴板文本内存句柄 if(!(hText=GetClipboardData(CF_TEXT),12. MessageBox(hwnd,“无法读取剪贴板数据”,“提示”,MB_OK); 13. CloseClipboard(); Break; 14. lpTexe=GlobalLock(hText); /锁定文本内存名柄并返回文本指针 15. /复制剪贴板文本内
26、容 16. lpString=(LPTSTR)malloc(GlobalSize(hText); 17. lpstrcpy(lpString,lpText); 18. GlobalUnlock(hText); /解锁文本内存句柄 19. CloseClipboard(); /关闭剪贴板 20. 21. break;,剪贴板应用举例,【例9-2】本例要求创建一个对话框,具有剪 切、复制、粘贴、取消动作及退出等功能。,# # # # # # #,include include include include include include include, 9_2.h,HINSTANCE HWND
27、 HWND CHAR HCURSOR HCURSOR HANDLE,hInst; hWndMain; hWndRichEdit; szRtfFileNameMAX_PATH; hCursorWait; hCursorNormal; hRTFLib;,LRESULT APIENTRY MainWndProc(,) static TCHAR szBuf128;,static TCHAR szFontString1024; UINT uItem;,switch (message) case WM_CREATE:,/ 创建多格式文字编辑控件。 hWndRichEdit=CreateWindowEx(,
28、WS_EX_CLIENTEDGE, / 使多格式文字编辑控件有一个客户型边界 RICHEDIT, / 多格式文字编辑控件的窗口类名称 NULL, / 多格式文字编辑控件中的初始文字 WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_SAVESEL|,WS_HSCROLL|WS_VSCROLL,/窗口风格,0, 0, 0, 0, / 位置和尺寸待定 hWnd, / 父窗口句柄 (HMENU)ID_RICHEDIT, / 控件标识号 hInst, / 实例句柄 NULL);,lstrcpy(szRtfFileName, 粘贴示例); SetWindowText(hWnd, s
29、zRtfFileName);,break;,case WM_SIZE: MoveWindow(hWndRichEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE); break; case WM_INITMENUPOPUP:,if(BOOL)HIWORD(lParam),/ 如果是系统菜单,则不作检查。,break; /检查是否可以进行撤销操作,并由此设置菜单项的状态。 if(SendMessage(hWndRichEdit,EM_CANUNDO,0,0) EnableMenuItem(GetMenu(hWndMain),IDM_EDITUNDO,MF_BY
30、COMMAND|MF_ENABLED); else EnableMenuItem(GetMenu(hWndMain), IDM_EDITUNDO,MF_BYCOMMAND|MF_GRAYED); /* 检查是否可以进行粘贴操作,并由此设置菜单项的状态。 if(SendMessage(hWndRichEdit,EM_CANPASTE,0,0) EnableMenuItem(GetMenu(hWndMain), IDM_EDITPASTE,MF_BYCOMMAND|MF_ENABLED); else EnableMenuItem(GetMenu(hWndMain), IDM_EDITPASTE,M
31、F_BYCOMMAND|MF_GRAYED); break;,case WM_COMMAND:,uItem = LOWORD(wParam); switch (uItem),case IDM_EDITUNDO:,SendMessage(hWndRichEdit, WM_UNDO, 0, 0);break;,case IDM_EDITCUT:,SendMessage(hWndRichEdit, WM_CUT, 0, 0); break;,case IDM_EDITCOPY:,SendMessage(hWndRichEdit, WM_COPY, 0, 0);break;,case IDM_EDIT
32、PASTE:,SendMessage(hWndRichEdit, WM_PASTE, 0, 0);break;,case IDM_EDITDELETE:,SendMessage(hWndRichEdit, WM_CLEAR, 0, 0);break;,case IDM_EDITSELECTALL:,SendMessage(hWndRichEdit, EM_SETSEL,0,-1);break;,case IDM_EXIT:,SendMessage(hWnd, WM_CLOSE, 0, 0L);return 0;,default:,return(DefWindowProc(hWnd,messag
33、e,wParam,lParam);,break;,if (hRTFLib);,FreeLibrary(hRTFLib); hRTFLib=NULL; PostQuitMessage(0); break;,default:return(DefWindowProc(hWnd,message,wParam,lParam); ,return(0);,【例9-3】本例题将在用户区中创建两个编辑框子窗口,用户可以在第一个编 辑框中输入文本,并将其中的某些文本选中,然后选择“复制第一个编辑框 中的选中文本”菜单项,即可将选中文本复制到剪贴板中。选择“将文本粘 贴到第二个编辑框”菜单项可将剪贴板中的文本粘贴到
34、第二个编辑框中。,#include #include #includeresource.h,#define IDE_1 102 /第一个编辑框的标识 #define IDE_2 103 /第二个编辑框的标识,long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam);,HWND hEdit1,hEdit2; /定义输入编辑框,输出编辑框 HINSTANCE hInst; /定义应用程序实例句柄,long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,
35、LPARAM lParam) DWORD begin,end;,HGLOBAL hSel;,LPTSTR pSel,pEdit,pGlobal; long length; unsigned i;,switch(iMessage),case WM_CREATE: /窗口初始化消息,hEdit1=CreateWindow(EDIT, /创建EDIT对象,NULL, /无标题,WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, /样式 230,20,300,30, hWnd,(HMENU)IDE_1, /编辑框标识 hInst, NULL);,hEdit2=CreateWindow(EDIT, /创建EDIT编辑框,NULL, /无标题,WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER, /样式 230,70,300,30, hWnd,(HMENU)IDE_2, /编辑框标识 hInst,NULL);,break;,1 case WM_COMMAND: 2 switch(LOWORD(wParam) 3 case IDE_1: if(HIWORD(wParam)=EN_SETFOCUS) SetFocus(hEdit1); break; 4 case
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CNIDA 012-2023重水堆压力管用锆合金无缝管
- T/CNFA 022-2023绿色设计产品评价技术规范玻璃家具
- 2025年DVD刻录设备合作协议书
- 2025年滚丝机合作协议书
- 2025年石材、石料加工品及制品合作协议书
- T/CITS 0001-2020标准“领跑者”评价通则检验检测服务机构
- T/CIQA 5-2020生态原产地产品评审技术规范
- T/CEPPEA 5022-2023高速公路电动汽车充电设施设计规范
- T/CECS 10303-2023固废基纤维混凝土盾构管片
- T/CECS 10297-2023建筑机器人地坪研磨机器人
- 2025年度建筑施工安全演练计划
- 托幼机构十项卫生保健制度
- 电费优化与节约的管理方法及其应用分析报告
- 2025年临床药学科工作总结与新策略计划
- 焊工(初级)实操理论考试1000题及答案
- 校区无人机航测方案设计
- 统编版五年级语文水浒传整本书阅读交流课 公开课一等奖创新教学设计
- 工程造价咨询项目委托合同
- 2025年南邮面试试题及答案
- 2025年中考数学二轮复习:瓜豆原理(含解析)
- 借哪吒之魂铸中考辉煌-中考百日誓师班会-2024-2025学年初中主题班会课件
评论
0/150
提交评论