《Visual-C--面向对象与可视化程序设计-08解析.ppt》由会员分享,可在线阅读,更多相关《Visual-C--面向对象与可视化程序设计-08解析.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2常用的文件操作函数常用的文件操作函数HANDLE CreateFileHANDLE CreateFile(LPCTSTR lpszNameLPCTSTR lpszName, /文件名文件名DWORD dwDesiredAccessDWORD dwDesiredAccess,/文件访问形式标识,文件访问形式标识,读操作为读操作为GENERIC_READGENERIC_READ,写操作为,写操作为GENERIC_WRITEGENERIC_WRITEDWORD dwshareModeDWORD dwshareMode,/文件的共享模式标识文件的共享模式标识LPSECURITY_ATTRIBUTES
2、 lpsecurityAttributes,LPSECURITY_ATTRIBUTES lpsecurityAttributes,DWORD dwCreationDisposition,DWORD dwCreationDisposition,/文件创建操作标识,文件创建操作标识,DWORD dwFlagsAndAttributes,DWORD dwFlagsAndAttributes,/文件属性标识文件属性标识HANDLE hTemplateFileHANDLE hTemplateFile/指向文件属性模板的句柄指向文件属性模板的句柄) )CreateFile:创建或打开一个文件:创建或打开一
3、个文件文件共文件共享模式享模式可写共享,其值为可写共享,其值为FILE_SHARE_WRITE可读共享,其值为可读共享,其值为FILE_SHARE_READ该文件不能共享,则其值为该文件不能共享,则其值为0指向安全属性指向安全属性数据结构的指数据结构的指针,常为针,常为NULLNULL3ReadFile函数:从文件指针的位置开始读取一个现存文件中的数据函数:从文件指针的位置开始读取一个现存文件中的数据BOOL ReadFileBOOL ReadFile( (HANDLE hFile, HANDLE hFile, /打开的文件句柄;打开的文件句柄;LPVOID lpBuffer, LPVOID
4、lpBuffer, /指向接收读入数据缓冲区地址的指针;指向接收读入数据缓冲区地址的指针;DWORD nNumberOfBytesToRead,/DWORD nNumberOfBytesToRead,/将从文件中读入的数据字数;将从文件中读入的数据字数;LPDWORD lpNumberOfBytesRead,/LPDWORD lpNumberOfBytesRead,/指向实际读取字节数的指针;指向实际读取字节数的指针;LPOVERLAPPED lpOverlapped /LPOVERLAPPED lpOverlapped /指向一个指向一个OVERLAPPEDOVERLAPPED数据结构的指针
5、。数据结构的指针。)NULLNULL表明从当表明从当前位置读取数据前位置读取数据4WriteFile函数:从文件指针的位置开始向现存文件中的写入数据函数:从文件指针的位置开始向现存文件中的写入数据BOOL WriteFileBOOL WriteFile(HANDLE hFileHANDLE hFile,/打开的文件句柄:打开的文件句柄:LPVOID lpBufferLPVOID lpBuffer,/指向写入数据的缓冲区地址的指针:指向写入数据的缓冲区地址的指针:DWORD nNumberOfBytesToWriteDWORD nNumberOfBytesToWrite,/将向文件中写入的数据字
6、数:将向文件中写入的数据字数:LPDWORD lpNumberOfBytesWittenLPDWORD lpNumberOfBytesWitten,/指向实际写入字节数的针:指向实际写入字节数的针:LPOVERLAPPED lpOverlappedLPOVERLAPPED lpOverlapped,/指向一个指向一个OVERLAPPEDOVERLAPPED数据结构的指针。数据结构的指针。)NULLNULL表明从当表明从当前位置写入数据前位置写入数据5GetFileInformartiomByHandle函数函数获取指定文件的信息,并将其保存在获取指定文件的信息,并将其保存在BY_HANDLE_
7、FILE_INFORMATION数据结构中数据结构中 BOOLGetFilelnformationByHandleBOOLGetFilelnformationByHandle(HANDLE hFile,HANDLE hFile,LPBY_HANDEL_FILE_INFORMATION lpFilelnformationLPBY_HANDEL_FILE_INFORMATION lpFilelnformation)为指向为指向BY_HANDLE_FILE_INFORMATIONBY_HANDLE_FILE_INFORMATION结构的指针结构的指针6SearchPath函数函数根据给定搜索路径查找
8、指定文件并返回指定文件的路径根据给定搜索路径查找指定文件并返回指定文件的路径DWORD SearchPathDWORD SearchPath(LPCTSTR lpPathLPCTSTR lpPath/指定搜索路径;若为指定搜索路径;若为NULLNULL,则采用缺省路径;,则采用缺省路径;LPCTSTR lpFileNameLPCTSTR lpFileName,/搜索的文件名;搜索的文件名;LPCTSTR lPExtensionLPCTSTR lPExtension,/搜索文件的扩展名;搜索文件的扩展名;DWORD nBufferLengthDWORD nBufferLength,/用来接收文件
9、路径名的缓冲区长度;用来接收文件路径名的缓冲区长度;LPTSTR lpBufferLPTSTR lpBuffer, /指向接收文件路径名的缓冲区;指向接收文件路径名的缓冲区;LPTSTR LPTSTR * * lPFilepart lPFilepart /指向路径名中文件名部分地址的指针。指向路径名中文件名部分地址的指针。/如果调用该函数未指定搜索路径,如果调用该函数未指定搜索路径,/则采用缺省系统路径进行搜索则采用缺省系统路径进行搜索) )lpFileName缺省的搜索次序:缺省的搜索次序:(1)(1)当前目录;当前目录;(2)Windows(2)Windows操作目录;操作目录;(3)Wi
10、ndows(3)Windows系统所在目录;系统所在目录;(4)PATH(4)PATH环境变量包含的目录环境变量包含的目录7SetFilePionter 函数:设置文件指针的位置函数:设置文件指针的位置DWORD SetFilePoinerDWORD SetFilePoiner( (HANDLE hFileHANDLE hFile,/文件句柄文件句柄LONG lpistanceToMoveLONG lpistanceToMove, /指针移动的字节数指针移动的字节数LPLONG lpDistanceToMoveHigh,LPLONG lpDistanceToMoveHigh, /指向指针移动距
11、离的高位指针指向指针移动距离的高位指针DWORD dwMoveMethodDWORD dwMoveMethod/指针移动参考位置标识指针移动参考位置标识) )8文件操作应用举例文件操作应用举例【例【例9-19-1】本例创建一个具有打开文件功能的对话框,并可进行文件的编】本例创建一个具有打开文件功能的对话框,并可进行文件的编辑与保存。辑与保存。9LRESULT APIENTRY MainWndProc(LRESULT APIENTRY MainWndProc() )1. 1. static HWND hWndEdit; static HWND hWndEdit; 2. switch(messag
12、e)2. switch(message)3. 3. case WM_CREATE:case WM_CREATE:4. hWndEdit=CreateWindow(EDIT,NULL,4. hWndEdit=CreateWindow(EDIT,NULL,WS_CHILD|WS_VISIBLE|WS_CHILD|WS_VISIBLE|WS_HSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL,WS_HSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL, 0,0,0,0,hWnd,(HMENU)ID_EDITCHILD,0,0,0,
13、0,hWnd,(HMENU)ID_EDITCHILD,(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);5. break;5. break;6. 6. case WM_SIZE: case WM_SIZE: 7. 7. MoveWindow(hWndEdit,0,0,LOWORD(lParam),HIWORD(lParam),MoveWindow(hWndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUET
14、RUE);); break;break;8. case WM_COMMAND:8. case WM_COMMAND:9. switch (LOWORD(wParam)9. switch (LOWORD(wParam)10. 10. case IDM_FILEOPEN: OpenTextFile(hWnd,hWndEdit); break;case IDM_FILEOPEN: OpenTextFile(hWnd,hWndEdit); break;11. 11. case IDM_FILESAVE: SaveTextFile(hWnd,hWndEdit); break;case IDM_FILES
15、AVE: SaveTextFile(hWnd,hWndEdit); break;12. 12. case IDM_EXIT: SendMessage(hWnd,WM_DESTROY,0L,0L); break;case IDM_EXIT: SendMessage(hWnd,WM_DESTROY,0L,0L); break;13. 13. case case IDM_ABOUT:DialogBox(hInst,AboutBox,hWnd,(DLGPROC)About);break ;IDM_ABOUT:DialogBox(hInst,AboutBox,hWnd,(DLGPROC)About);b
16、reak ;14. 14. default:return(DefWindowProc(hWnd,message,wParam,lParam);default:return(DefWindowProc(hWnd,message,wParam,lParam);15. 15. 16. break;16. break;17. case WM_DESTROY: PostQuitMessage(0); break;17. case WM_DESTROY: PostQuitMessage(0); break;18. default: return(DefWindowProc(hWnd,message,wPa
17、ram,lParam);18. default: return(DefWindowProc(hWnd,message,wParam,lParam); return(0); return(0); 10/* * 调用公共对话框函数,显示【打开】对话框调用公共对话框函数,显示【打开】对话框, ,检取用户选择检取用户选择的文本文件的文本文件, ,然后打开该文本文件到编辑控件中然后打开该文本文件到编辑控件中. .。void OpenTextFile(HWND hWnd,HWND hWndEdit)void OpenTextFile(HWND hWnd,HWND hWndEdit) OPENFILENAM
18、E OpenFileName; OPENFILENAME OpenFileName; char szDirNameMAX_PATH=;char szDirNameMAX_PATH=; char szFileMAX_PATH=0; char szFileMAX_PATH=0; char szFileTitle MAX_PATH=0;char szFileTitle MAX_PATH=0; / OPENFILENAME / OPENFILENAME 结构的过滤器规格说明。结构的过滤器规格说明。 char szFilter=“char szFilter=“文本文件文本文件( (* *.txt).tx
19、t)00* *.txt.txt 0C0C源程序文件源程序文件( (* *.c).c)00* *.c.c00所有文件所有文件00* *. .* *00; OpenFileName.lStructSize=sizeof(OPENFILENAME); OpenFileName.lStructSize=sizeof(OPENFILENAME);OpenFileName.lpstrDefExt=OpenFileName.lpstrDefExt=* *.txt;.txt; OpenFileName.lCustData=0; OpenFileName.lCustData=0;OpenFileName.Fla
20、gs= OFN_PATHMUSTEXIST|OpenFileName.Flags= OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;OFN_HIDEREADONLY;填写填写OpenFileNameOpenFileName对象属性对象属性111. if(GetOpenFileName(&OpenFileName)1. if(GetOpenFileName(&OpenFileName)2. HANDLE hFile; DWORD dwFileSize,dwBytesRead; char 2. HANDL
21、E hFile; DWORD dwFileSize,dwBytesRead; char * * lpBufPtr; lpBufPtr; 3. hFile=CreateFile(3. hFile=CreateFile(); ); / / 打开指定的文件打开指定的文件4. 4. if(hFile!=INVALID_HANDLE_VALUE)if(hFile!=INVALID_HANDLE_VALUE)5. dwFileSize=GetFileSize(hFile,NULL); /5. dwFileSize=GetFileSize(hFile,NULL); /检取文件字节大小。检取文件字节大小。6.
22、 6. if(dwFileSize!=0 xFFFFFFFF)if(dwFileSize!=0 xFFFFFFFF)7. lpBufPtr=(char 7. lpBufPtr=(char * *)malloc(dwFileSize); /)malloc(dwFileSize); /分配用来读入文件的缓冲区。分配用来读入文件的缓冲区。8. if(lpBufPtr!=NULL)8. if(lpBufPtr!=NULL)9. 9. ReadFile(hFile,(LPVOID)lpBufPtr,dwFileSize,&dwBytesRead,NULL);ReadFile(hFile,(LPVOID)
23、lpBufPtr,dwFileSize,&dwBytesRead,NULL);10. if(dwBytesRead!=0)10. if(dwBytesRead!=0) / /把文件内容装入多行编辑控件中,把文件内容装入多行编辑控件中, 11. SendMessage(hWndEdit,WM_SETTEXT,0,(LPARAM)lpBufPtr);11. SendMessage(hWndEdit,WM_SETTEXT,0,(LPARAM)lpBufPtr);12. SetWindowText(hWnd,OpenFileName.lpstrFile);12. SetWindowText(hWnd,
24、OpenFileName.lpstrFile);13. else13. else14. MessageBox(14. MessageBox(hWnd,“读入字节数为零读入字节数为零”,NULL,MB_OK|MB_ICONEXCLAMATION););15. 15. free(lpBufPtr);free(lpBufPtr);16. 16. 17. else17. else18. MessageBox(NULL,18. MessageBox(NULL,内存分配失败!内存分配失败!,NULL,MB_OK|MB_ICONEXCLAMATION);,NULL,MB_OK|MB_ICONEXCLAMAT
25、ION); 19. 19. 20. else20. else21. MessageBox(NULL,21. MessageBox(NULL,检取文件大小失败检取文件大小失败,NULL,MB_OK|MB_ICONEXCLAMATION);,NULL,MB_OK|MB_ICONEXCLAMATION);22. 22. CloseHandle(hFile) ;CloseHandle(hFile) ;23. 23. 24. else MessageBox(hWnd, 24. else MessageBox(hWnd, 打开文件失败打开文件失败,NULL,MB_OK|MB_ICONEXCLAMATION
26、);,NULL,MB_OK|MB_ICONEXCLAMATION);25. 25. 把文件内容读入缓冲区把文件内容读入缓冲区12/* * 调用公共对话框函数,显示【另存为】对话框调用公共对话框函数,显示【另存为】对话框, ,/* * 用户选择文本名用户选择文本名, ,然后把编辑控件中的内容保存到该文件中然后把编辑控件中的内容保存到该文件中. .void SaveTextFile(HWND hWnd, HWND hWndEdit )void SaveTextFile(HWND hWnd, HWND hWndEdit ) OPENFILENAME OpenFileName; OPENFILENAM
27、E OpenFileName; char szDirNameMAX_PATH=;char szDirNameMAX_PATH=;char szFileMAX_PATH=0;char szFileMAX_PATH=0;char szFileTitleMAX_PATH=0;char szFileTitleMAX_PATH=0;char szFilter=All Files0char szFilter=All Files0* *. .* *00;OpenFileName.lStructSize=sizeof(OPENFILENAME);OpenFileName.lStructSize=sizeof(
28、OPENFILENAME);OpenFileName.hWndOwner=hWnd; OpenFileName.hWndOwner=hWnd; OpenFileName.lCustData=0;OpenFileName.lCustData=0;OpenFileName.Flags=OFN_OVERWRITEPROMPT; OpenFileName.Flags=OFN_OVERWRITEPROMPT; 131. if (GetSaveFileName (&OpenFileName)1. if (GetSaveFileName (&OpenFileName)2. HANDLE hFile; DWO
29、RD dwFileSize,dwBytesWrite; char 2. HANDLE hFile; DWORD dwFileSize,dwBytesWrite; char * *lpBufPtr;lpBufPtr;3. 3. hFile=CreateFile(hFile=CreateFile(););4. if(hFile!=INVALID_HANDLE_VALUE)4. if(hFile!=INVALID_HANDLE_VALUE)5. /5. /检取编辑控件内容的字节大小。检取编辑控件内容的字节大小。6. dwFileSize=SendMessage(hWndEdit,WM_GETTEXT
30、LENGTH,0,0);6. dwFileSize=SendMessage(hWndEdit,WM_GETTEXTLENGTH,0,0);7. 7. if(dwFileSize!=0)if(dwFileSize!=0)8. lpBufPtr=(char 8. lpBufPtr=(char * *)malloc(dwFileSize); / )malloc(dwFileSize); / 分配文件缓冲区分配文件缓冲区。 9. 9. if(dwFileSize!=0)if(dwFileSize!=0)10.10./ / 把编辑控件中的内容装到文件缓冲区。把编辑控件中的内容装到文件缓冲区。 11. 1
31、1. SendMessage(hWndEdit,WM_GETTEXT,dwFileSize,(LPARAM)lpBufPtr);SendMessage(hWndEdit,WM_GETTEXT,dwFileSize,(LPARAM)lpBufPtr);12. 12. /把文件缓冲区中的数据存写到文件中。把文件缓冲区中的数据存写到文件中。 13. 13. WriteFile(hFile,(LPVOID)lpBufPtr,dwFileSize,&dwBytesWrite,NULL); WriteFile(hFile,(LPVOID)lpBufPtr,dwFileSize,&dwBytesWrite,
32、NULL); 14. SetWindowText(hWnd,OpenFileName.lpstrFile);14. SetWindowText(hWnd,OpenFileName.lpstrFile);15. free(lpBufPtr); 15. free(lpBufPtr); 16. 16. 17. else 17. else 18. MessageBox(NULL,18. MessageBox(NULL,内存分配失败!内存分配失败!,NULL,MB_OK|MB_ICONEXCLAMATION); ,NULL,MB_OK|MB_ICONEXCLAMATION); 19. 19. 20. e
33、lse 20. else 21. MessageBox(NULL,21. MessageBox(NULL,编辑控件中内容为空编辑控件中内容为空,NULL,MB_OK|MB_ICONEXCLAMATION);,NULL,MB_OK|MB_ICONEXCLAMATION);22. 22. CloseHandle(hFile);CloseHandle(hFile);23. 23. 24. else 24. else 25. MessageBox(hWnd,25. MessageBox(hWnd,创建文件失败!创建文件失败!,NULL,MB_OK|MB_ICONEXCLAMATION);,NULL,M
34、B_OK|MB_ICONEXCLAMATION);26. 26. 创建文件,如果已创建文件,如果已有同名文件,则覆盖有同名文件,则覆盖14BOOL APIENTRY About(BOOL APIENTRY About(HWND hDlg,HWND hDlg,UINT message,UINT message,WPARAM wParam,WPARAM wParam,LPARAM lparam)LPARAM lparam) switch (message)switch (message) case WM_INITDIALOG: return (TRUE ); case WM_INITDIALOG:
35、 return (TRUE ); case WM_COMMAND:case WM_COMMAND: if(LOWORD(wParam)=IDOK|LOWORD(wParam)=IDCANCEL) if(LOWORD(wParam)=IDOK|LOWORD(wParam)=IDCANCEL) EndDialog(hDlg,TRUE); EndDialog(hDlg,TRUE); return (TRUE); return (TRUE); break; break; return(FALSE);return(FALSE); 15剪贴板剪贴板:通过剪贴板的操作,可对某一部分内容进行不同位置通过剪贴板
36、的操作,可对某一部分内容进行不同位置进行复制、移动。进行复制、移动。使用剪贴板首先应考虑的问题是其支持的使用剪贴板首先应考虑的问题是其支持的数据格式数据格式。在使用剪贴板之前,应用程序需将准备操作剪贴板的数据初在使用剪贴板之前,应用程序需将准备操作剪贴板的数据初始化为系统预定义的始化为系统预定义的数据格式数据格式。 剪贴板剪贴板16应用程序向剪贴板发送文本应用程序向剪贴板发送文本应用程序向剪贴板发送文本的操作过程可分为如下应用程序向剪贴板发送文本的操作过程可分为如下5个步骤个步骤1. 拷贝文本到全局内存拷贝文本到全局内存调用调用GlobalAlloc函数为文本分配全局存储空间函数为文本分配全局
37、存储空间HGLOBAL GlobalAllocHGLOBAL GlobalAlloc(UINT uFlagsUINT uFlags,/函数分配内存形式标识。函数分配内存形式标识。 DWORD dwBytes)DWORD dwBytes)/分配字节数分配字节数然后调用然后调用 GlobalLock 函数锁定分配的内存块函数锁定分配的内存块 LPVOID GlobalLockLPVOID GlobalLock(HGLOBAL hMemHGLOBAL hMem) /hMem/hMem为内存块地址为内存块地址把数据拷贝到内存以后,应及时调用把数据拷贝到内存以后,应及时调用GlobalUnLock 解锁
38、内存句柄解锁内存句柄BOOL GlobalUnLock BOOL GlobalUnLock (HGLOBAL hMemHGLOBAL hMem) /hMem/hMem为内存句柄为内存句柄172. 打开剪贴板打开剪贴板该步骤由应用程序调用该步骤由应用程序调用OpenClipboard OpenClipboard 函数完成函数完成 BOOL OpenClipboard BOOL OpenClipboard (HWND hwndHWND hwnd) /hwnd/hwnd为打开剪贴板的窗口句柄。为打开剪贴板的窗口句柄。3清除剪贴板中的所有句柄清除剪贴板中的所有句柄该步骤由应用程序调用函数该步骤由应用程
39、序调用函数EmptyClipboard 完成完成BOOL EmptyClipboard BOOL EmptyClipboard (VOIDVOID)4. 向剪贴板传送文本全局内存句柄向剪贴板传送文本全局内存句柄该步骤由应用程序调用函数该步骤由应用程序调用函数 SetClipboardData 完成,完成,HANDLE SetClipboardDataHANDLE SetClipboardData(UINT uFormatUINT uFormat,/数据格式标识数据格式标识 HANDLE hMem)HANDLE hMem)/数据句柄数据句柄应用程序一旦将文本内存句柄传递给剪贴板,则该句柄属于剪应
40、用程序一旦将文本内存句柄传递给剪贴板,则该句柄属于剪贴板,应用程序不能再对其进行操作。贴板,应用程序不能再对其进行操作。185. 关闭剪贴板关闭剪贴板该步骤由应用程序调用函数该步骤由应用程序调用函数CloseClipboard完成完成 BOOL CloseClipboardBOOL CloseClipboard(VOIDVOID)下面的程序段是应用程序向剪贴板发送文本的一般过程:下面的程序段是应用程序向剪贴板发送文本的一般过程:1. HANDLE hText1. HANDLE hText; LPTSTR lpStringLPTSTR lpString,lpTextlpText;2. 2. 3.
41、 case IDM_COPY; /3. case IDM_COPY; /分配全局内存分配全局内存4. if4. if(!(!(hText=GloalbAllochText=GloalbAlloc(GWNDGWND,SizeofSizeof(lpSringlpSring)5. 5. MessageBoxMessageBox(hwnd,“ hwnd,“ 全局内存分配失败!全局内存分配失败!”,“ “ 提示提示”,MB_OKMB_OK);break;break;6. lpText=GlobalLock(hText); /6. lpText=GlobalLock(hText); /锁定文本内存句柄并返
42、回文本指针锁定文本内存句柄并返回文本指针7. lstrcpy7. lstrcpy(lpTextlpText,lpStringlpString); /; /拷贝文本拷贝文本8. GlobalUnlock8. GlobalUnlock(hTexthText);); /解锁文本内存句柄解锁文本内存句柄9. If9. If(!(!OpenClipboardOpenClipboard(hwndhwnd)10. MessageBox(hwnd,10. MessageBox(hwnd,剪贴板打开失败!剪贴板打开失败!,提示提示,MB_OK);break,MB_OK);break; 11. EmptyClip
43、board( ); /11. EmptyClipboard( ); /清除剪贴板清除剪贴板12. SetCilpboardData12. SetCilpboardData(CF_TEXT,hTextCF_TEXT,hText); /; /设置剪贴板文本设置剪贴板文本13. CloseClipboard13. CloseClipboard();(); /关闭剪贴板关闭剪贴板14. hText=NULL /14. hText=NULL /以避免应用程序再通过该句柄执行其他操作以避免应用程序再通过该句柄执行其他操作15. break15. break;19获取剪贴板文本获取剪贴板文本应用程序从剪贴板
44、上获取文本的操作过程可分为如下应用程序从剪贴板上获取文本的操作过程可分为如下4 4个步骤个步骤1 1打开剪贴板打开剪贴板: : 调用函数调用函数OpenClipboardOpenClipboard打开剪贴板打开剪贴板2 2检查剪贴板数据格式检查剪贴板数据格式: :由函数由函数IsClipboardFormatAvailableIsClipboardFormatAvailable完成完成 BOOL IsClipboardFormatAvailableBOOL IsClipboardFormatAvailable(UINT uformatUINT uformat)4 4关闭剪贴板:调用函数关闭剪贴
45、板:调用函数CloseClipboardCloseClipboard关闭剪贴板。关闭剪贴板。获取的内存句柄属于剪贴板,不属获取的内存句柄属于剪贴板,不属于应用程序,因此应用程序读取剪于应用程序,因此应用程序读取剪贴板中的数据后,只能调用函数贴板中的数据后,只能调用函数GlobalUnlockGlobalUnlock解锁该内存句柄而无解锁该内存句柄而无法将其释放。法将其释放。3 3获取剪贴板文本获取剪贴板文本: :由函数由函数GetClipboardDataGetClipboardData完成,完成, HANDLE GetClipboardDataHANDLE GetClipboardData(
46、UINT uformat)UINT uformat)uformatuformat为数为数据格式标识据格式标识获取剪贴板文本内获取剪贴板文本内存句柄后即可调用存句柄后即可调用GlobalLockGlobalLock返回指返回指向文本的指针向文本的指针201. 1. 下面的程序段是应用程序获取剪贴板文本的一般形式:下面的程序段是应用程序获取剪贴板文本的一般形式:2. HANDLE hText2. HANDLE hText;3. LPTSTR lpString3. LPTSTR lpString,lpTextlpText;4. 4. 5. case IDM_PASTE; 5. case IDM_PA
47、STE; 6. if(!IsClipboardFormstAvailable(CF_TEXT) /6. if(!IsClipboardFormstAvailable(CF_TEXT) /检查剪贴板的数据格式检查剪贴板的数据格式7. MessageBox(hwnd,“7. MessageBox(hwnd,“剪贴板上无文本数据剪贴板上无文本数据”,“提示提示”,MB_OK); BreakMB_OK); Break; 8. 8. ifif(!(!OpenClipboardOpenClipboard(hwndhwnd) /打开剪贴板打开剪贴板9. MessageBox9. MessageBox(hwn
48、d“hwnd“剪贴板板开失败剪贴板板开失败”,“提示提示”,MB_OK);Brdak;MB_OK);Brdak;10. 10. /获取剪贴板文本内存句柄获取剪贴板文本内存句柄11. 11. if(!(hText=GetClipboardData(CF_TEXT)if(!(hText=GetClipboardData(CF_TEXT) MessageBox(hwnd,“ MessageBox(hwnd,“无法读取剪贴板数据无法读取剪贴板数据”,“,“提示提示”,MB_OK);,MB_OK); CloseClipboard(); Break; CloseClipboard(); Break; lp
49、Texe=GlobalLock(hText);lpTexe=GlobalLock(hText);/锁定文本内存名柄并返回文本指针锁定文本内存名柄并返回文本指针 /复制剪贴板文本内容复制剪贴板文本内容 lpString=lpString=(LPTSTRLPTSTR)mallocmalloc(GlobalSizeGlobalSize(hTexthText);); lpstrcpylpstrcpy(lpStringlpString,lpTextlpText);); GlobalUnlockGlobalUnlock(hTexthText);); /解锁文本内存句柄解锁文本内存句柄 CloseClipb
50、oardCloseClipboard();(); /关闭剪贴板关闭剪贴板 12.12. break break;219.2.3 剪贴板应用举例剪贴板应用举例【例【例9-29-2】本例要求创建一个对话框,具有剪切】本例要求创建一个对话框,具有剪切、复制、粘贴、取消动作及退出等功能。、复制、粘贴、取消动作及退出等功能。22# include # include # include # include # include # include # include # include # include # include # include # include # include 9_2.h# inc