《visual-c--面向对象与可视化程序设计-08解析》由会员分享,可在线阅读,更多相关《visual-c--面向对象与可视化程序设计-08解析(29页珍藏版)》请在金锄头文库上搜索。
1、1,文件操作是Windows 应用程序经常要涉及的内容,利用Windows 的API函数,能很好地实现文件操作的功能.,第9章 文件及剪贴板操作,2,常用的文件操作函数,指向安全属性 数据结构的指 针,常为NULL,3,ReadFile函数:从文件指针的位置开始读取一个现存文件中的数据,BOOL ReadFile ( HANDLE hFile, /打开的文件句柄; LPVOID lpBuffer, /指向接收读入数据缓冲区地址的指针; DWORD nNumberOfBytesToRead,/将从文件中读入的数据字数; LPDWORD lpNumberOfBytesRead,/指向实际读取字节数
2、的指针; LPOVERLAPPED lpOverlapped /指向一个OVERLAPPED数据结构的指针。 ),NULL表明从当 前位置读取数据,4,5,6,lpFileName缺省的搜索次序: (1)当前目录; (2)Windows操作目录; (3)Windows系统所在目录; (4)PATH环境变量包含的目录,7,8,文件操作应用举例,【例9-1】本例创建一个具有打开文件功能的对话框,并可进行文件的编辑与保存。,9,LRESULT APIENTRY MainWndProc() 1. static HWND hWndEdit; 2. switch(message) 3. case WM_C
3、REATE: 4. hWndEdit=CreateWindow(“EDIT“,NULL,WS_CHILD|WS_VISIBLE| WS_HSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL, 0,0,0,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.
4、case WM_COMMAND: 9. switch (LOWORD(wParam) 10. case IDM_FILEOPEN: OpenTextFile(hWnd,hWndEdit); break; 11. case IDM_FILESAVE: SaveTextFile(hWnd,hWndEdit); break; 12. case IDM_EXIT: SendMessage(hWnd,WM_DESTROY,0L,0L); break; 13. case IDM_ABOUT:DialogBox(hInst,“AboutBox“,hWnd,(DLGPROC)About);break ; 14
5、. default:return(DefWindowProc(hWnd,message,wParam,lParam); 15. 16. break; 17. case WM_DESTROY: PostQuitMessage(0); break; 18. default: return(DefWindowProc(hWnd,message,wParam,lParam); return(0); ,10,/* 调用公共对话框函数,显示【打开】对话框,检取用户选择的文本文件,然后打开该文本文件到编辑控件中.。 void OpenTextFile(HWND hWnd,HWND hWndEdit) OPE
6、NFILENAME OpenFileName; char szDirNameMAX_PATH=“; char szFileMAX_PATH=“0“; char szFileTitle MAX_PATH=“0“; / OPENFILENAME 结构的过滤器规格说明。 char szFilter=“文本文件(*.txt)0*.txt0C源程序文件(*.c)0*.c0所有文件0*.*0“; OpenFileName.lStructSize=sizeof(OPENFILENAME); OpenFileName.lpstrDefExt=“*.txt“; OpenFileName.lCustData=0;
7、 OpenFileName.Flags= OFN_PATHMUSTEXIST| OFN_FILEMUSTEXIST| OFN_HIDEREADONLY;,填写 OpenFileName 对象属性,11,1. if(GetOpenFileName( 25. ,把文件内容读入缓冲区,12,/* 调用公共对话框函数,显示【另存为】对话框, /* 用户选择文本名,然后把编辑控件中的内容保存到该文件中. void SaveTextFile(HWND hWnd, HWND hWndEdit ) OPENFILENAME OpenFileName; char szDirNameMAX_PATH=“; cha
8、r szFileMAX_PATH=“0“; char szFileTitleMAX_PATH=“0“; char szFilter=“All Files0*.*0“; OpenFileName.lStructSize=sizeof(OPENFILENAME); OpenFileName.hWndOwner=hWnd; OpenFileName.lCustData=0; OpenFileName.Flags=OFN_OVERWRITEPROMPT;,13,1. if (GetSaveFileName ( 26. ,创建文件,如果已 有同名文件,则覆盖,14,BOOL APIENTRY About
9、( HWND hDlg, UINT message, 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); ,15,剪贴板:通过剪贴板的操作,可对某一部分内容进行不同位置进行复制、移动。,使用剪贴板首先应考虑的问题是其支持的数据格式。,在使
10、用剪贴板之前,应用程序需将准备操作剪贴板的数据初始化为系统预定义的数据格式。,剪贴板,16,1. 拷贝文本到全局内存,17,18,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,“ 全局内存分配失
11、败!”,“ 提示”,MB_OK);break; 6. 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. CloseCli
12、pboard(); /关闭剪贴板 14. hText=NULL /以避免应用程序再通过该句柄执行其他操作 15. break;,19,1打开剪贴板: 调用函数OpenClipboard打开剪贴板,2检查剪贴板数据格式:由函数IsClipboardFormatAvailable完成 BOOL IsClipboardFormatAvailable(UINT uformat),4关闭剪贴板:调用函数CloseClipboard关闭剪贴板。,获取的内存句柄属于剪贴板,不属于应用程序,因此应用程序读取剪贴板中的数据后,只能调用函数GlobalUnlock解锁该内存句柄而无法将其释放。,20,1. 下面的
13、程序段是应用程序获取剪贴板文本的一般形式: 2. HANDLE hText; 3. LPTSTR lpString,lpText; 4. 5. case IDM_PASTE; 6. if(!IsClipboardFormstAvailable(CF_TEXT) /检查剪贴板的数据格式 7. MessageBox(hwnd,“剪贴板上无文本数据”,“提示”,MB_OK); Break; 8. if(!OpenClipboard(hwnd) /打开剪贴板 9. MessageBox(hwnd“剪贴板板开失败”,“提示”,MB_OK);Brdak; 10. /获取剪贴板文本内存句柄 11. if(!
14、(hText=GetClipboardData(CF_TEXT) MessageBox(hwnd,“无法读取剪贴板数据”,“提示”,MB_OK); CloseClipboard(); Break; lpTexe=GlobalLock(hText); /锁定文本内存名柄并返回文本指针 /复制剪贴板文本内容 lpString=(LPTSTR)malloc(GlobalSize(hText); lpstrcpy(lpString,lpText); GlobalUnlock(hText); /解锁文本内存句柄 CloseClipboard(); /关闭剪贴板 break;,21,9.2.3 剪贴板应用
15、举例,【例9-2】本例要求创建一个对话框,具有剪切、复制、粘贴、取消动作及退出等功能。,22,# include # include # include # include # include # include # include “9_2.h“ HINSTANCE hInst; HWND hWndMain; HWND hWndRichEdit; CHAR szRtfFileNameMAX_PATH; HCURSOR hCursorWait; HCURSOR hCursorNormal; HANDLE hRTFLib;,23,LRESULT APIENTRY MainWndProc(,) static TCHAR szBuf128; static TCHAR szFontString1024; UINT uItem; switch (message) case WM_CREATE: / 创建多格式文字编辑控件。 hWndRichEdit=CreateWindowEx( WS_EX_CLIENTEDGE, / 使多格式文字编辑控件有一个客户型边界 “RICHEDIT“, / 多格式文字编辑控件的窗口类名称 NULL, / 多格式文字编辑控件中的初始文字 WS_CHILD|WS_VISIBLE