版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单击此处编辑母版标题样式*单击此处编辑母版文本样式第二级第三级第四级第五级Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth level*吉林大学远程教育课件-WindowsAPI编吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48第三十讲)/函数:WndProc/作用:主窗口消息循环LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam,
2、 LPARAM lParam)static BOOL bNeedSave = FALSE; /是否保存文件的标志static char szFileName_MAX_PATH;/文件名static char szTitleName_MAX_FNAME + _MAX_EXT;static HINSTANCE hInst;/应用程序句柄static HWND hwndEdit;/编辑框句柄static int iOffset;static UINT iMsgFindReplace;LPFINDREPLACE pfr;switch (iMsg)case WM_CREATE:/创建窗口hInst =
3、(LPCREATESTRUCT) lParam) - hInstance ;/创建编辑框hwndEdit = CreateWindow (edit, NULL,WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |WS_BORDER | ES_LEFT | ES_MULTILINE |ES_NOHIDESEL | ES_AUTOHSCROLL | ES_AUTOVSCROLL,0, 0, 0, 0,hwnd, (HMENU) EDITID, hInst, NULL) ;SendMessage (hwndEdit, EM_LIMITTEXT, 3200
4、0, 0L);PopFileInitialize (hwnd);/初始化ofn/注册消息FINDMSGSTRINGiMsgFindReplace = RegisterWindowMessage (FINDMSGSTRING) ;lstrcpy (szFileName, (PSTR) (LPCREATESTRUCT) lParam)-lpCreateParams) ;if (strlen (szFileName) 0)GetFileTitle (szFileName, szTitleName, sizeof (szTitleName); /获取文件名if (!PopFileRead (hwndE
5、dit, szFileName)/读文件OkMessage (hwnd, 文件 %s 不能读取!, szTitleName);DoCaption (hwnd, szTitleName);return 0;case WM_SETFOCUS:SetFocus (hwndEdit);/使编辑框获得焦点return 0; case WM_SIZE: MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE);return 0;case WM_COMMAND:/ 菜单命令if (lParam & LOWORD (wParam)
6、= EDITID) switch (HIWORD (wParam) case EN_UPDATE:bNeedSave = TRUE;return 0;case EN_ERRSPACE:case EN_MAXTEXT:MessageBox (hwnd, 编辑框超出边界!.,szAppName, MB_OK | MB_ICONSTOP);return 0; break; switch (LOWORD (wParam)/ 来自文件菜单的消息if (bNeedSave & IDCANCEL =AskAboutSave (hwnd, szTitleName) return 0;SetWindowText
7、 (hwndEdit, 0);szFileName0 = 0;szTitleName0 = 0;DoCaption (hwnd, szTitleName);bNeedSave = FALSE;return 0;if (bNeedSave & IDCANCEL =AskAboutSave (hwnd, szTitleName)return 0 ; /弹出Open对话框if (PopFileOpenDlg (hwnd, szFileName, szTitleName)/读文件if (!PopFileRead (hwndEdit, szFileName) OkMessage (hwnd, 不能读取文
8、件%s!,szTitleName);szFileName0 = 0;szTitleName0 = 0;DoCaption (hwnd, szTitleName);bNeedSave = FALSE; return 0;if (szFileName0)/写文件if (PopFileWrite (hwndEdit, szFileName) bNeedSave = FALSE; return 1;elseOkMessage (hwnd, 不能写文件 %s,szTitleName) ;return 0; /弹出Save AS对话框if (PopFileSaveDlg (hwnd, szFileName
9、, szTitleName) DoCaption (hwnd, szTitleName) ; if (PopFileWrite (hwndEdit, szFileName) bNeedSave = FALSE; return 1; elseOkMessage (hwnd, 不能写文件%s,szTitleName) ;return 0;SendMessage (hwnd, WM_CLOSE, 0, 0);return 0;case IDM_UNDO :/撤消 SendMessage (hwndEdit, WM_UNDO, 0, 0); return 0; case IDM_CUT: /剪切 Se
10、ndMessage (hwndEdit, WM_CUT, 0, 0); return 0; SendMessage (hwndEdit, WM_COPY, 0, 0); return 0; SendMessage (hwndEdit, WM_PASTE, 0, 0); return 0; SendMessage (hwndEdit, WM_CLEAR, 0, 0); return 0; SendMessage (hwndEdit, EM_SETSEL, 0, -1); return 0;SendMessage (hwndEdit, EM_GETSEL, NULL,(LPARAM) &iOffs
11、et);hDlgModeless = PopFindFindDlg (hwnd);return 0; SendMessage (hwndEdit, EM_GETSEL, NULL,(LPARAM) &iOffset); if (PopFindValidFind () PopFindNextText (hwndEdit, &iOffset);else hDlgModeless = PopFindFindDlg (hwnd); return 0; SendMessage (hwndEdit, EM_GETSEL, NULL,(LPARAM) &iOffset); hDlgModeless = Po
12、pFindReplaceDlg (hwnd);return 0;break;case WM_CLOSE: if (!bNeedSave | IDCANCEL != AskAboutSave (hwnd, szTitleName) DestroyWindow (hwnd); return 0;case WM_QUERYENDSESSION : if (!bNeedSave | IDCANCEL != AskAboutSave (hwnd, szTitleName)return 1;return 0; case WM_DESTROY:PostQuitMessage (0);return 0;def
13、ault: /处理Find-Replace 消息if (iMsg = iMsgFindReplace)pfr = (LPFINDREPLACE) lParam ;if (pfr-Flags & FR_DIALOGTERM)hDlgModeless = NULL;if (pfr-Flags & FR_FINDNEXT)if (!PopFindFindText (hwndEdit, &iOffset, pfr)OkMessage (hwnd, 文本没找到!, 0) ;if (pfr-Flags & FR_REPLACE |pfr-Flags & FR_REPLACEALL)if (!PopFind
14、ReplaceText (hwndEdit, &iOffset, pfr)OkMessage (hwnd, 文本没找到!, 0) ;if (pfr-Flags & FR_REPLACEALL) while (PopFindReplaceText (hwndEdit, &iOffset, pfr); return 0 ;break ;return DefWindowProc (hwnd, iMsg, wParam, lParam) ; /函数:PopFileInitialize/作用:初始化全局变量ofnvoid PopFileInitialize (HWND hwnd) static char
15、 szFilter = 文本文件(*.TXT)0*.txt0 ASCII文件(*.ASC)0*.asc0 所有文件 (*.*)0*.*00 ; ofn.lStructSize= sizeof (OPENFILENAME) ; ofn.hwndOwner= hwnd ; ofn.hInstance= NULL ; ofn.lpstrFilter= szFilter ; ofn.lpstrCustomFilter = NULL ; ofn.nMaxCustFilter= 0 ; ofn.nFilterIndex= 0 ; ofn.lpstrFile= NULL ; ofn.nMaxFile= _M
16、AX_PATH ; ofn.lpstrFileTitle= NULL ; ofn.nMaxFileTitle= _MAX_FNAME + _MAX_EXT ; ofn.lpstrInitialDir= NULL ; ofn.lpstrTitle= NULL ; ofn.Flags= 0 ; ofn.nFileOffset= 0 ; ofn.nFileExtension= 0 ; ofn.lpstrDefExt= txt ; ofn.lCustData= 0L ; ofn.lpfnHook= NULL ; ofn.lpTemplateName= NULL ; /函数:PopFileOpenDlg
17、/作用:弹出Open对话框BOOL PopFileOpenDlg (HWND hwnd, PSTR pstrFileName, PSTR pstrTitleName) ofn.hwndOwner= hwnd ; ofn.lpstrFile= pstrFileName ; ofn.lpstrFileTitle= pstrTitleName ; ofn.Flags= OFN_HIDEREADONLY; return GetOpenFileName (&ofn) ;/弹出Open对话框/函数:PopFileSaveDlg/作用:弹出Save As对话框BOOL PopFileSaveDlg (HWN
18、D hwnd, PSTR pstrFileName, PSTR pstrTitleName) ofn.hwndOwner= hwnd ; ofn.lpstrFile= pstrFileName ; ofn.lpstrFileTitle= pstrTitleName ; ofn.Flags= OFN_OVERWRITEPROMPT ; return GetSaveFileName (&ofn) ;/函数:PopFileLength/作用:计算文件长度static long PopFileLength (FILE *file) int iCurrentPos, iFileLength ; iCur
19、rentPos = ftell (file) ; 吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十一讲) fseek (file, 0, SEEK_END) ; iFileLength = ftell (file) ; fseek (file, iCurrentPos, SEEK_SET) ; return iFileLength ;/函数:PopFileRead/作用:读取文件BOOL PopFileRead (HWND hwndEdit, PSTR pstrFileName) FILE *file; int iLength; PSTR pstrBu
20、ffer;/打开文件 if (NULL = (file = fopen (pstrFileName, rb) return FALSE; iLength = PopFileLength (file);/获取文件长度 if (NULL = (pstrBuffer = (PSTR) malloc (iLength) fclose (file); /关闭文件return FALSE; fread (pstrBuffer, sizeof(char), iLength, file);/读取文件 fclose (file); pstrBufferiLength = 0; SetWindowText (hw
21、ndEdit, pstrBuffer); /设置编辑框中的文本内容 return TRUE; /函数:PopFileWrite/作用:写文件BOOL PopFileWrite (HWND hwndEdit, PSTR pstrFileName) FILE *file ; int iLength ; PSTR pstrBuffer ; if (NULL = (file = fopen (pstrFileName, wb)/打开文件 return FALSE ; iLength = GetWindowTextLength (hwndEdit) ; /获取编辑框中的文本内容长度 if (NULL =
22、 (pstrBuffer = (PSTR) malloc (iLength + 1) fclose (file) ;/关闭文件 return FALSE ; /获取编辑框中的文本内容 GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;/写文件 if (iLength != (int) fwrite (pstrBuffer, 1, iLength, file) fclose (file);/关闭文件 free (pstrBuffer); return FALSE; fclose (file); free (pstrBuffer); return
23、 TRUE;/函数:PopFindFindDlg/作用:弹出Find对话框HWND PopFindFindDlg (HWND hwnd) static FINDREPLACE fr; /初始化fr变量 fr.lStructSize= sizeof (FINDREPLACE); fr.hwndOwner= hwnd; fr.hInstance= NULL; fr.Flags=FR_HIDEUPDOWN | FR_HIDEMATCHCASE | FR_HIDEWHOLEWORD; fr.lpstrFindWhat= szFindText; fr.lpstrReplaceWith = NULL; f
24、r.wFindWhatLen= sizeof (szFindText); fr.wReplaceWithLen= 0; fr.lCustData = 0; fr.lpfnHook= NULL; fr.lpTemplateName= NULL; return FindText (&fr);/ 弹出Find对话框 /函数:PopFindReplaceDlg/作用:弹出Replace对话框HWND PopFindReplaceDlg (HWND hwnd) static FINDREPLACE fr; /初始化fr变量 fr.lStructSize= sizeof (FINDREPLACE); fr
25、.hwndOwner= hwnd; fr.hInstance= NULL; fr.Flags=FR_HIDEUPDOWN | FR_HIDEMATCHCASE | FR_HIDEWHOLEWORD; fr.lpstrFindWhat= szFindText; fr.lpstrReplaceWith = szReplText; fr.wFindWhatLen= sizeof (szFindText); fr.wReplaceWithLen= sizeof (szReplText); fr.lCustData= 0; fr.lpfnHook= NULL; fr.lpTemplateName= NU
26、LL; return ReplaceText (&fr); /弹出Replace对话框/函数:PopFindFindText/作用:查找字符串BOOL PopFindFindText (HWND hwndEdit, int *piSearchOffset, LPFINDREPLACE pfr) int iLength, iPos; PSTR pstrDoc, pstrPos;/获取编辑框中的文本内容长度 iLength = GetWindowTextLength (hwndEdit); if (NULL = (pstrDoc = (PSTR) malloc (iLength + 1) retu
27、rn FALSE;/获取编辑框中的文本内容 GetWindowText (hwndEdit, pstrDoc, iLength + 1); pstrPos = strstr (pstrDoc + *piSearchOffset, pfr-lpstrFindWhat); free (pstrDoc); if (pstrPos = NULL) return FALSE; iPos = pstrPos - pstrDoc; *piSearchOffset = iPos + strlen (pfr-lpstrFindWhat); SendMessage (hwndEdit, EM_SETSEL, iP
28、os, *piSearchOffset); SendMessage (hwndEdit, EM_SCROLLCARET, 0, 0); return TRUE; /函数:PopFindNextText/作用:查找下一处字符串BOOL PopFindNextText (HWND hwndEdit, int *piSearchOffset) FINDREPLACE fr; fr.lpstrFindWhat = szFindText; return PopFindFindText (hwndEdit, piSearchOffset, &fr);/函数:PopFindReplaceText/作用:替换
29、文本BOOL PopFindReplaceText (HWND hwndEdit, int *piSearchOffset, LPFINDREPLACE pfr) if (!PopFindFindText (hwndEdit, piSearchOffset, pfr) /弹出Replace对话框 return FALSE; SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) pfr-lpstrReplaceWith); return TRUE;BOOL PopFindValidFind (void) return *szFindText != 0
30、;首先声明了一个OPENFILENAME结构体的全局静态变量ofn,这个变量用于记录打开一个文件时系统需要的各种信息。OPENFILENAME结构体的具体定义如下:在调用打开文件对话框打开一个文件之前,必须先对OFN变量的各个域进行初始化。在处理消息WM_CREATE时,程序调用自定义的函数PopFilelnitialize对OFN进行初始化操作。函数PopFileInitialize的完整定义如下:然后,程序调用函数RegisterWindowMessage对消息FINDMSGSTRING进行注册。Windows允许用户使用系统预定义的消息,也允许用户使用自定义的消息,但是在使用自定义的消息
31、之前,必须对消息进行注册。函数RegisterWindowMessage的原型定义如下:程序通过如下语句取得在命令行中指定的文件名: 其中,lParatn是消息处理函数的参数lParam是指向CREATESTRUCT结构体的指针,CREATESTRUCT结构体的成员变量 lpCreateParams中记录在创建窗口时,程序传递给CreateWindow函数的 lpParam参数的值 szCmdLine,而 szCmdLine又是 WinMain函数用于接收用户命令行的参数。 所以,上述语句的目的就是取得用户的命令行参数。lstrcpy用于把字符串复制到另一个字符串中,函数原型定义如下:如果命令
32、行中指定了打开的文件名,即szFileName不为空,则程序调用如下语句来加以处理:吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十二讲)其中,函数GetFileTitle用于获取文件名,函数原型定义如下所示。 在取得文件名后,程序调用函数PopFileRead把文件中的数据读人到编辑框中。函数PopFileRead的具体定义如下:在PopFileRead函数中,首先定义了文件指针file,然后通过函数fopen打开由pstrFileName指定的文件,fopen函数的原型定义如下:然后,程序调用 PopFileLength采取得文件的长度,PopFi
33、leLength也是自定义的函数,其具体定义如下:函数PopFileLength中首先通过ftell取得文件指针的当前位置,并把结果保存在iCurrentPos中,ftell函数的原型定义如下: PopFileLength然后调用 fseek函数移动文件指针到文件末尾处, fseek函数的原型定义如下:程序中指定 offset参数的值为 0,指定 origin参数的值为 SEEK_END,表示把文件指针移动到距离文件末尾为0的位置,即文件的末尾处。在把文件指针移动到文件末尾后,再一次调用函数ftell取得当前的文件指针的位置,并把结果保存在iFileLength变量中。在取得文件的长度后,还必
34、须把文件指针复位,以便后续的文件操作。函数fread实现读取文件中的数据,这个函数的原型定义如下;函数SetWindowsText用于把读取到的数据显示在编辑框中,函数原型定义如下: OkMessage是自定义的一个通用函数,其主要作用是当程序顺利完成某一项操作后向用户通报操作成功的消息。 DoCaption也是自定义的一个通用函数,其主要作用是处理某个窗口的标题。 如果用户选择了文件菜单下的“打开”菜单项,则程序通过图形代码来进行相应的处理。用户选择文件菜单下的“打开”菜单项的目的就是希望打开一个新文件,但是在打开新文件之前必须检查编辑框中的内容是否已经保存,如果没有保存,则bNeedSav
35、e变量将被置成TRUE,通过检查bNeedSave变量的值可以决定是否需要对编辑框中的内容进行保存操作。函数AskAboutSave是自定义的函数,其作用是提示用户对没有保存的内容进行保存。函数AskAboutSave的具体定义如下: 在上述程序中,函数MessageBox用于弹出一个消息框,函数原型定义如下:如果用户认为需要保存文件,则必然会单击消息框中的Yes按钮,这时MessageBox函数的返回值为IDYES,程序于是接着调用SendMessage函数向应用程序发送一条WM_COMMAND消息,对这条消息的附加信息指定为IDM_SAVE。应用程序在接收到这条消息后,程序流程将转到对保存
36、菜单项进行相应处理的代码处。 真正实现弹出 Open对话框的是 PopFileOpenDlg函数,函数的定义如下:上述程序段中通过对 Windows API函数 GetOpenFileName的调用来实现弹出 Open对话框,GetOpenFileName函数的原型定义如下:如果成功地打开某一个文件后,PopFileOpeDlg函数将返回TRUE,于是程序接着调用函数DoCaption改变窗口标题,同时把变量bNeedSave的值设置为FALSE。其他对话框的使用大致也遵循和Open对话框类似的过程。 例题的头文件Edith如下:例题的资源文件如下例题执行结果如图所示。 吉林大学远程教育课件W
37、indows A P I编 程主讲人 : 翟慧杰学 时:48(第三十三讲)第十章多文档界面 第一节MDI概念 第二节示例程序 吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十四讲)吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十五讲)吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十六讲)第十一章 动态链接库 第一节 动态链接库基础知识 吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十七讲)吉林大学远程教育课件Windows A
38、P I编 程主讲人 : 翟慧杰学 时:48(第三十八讲)吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第三十九讲)吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第四十讲)例1:#include #define MAX_STRINGS 256/最大字符串数typedef struct HDC hdc; int xText; int yText; int xStart; int yStart; int xIncr; int yIncr; int xMax; int yMax;CBPARAM;PSTR pszStringsM
39、AX_STRINGS;int iTotal = 0;/当前字符串数目BOOL CALLBACK GetStr (PSTR pString, CBPARAM *pcbp);/函数:DllMain/作用:DLL入口int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)return TRUE; /函数:EnterString/作用:输入字符串int WINAPI EnterString (PSTR pStringIn) HANDLE hString; PSTR pString; int i, iLengt
40、h, iCompare; if (iTotal = MAX_STRINGS - 1)/达到最大字符串数目return FALSE; iLength = strlen (pStringIn);/获取字符串长度 if (iLength = 0)/空字符串return FALSE;/创建映像文件 hString=CreateFileMapping(HANDLE)-1,NULL, PAGE_READWRITE, 0, 1 + iLength, NULL); if (hString = NULL)return FALSE; pString = (PSTR) MapViewOfFile (hString,
41、 FILE_MAP_WRITE, 0, 0, 0); strcpy (pString, pStringIn); AnsiUpper (pString);/全部转换成大写for (i = iTotal; i 0; i-)iCompare = strcmpi (pStringIn, pszStringsi - 1); /比较字符串if (iCompare = 0)/字符出不等则调处循环break;pszStringsi = pszStringsi - 1; /字符出相等则删除字符串pszStringsi = pString;iTotal+;return TRUE; /函数:DeleteString
42、 /作用:输入字符串int WINAPI DeleteString(PSTR pStringIn)int i, j, iCompare;if (0 = strlen (pStringIn)/忽略输入的空字符串return FALSE;for (i = 0 ; i iTotal ; i+)/字符串排序 iCompare = lstrcmpi (pszStringsi, pStringIn); if (iCompare = 0)break;if (i = iTotal)return FALSE;UnmapViewOfFile (pszStringsi);for (j = i ; j iTotal
43、; j+)pszStringsj = pszStringsj + 1;pszStringsiTotal- = NULL; return TRUE; /函数:GetStrings/作用:输出所有的字符串int WINAPI GetStrings(CBPARAM * pParam)BOOL bReturn;int i;for (i = 0; i hdc, pcbp-xText, pcbp-yText,pString, strlen (pString); if (pcbp-yText += pcbp-yIncr) pcbp-yMax)pcbp-yText = pcbp-yStart;if (pcbp
44、-xText += pcbp-xIncr) pcbp-xMax)return FALSE;return TRUE ;#include#include#includeexetest.h#define MAXLEN 32#define MAX_STRINGS 256 /最大字符串数#define WM_DATACHANGE WM_USERtypedef struct HDC hdc; int xText; int yText; int xStart; int yStart; int xIncr; int yIncr; int xMax; int yMax;CBPARAM; LRESULT CALL
45、BACK WndProc (HWND, UINT, WPARAM, LPARAM);/声明动态链接库中的函数原型int WINAPI EnterString (PSTR pStringIn);int WINAPI DeleteString (PSTR pStringIn);int WINAPI GetStrings(CBPARAM * pParam);char szAppName = exetest;char szStringMAXLEN;/函数:WinMain/作用:程序入口int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst
46、ance,PSTR szCmdLine, int iCmdShow) HWND hwnd; MSG msg; WNDCLASSEX wndclass; wndclass.cbSize = sizeof (wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL
47、, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); hwnd = CreateW
48、indow (szAppName, DLL Demonstration Program, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd);/消息循环 while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg); DispatchMessage (&msg); ret
49、urn msg.wParam;/函数:DlgProc/作用:对话可小型处理BOOL CALLBACK DlgProc (HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) switch (iMsg) SendDlgItemMessage (hDlg, IDD_STRING,EM_LIMITTEXT,MAXLEN - 1,0); return TRUE; switch (wParam) /获取字符串 GetDlgItemText (hDlg, IDD_STRING, szString, MAXLEN); EndDialog (hDlg, TRU
50、E);/关闭对话框 return TRUE; EndDialog (hDlg, FALSE);/关闭对话框 return TRUE; return FALSE ; /函数:EnumCallBack/作用:通知主窗口中的数据是否发生变化BOOL CALLBACK EnumCallBack (HWND hwnd, LPARAM lParam) char szClassName16 ; GetClassName (hwnd, szClassName, sizeof (szClassName);/获取窗口类名 if (0 = strcmp (szClassName, szAppName) SendMe
51、ssage (hwnd, WM_DATACHANGE, 0, 0) ; return TRUE ;/函数:WndProc/作用:处理主窗口消息LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) static HINSTANCE hInst; static int cxChar, cyChar, cxClient, cyClient; CBPARAM cbparam; HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm;hInst = (LPCREATESTRUCT)
52、 lParam)-hInstance; hdc = GetDC (hwnd); GetTextMetrics (hdc, &tm); cxChar = (int) tm.tmAveCharWidth; cyChar = (int) (tm.tmHeight + tm.tmExternalLeading); ReleaseDC (hwnd, hdc); return 0 ;case WM_COMMAND: switch (wParam) case IDM_ENTER :/单击输入菜单项/生成添加对话框if (DialogBox (hInst, EnterDlg, hwnd, &DlgProc)
53、if (EnterString (szString)/调用DLL中定义的函数EnterStringEnumWindows (&EnumCallBack, 0);elseMessageBeep (0);break; /生成删除对话框if (DialogBox (hInst, DeleteDlg, hwnd, &DlgProc) if (DeleteString (szString)EnumWindows (&EnumCallBack, 0);elseMessageBeep (0); break;return 0; cxClient = (int) LOWORD (lParam); cyClien
54、t = (int) HIWORD (lParam); return 0; InvalidateRect (hwnd, NULL, TRUE); return 0; hdc = BeginPaint (hwnd, &ps); cbparam.hdc = hdc; cbparam.xText = cbparam.xStart = cxChar; cbparam.yText = cbparam.yStart = cyChar; cbparam.xIncr = cxChar * MAXLEN; cbparam.yIncr = cyChar; cbparam.xMax = cbparam.xIncr *
55、 (1 + cxClient / cbparam.xIncr); cbparam.yMax = cyChar * (cyClient / cyChar - 1); /调用动态链接库定义中的函数GetStrings GetStrings (&cbparam); EndPaint (hwnd, &ps); return 0;PostQuitMessage (0);return 0; return DefWindowProc (hwnd, iMsg, wParam, lParam);吉林大学远程教育课件Windows A P I编 程主讲人 : 翟慧杰学 时:48(第四十一讲) 第12章 Windo
56、ws的内存管理 第一节 Windows内存管理概述 Windows是一个多任务的操作系统,由于同时可以运行多个任务,因此Windows必须小心地管理系统的存储空间,以便一个应用程序对内存的要求得到满足的同时不会影响其他任务的执行。 尽管微处理机向物理内存写或读都是使用物理地址,但是程序员在程序设计中却是使用逻辑地址来对物理内存进行操作。逻辑地址包括两部分: 段标识符 用于说明存取的内存段的值; 偏移值 相对于段地址的字节数。 微处理器能把由段地址和偏移地址组成的逻辑地址转换成物理地址。 在Windows系统平台中,进程是系统内存管理的基础。通常,进程具有它自己私有的虚拟地址空间、代码、数据和其
57、他操作系统资源。进程必须至少具有一个运行在该进程之内的执行线程。 每个运行于Windows下的进程和其他进程可以得到私有的32位虚拟地址空间,最多可访问 4GB内存。在 Windows 95中底层 IGB的内存空间是处于完全保护状态,顶层2GB的内存空间处于较差的安全状态;而在Windows NT中,系统保持整个4GB的内存空间是完全保护的。 内存分配归为两个主要类型:堆分配和栈分配。当用堆分配时,使用指向内存块的指针;当用栈分配时,与实际内存进行交互操作。在堆上分配的空间则要求应用程序显式地删除堆分配;在栈上分配对象时,程序分配给对象的内存空间将会自动被删除。堆和栈都是和某一个进程相关的内存
58、块。页是Windows对内存的分配单位,通过页可以实现对内存的访问。一、堆: 堆是保留由进程分配的一个内存区。Windows在全局堆或局部堆中为应用程序分配内存。全局堆对所有应用程序均可以使用,而局部堆只局限于为一个应用程序所使用。 全局堆是Windows操作系统控制的内存空间,全局堆以Windows装入内存的地方开始,包括了剩余的可用内存。当Windows操作系统启动时,代码和数据内存块首先被分配。分配完代码和数据内存块后余下的内存称为自由内存区,它可以由应用程序使用。全局堆往往用来分配大的内存块(它也可以用于分配任意大小的内存块,只是在小内存块的分配中很少使用全局堆)。 全局堆内存块的分配
59、一般应按照以下原则进行: 固定段从底往上分配; 可废弃段从顶住下分配; 可移动段和不可废弃的数据段在固定段与可废弃段之间进行分配; 最大的自由内存块往往位于可废弃段下面。与栈变量不同的是,当定义堆变量时,它们不存在,而是使用指针访问堆变量,并使用C或C十内存分配函数、方法及操作码来动态分配内存。尽管最终可安全地使用Windows运行时库函数malloc和 free,但是在 C程序设计中,更为常见的是使用 new操作符分配内存和delete操作符解除分配。new和delete操作符包括自动对内存泄漏的检查。Windows中,堆的规模仅受系统中有效虚拟内存总容量所限制。 下面是典型的堆分配的实例:
60、二、栈 栈是保存函数参数和块局部变量的内存区,编译器为这些项自动进行内存分配,且只要有函数调用,就将建立栈。栈分配的两个特性是: 局部变量的自动分配,包括大型数组及数据结构; 当局部变量超出范围时,自动解除局部分配。下面是典型的栈分配实例:上面的程序中,语句CClass ObjectOfClass;将在栈中为对象ObjectOfClass。分配一个内存空间,当该函数的调用完成后,栈自动释放 ObjectOfClass所占据的内存空间。在应用程序执行时,只要对象定义一到达,立刻调用类的构造函数创建对象,在对象退出当前范围时,调用对象的析构函数。这样就能保证内存资源不会泄漏。在栈上使用变量和分配对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高炉炼铁工操作水平知识考核试卷含答案
- 保健艾灸师安全知识考核试卷含答案
- 招聘师风险评估与管理水平考核试卷含答案
- 益虫饲养工成果竞赛考核试卷含答案
- 办公设备维修工保密考核试卷含答案
- 刨花板热压工岗前安全专项考核试卷含答案
- 2024年海南医学院辅导员考试笔试题库附答案
- 2024年滇池学院辅导员招聘考试真题汇编附答案
- 煤制烯烃生产工安全检查强化考核试卷含答案
- 劳动定员定额师安全知识宣贯评优考核试卷含答案
- 2025税务副科级选拔笔试题及答案
- 宠物行为问题诊断与解决
- 山东省淄博市张店区2024-2025学年七年级上学期1月期末考试英语试题
- 肺结核诊疗指南(2025版)
- 甲醛生产培训课件
- 康复医疗服务的质量与运营效率平衡方案
- 2.4《不同的天气》课件 2025-2026学年科学二年级上册教科版
- 2025年河南省公务员省考《行测》联考真题(含答案)
- 2025年国考(国家矿山安全监察局)面试模拟题及参考解析(一)
- 天空地一体化智慧水利监测体系构建
- 北京急救中心院前病历书写规范(2022年版)
评论
0/150
提交评论