版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單擊此處編輯母版標(biāo)題樣式*單擊此處編輯母版文本樣式第二級(jí)第三級(jí)第四級(jí)第五級(jí)Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth level*吉林大學(xué)遠(yuǎn)程教育課件-WindowsAPI編吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48第三十講)/函數(shù):WndProc/作用:主窗口消息循環(huán)LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam,
2、 LPARAM lParam)static BOOL bNeedSave = FALSE; /是否保存文件的標(biāo)志static char szFileName_MAX_PATH;/文件名static char szTitleName_MAX_FNAME + _MAX_EXT;static HINSTANCE hInst;/應(yīng)用程序句柄static HWND hwndEdit;/編輯框句柄static int iOffset;static UINT iMsgFindReplace;LPFINDREPLACE pfr;switch (iMsg)case WM_CREATE:/創(chuàng)建窗口hInst =
3、(LPCREATESTRUCT) lParam) - hInstance ;/創(chuàng)建編輯框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/注冊(cè)消息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);/使編輯框獲得焦點(diǎn)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)/ 來(lái)自文件菜單的消息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對(duì)話框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)/寫(xiě)文件if (PopFileWrite (hwndEdit, szFileName) bNeedSave = FALSE; return 1;elseOkMessage (hwnd, 不能寫(xiě)文件 %s,szTitleName) ;return 0; /彈出Save AS對(duì)話框if (PopFileSaveDlg (hwnd, szFileName
9、, szTitleName) DoCaption (hwnd, szTitleName) ; if (PopFileWrite (hwndEdit, szFileName) bNeedSave = FALSE; return 1; elseOkMessage (hwnd, 不能寫(xiě)文件%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, 文本沒(méi)找到!, 0) ;if (pfr-Flags & FR_REPLACE |pfr-Flags & FR_REPLACEALL)if (!PopFind
14、ReplaceText (hwndEdit, &iOffset, pfr)OkMessage (hwnd, 文本沒(méi)找到!, 0) ;if (pfr-Flags & FR_REPLACEALL) while (PopFindReplaceText (hwndEdit, &iOffset, pfr); return 0 ;break ;return DefWindowProc (hwnd, iMsg, wParam, lParam) ; /函數(shù):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 ; /函數(shù):PopFileOpenDlg
17、/作用:彈出Open對(duì)話框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對(duì)話框/函數(shù):PopFileSaveDlg/作用:彈出Save As對(duì)話框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) ;/函數(shù):PopFileLength/作用:計(jì)算文件長(zhǎng)度static long PopFileLength (FILE *file) int iCurrentPos, iFileLength ; iCur
19、rentPos = ftell (file) ; 吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十一講) fseek (file, 0, SEEK_END) ; iFileLength = ftell (file) ; fseek (file, iCurrentPos, SEEK_SET) ; return iFileLength ;/函數(shù):PopFileRead/作用:讀取文件BOOL PopFileRead (HWND hwndEdit, PSTR pstrFileName) FILE *file; int iLength; PSTR pstrBu
20、ffer;/打開(kāi)文件 if (NULL = (file = fopen (pstrFileName, rb) return FALSE; iLength = PopFileLength (file);/獲取文件長(zhǎng)度 if (NULL = (pstrBuffer = (PSTR) malloc (iLength) fclose (file); /關(guān)閉文件return FALSE; fread (pstrBuffer, sizeof(char), iLength, file);/讀取文件 fclose (file); pstrBufferiLength = 0; SetWindowText (hw
21、ndEdit, pstrBuffer); /設(shè)置編輯框中的文本內(nèi)容 return TRUE; /函數(shù):PopFileWrite/作用:寫(xiě)文件BOOL PopFileWrite (HWND hwndEdit, PSTR pstrFileName) FILE *file ; int iLength ; PSTR pstrBuffer ; if (NULL = (file = fopen (pstrFileName, wb)/打開(kāi)文件 return FALSE ; iLength = GetWindowTextLength (hwndEdit) ; /獲取編輯框中的文本內(nèi)容長(zhǎng)度 if (NULL =
22、 (pstrBuffer = (PSTR) malloc (iLength + 1) fclose (file) ;/關(guān)閉文件 return FALSE ; /獲取編輯框中的文本內(nèi)容 GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;/寫(xiě)文件 if (iLength != (int) fwrite (pstrBuffer, 1, iLength, file) fclose (file);/關(guān)閉文件 free (pstrBuffer); return FALSE; fclose (file); free (pstrBuffer); return
23、 TRUE;/函數(shù):PopFindFindDlg/作用:彈出Find對(duì)話框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對(duì)話框 /函數(shù):PopFindReplaceDlg/作用:彈出Replace對(duì)話框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對(duì)話框/函數(shù):PopFindFindText/作用:查找字符串BOOL PopFindFindText (HWND hwndEdit, int *piSearchOffset, LPFINDREPLACE pfr) int iLength, iPos; PSTR pstrDoc, pstrPos;/獲取編輯框中的文本內(nèi)容長(zhǎng)度 iLength = GetWindowTextLength (hwndEdit); if (NULL = (pstrDoc = (PSTR) malloc (iLength + 1) retu
27、rn FALSE;/獲取編輯框中的文本內(nèi)容 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; /函數(shù):PopFindNextText/作用:查找下一處字符串BOOL PopFindNextText (HWND hwndEdit, int *piSearchOffset) FINDREPLACE fr; fr.lpstrFindWhat = szFindText; return PopFindFindText (hwndEdit, piSearchOffset, &fr);/函數(shù):PopFindReplaceText/作用:替換
29、文本BOOL PopFindReplaceText (HWND hwndEdit, int *piSearchOffset, LPFINDREPLACE pfr) if (!PopFindFindText (hwndEdit, piSearchOffset, pfr) /彈出Replace對(duì)話框 return FALSE; SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) pfr-lpstrReplaceWith); return TRUE;BOOL PopFindValidFind (void) return *szFindText != 0
30、;首先聲明了一個(gè)OPENFILENAME結(jié)構(gòu)體的全局靜態(tài)變量ofn,這個(gè)變量用于記錄打開(kāi)一個(gè)文件時(shí)系統(tǒng)需要的各種信息。OPENFILENAME結(jié)構(gòu)體的具體定義如下:在調(diào)用打開(kāi)文件對(duì)話框打開(kāi)一個(gè)文件之前,必須先對(duì)OFN變量的各個(gè)域進(jìn)行初始化。在處理消息WM_CREATE時(shí),程序調(diào)用自定義的函數(shù)PopFilelnitialize對(duì)OFN進(jìn)行初始化操作。函數(shù)PopFileInitialize的完整定義如下:然后,程序調(diào)用函數(shù)RegisterWindowMessage對(duì)消息FINDMSGSTRING進(jìn)行注冊(cè)。Windows允許用戶使用系統(tǒng)預(yù)定義的消息,也允許用戶使用自定義的消息,但是在使用自定義的消息
31、之前,必須對(duì)消息進(jìn)行注冊(cè)。函數(shù)RegisterWindowMessage的原型定義如下:程序通過(guò)如下語(yǔ)句取得在命令行中指定的文件名: 其中,lParatn是消息處理函數(shù)的參數(shù)lParam是指向CREATESTRUCT結(jié)構(gòu)體的指針,CREATESTRUCT結(jié)構(gòu)體的成員變量 lpCreateParams中記錄在創(chuàng)建窗口時(shí),程序傳遞給CreateWindow函數(shù)的 lpParam參數(shù)的值 szCmdLine,而 szCmdLine又是 WinMain函數(shù)用于接收用戶命令行的參數(shù)。 所以,上述語(yǔ)句的目的就是取得用戶的命令行參數(shù)。lstrcpy用于把字符串復(fù)制到另一個(gè)字符串中,函數(shù)原型定義如下:如果命令
32、行中指定了打開(kāi)的文件名,即szFileName不為空,則程序調(diào)用如下語(yǔ)句來(lái)加以處理:吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十二講)其中,函數(shù)GetFileTitle用于獲取文件名,函數(shù)原型定義如下所示。 在取得文件名后,程序調(diào)用函數(shù)PopFileRead把文件中的數(shù)據(jù)讀人到編輯框中。函數(shù)PopFileRead的具體定義如下:在PopFileRead函數(shù)中,首先定義了文件指針file,然后通過(guò)函數(shù)fopen打開(kāi)由pstrFileName指定的文件,fopen函數(shù)的原型定義如下:然后,程序調(diào)用 PopFileLength采取得文件的長(zhǎng)度,PopFi
33、leLength也是自定義的函數(shù),其具體定義如下:函數(shù)PopFileLength中首先通過(guò)ftell取得文件指針的當(dāng)前位置,并把結(jié)果保存在iCurrentPos中,ftell函數(shù)的原型定義如下: PopFileLength然后調(diào)用 fseek函數(shù)移動(dòng)文件指針到文件末尾處, fseek函數(shù)的原型定義如下:程序中指定 offset參數(shù)的值為 0,指定 origin參數(shù)的值為 SEEK_END,表示把文件指針移動(dòng)到距離文件末尾為0的位置,即文件的末尾處。在把文件指針移動(dòng)到文件末尾后,再一次調(diào)用函數(shù)ftell取得當(dāng)前的文件指針的位置,并把結(jié)果保存在iFileLength變量中。在取得文件的長(zhǎng)度后,還必
34、須把文件指針復(fù)位,以便后續(xù)的文件操作。函數(shù)fread實(shí)現(xiàn)讀取文件中的數(shù)據(jù),這個(gè)函數(shù)的原型定義如下;函數(shù)SetWindowsText用于把讀取到的數(shù)據(jù)顯示在編輯框中,函數(shù)原型定義如下: OkMessage是自定義的一個(gè)通用函數(shù),其主要作用是當(dāng)程序順利完成某一項(xiàng)操作后向用戶通報(bào)操作成功的消息。 DoCaption也是自定義的一個(gè)通用函數(shù),其主要作用是處理某個(gè)窗口的標(biāo)題。 如果用戶選擇了文件菜單下的“打開(kāi)”菜單項(xiàng),則程序通過(guò)圖形代碼來(lái)進(jìn)行相應(yīng)的處理。用戶選擇文件菜單下的“打開(kāi)”菜單項(xiàng)的目的就是希望打開(kāi)一個(gè)新文件,但是在打開(kāi)新文件之前必須檢查編輯框中的內(nèi)容是否已經(jīng)保存,如果沒(méi)有保存,則bNeedSav
35、e變量將被置成TRUE,通過(guò)檢查bNeedSave變量的值可以決定是否需要對(duì)編輯框中的內(nèi)容進(jìn)行保存操作。函數(shù)AskAboutSave是自定義的函數(shù),其作用是提示用戶對(duì)沒(méi)有保存的內(nèi)容進(jìn)行保存。函數(shù)AskAboutSave的具體定義如下: 在上述程序中,函數(shù)MessageBox用于彈出一個(gè)消息框,函數(shù)原型定義如下:如果用戶認(rèn)為需要保存文件,則必然會(huì)單擊消息框中的Yes按鈕,這時(shí)MessageBox函數(shù)的返回值為IDYES,程序于是接著調(diào)用SendMessage函數(shù)向應(yīng)用程序發(fā)送一條WM_COMMAND消息,對(duì)這條消息的附加信息指定為IDM_SAVE。應(yīng)用程序在接收到這條消息后,程序流程將轉(zhuǎn)到對(duì)保存
36、菜單項(xiàng)進(jìn)行相應(yīng)處理的代碼處。 真正實(shí)現(xiàn)彈出 Open對(duì)話框的是 PopFileOpenDlg函數(shù),函數(shù)的定義如下:上述程序段中通過(guò)對(duì) Windows API函數(shù) GetOpenFileName的調(diào)用來(lái)實(shí)現(xiàn)彈出 Open對(duì)話框,GetOpenFileName函數(shù)的原型定義如下:如果成功地打開(kāi)某一個(gè)文件后,PopFileOpeDlg函數(shù)將返回TRUE,于是程序接著調(diào)用函數(shù)DoCaption改變窗口標(biāo)題,同時(shí)把變量bNeedSave的值設(shè)置為FALSE。其他對(duì)話框的使用大致也遵循和Open對(duì)話框類(lèi)似的過(guò)程。 例題的頭文件Edith如下:例題的資源文件如下例題執(zhí)行結(jié)果如圖所示。 吉林大學(xué)遠(yuǎn)程教育課件W
37、indows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十三講)第十章多文檔界面 第一節(jié)MDI概念 第二節(jié)示例程序 吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十四講)吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十五講)吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十六講)第十一章 動(dòng)態(tài)鏈接庫(kù) 第一節(jié) 動(dòng)態(tài)鏈接庫(kù)基礎(chǔ)知識(shí) 吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十七講)吉林大學(xué)遠(yuǎn)程教育課件Windows A
38、P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十八講)吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第三十九講)吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第四十講)例1:#include #define MAX_STRINGS 256/最大字符串?dāng)?shù)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;/當(dāng)前字符串?dāng)?shù)目BOOL CALLBACK GetStr (PSTR pString, CBPARAM *pcbp);/函數(shù):DllMain/作用:DLL入口int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)return TRUE; /函數(shù):EnterString/作用:輸入字符串int WINAPI EnterString (PSTR pStringIn) HANDLE hString; PSTR pString; int i, iLengt
40、h, iCompare; if (iTotal = MAX_STRINGS - 1)/達(dá)到最大字符串?dāng)?shù)目return FALSE; iLength = strlen (pStringIn);/獲取字符串長(zhǎng)度 if (iLength = 0)/空字符串return FALSE;/創(chuàng)建映像文件 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);/全部轉(zhuǎn)換成大寫(xiě)for (i = iTotal; i 0; i-)iCompare = strcmpi (pStringIn, pszStringsi - 1); /比較字符串if (iCompare = 0)/字符出不等則調(diào)處循環(huán)break;pszStringsi = pszStringsi - 1; /字符出相等則刪除字符串pszStringsi = pString;iTotal+;return TRUE; /函數(shù):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; /函數(shù):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 /最大字符串?dāng)?shù)#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);/聲明動(dòng)態(tài)鏈接庫(kù)中的函數(shù)原型int WINAPI EnterString (PSTR pStringIn);int WINAPI DeleteString (PSTR pStringIn);int WINAPI GetStrings(CBPARAM * pParam);char szAppName = exetest;char szStringMAXLEN;/函數(shù):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);/消息循環(huán) while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg); DispatchMessage (&msg); ret
49、urn msg.wParam;/函數(shù):DlgProc/作用:對(duì)話可小型處理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);/關(guān)閉對(duì)話框 return TRUE; EndDialog (hDlg, FALSE);/關(guān)閉對(duì)話框 return TRUE; return FALSE ; /函數(shù):EnumCallBack/作用:通知主窗口中的數(shù)據(jù)是否發(fā)生變化BOOL CALLBACK EnumCallBack (HWND hwnd, LPARAM lParam) char szClassName16 ; GetClassName (hwnd, szClassName, sizeof (szClassName);/獲取窗口類(lèi)名 if (0 = strcmp (szClassName, szAppName) SendMe
51、ssage (hwnd, WM_DATACHANGE, 0, 0) ; return TRUE ;/函數(shù):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 :/單擊輸入菜單項(xiàng)/生成添加對(duì)話框if (DialogBox (hInst, EnterDlg, hwnd, &DlgProc)
53、if (EnterString (szString)/調(diào)用DLL中定義的函數(shù)EnterStringEnumWindows (&EnumCallBack, 0);elseMessageBeep (0);break; /生成刪除對(duì)話框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); /調(diào)用動(dòng)態(tài)鏈接庫(kù)定義中的函數(shù)GetStrings GetStrings (&cbparam); EndPaint (hwnd, &ps); return 0;PostQuitMessage (0);return 0; return DefWindowProc (hwnd, iMsg, wParam, lParam);吉林大學(xué)遠(yuǎn)程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時(shí):48(第四十一講) 第12章 Windo
56、ws的內(nèi)存管理 第一節(jié) Windows內(nèi)存管理概述 Windows是一個(gè)多任務(wù)的操作系統(tǒng),由于同時(shí)可以運(yùn)行多個(gè)任務(wù),因此Windows必須小心地管理系統(tǒng)的存儲(chǔ)空間,以便一個(gè)應(yīng)用程序?qū)?nèi)存的要求得到滿足的同時(shí)不會(huì)影響其他任務(wù)的執(zhí)行。 盡管微處理機(jī)向物理內(nèi)存寫(xiě)或讀都是使用物理地址,但是程序員在程序設(shè)計(jì)中卻是使用邏輯地址來(lái)對(duì)物理內(nèi)存進(jìn)行操作。邏輯地址包括兩部分: 段標(biāo)識(shí)符 用于說(shuō)明存取的內(nèi)存段的值; 偏移值 相對(duì)于段地址的字節(jié)數(shù)。 微處理器能把由段地址和偏移地址組成的邏輯地址轉(zhuǎn)換成物理地址。 在Windows系統(tǒng)平臺(tái)中,進(jìn)程是系統(tǒng)內(nèi)存管理的基礎(chǔ)。通常,進(jìn)程具有它自己私有的虛擬地址空間、代碼、數(shù)據(jù)和其
57、他操作系統(tǒng)資源。進(jìn)程必須至少具有一個(gè)運(yùn)行在該進(jìn)程之內(nèi)的執(zhí)行線程。 每個(gè)運(yùn)行于Windows下的進(jìn)程和其他進(jìn)程可以得到私有的32位虛擬地址空間,最多可訪問(wèn) 4GB內(nèi)存。在 Windows 95中底層 IGB的內(nèi)存空間是處于完全保護(hù)狀態(tài),頂層2GB的內(nèi)存空間處于較差的安全狀態(tài);而在Windows NT中,系統(tǒng)保持整個(gè)4GB的內(nèi)存空間是完全保護(hù)的。 內(nèi)存分配歸為兩個(gè)主要類(lèi)型:堆分配和棧分配。當(dāng)用堆分配時(shí),使用指向內(nèi)存塊的指針;當(dāng)用棧分配時(shí),與實(shí)際內(nèi)存進(jìn)行交互操作。在堆上分配的空間則要求應(yīng)用程序顯式地刪除堆分配;在棧上分配對(duì)象時(shí),程序分配給對(duì)象的內(nèi)存空間將會(huì)自動(dòng)被刪除。堆和棧都是和某一個(gè)進(jìn)程相關(guān)的內(nèi)存
58、塊。頁(yè)是Windows對(duì)內(nèi)存的分配單位,通過(guò)頁(yè)可以實(shí)現(xiàn)對(duì)內(nèi)存的訪問(wèn)。一、堆: 堆是保留由進(jìn)程分配的一個(gè)內(nèi)存區(qū)。Windows在全局堆或局部堆中為應(yīng)用程序分配內(nèi)存。全局堆對(duì)所有應(yīng)用程序均可以使用,而局部堆只局限于為一個(gè)應(yīng)用程序所使用。 全局堆是Windows操作系統(tǒng)控制的內(nèi)存空間,全局堆以Windows裝入內(nèi)存的地方開(kāi)始,包括了剩余的可用內(nèi)存。當(dāng)Windows操作系統(tǒng)啟動(dòng)時(shí),代碼和數(shù)據(jù)內(nèi)存塊首先被分配。分配完代碼和數(shù)據(jù)內(nèi)存塊后余下的內(nèi)存稱(chēng)為自由內(nèi)存區(qū),它可以由應(yīng)用程序使用。全局堆往往用來(lái)分配大的內(nèi)存塊(它也可以用于分配任意大小的內(nèi)存塊,只是在小內(nèi)存塊的分配中很少使用全局堆)。 全局堆內(nèi)存塊的分配
59、一般應(yīng)按照以下原則進(jìn)行: 固定段從底往上分配; 可廢棄段從頂住下分配; 可移動(dòng)段和不可廢棄的數(shù)據(jù)段在固定段與可廢棄段之間進(jìn)行分配; 最大的自由內(nèi)存塊往往位于可廢棄段下面。與棧變量不同的是,當(dāng)定義堆變量時(shí),它們不存在,而是使用指針訪問(wèn)堆變量,并使用C或C十內(nèi)存分配函數(shù)、方法及操作碼來(lái)動(dòng)態(tài)分配內(nèi)存。盡管最終可安全地使用Windows運(yùn)行時(shí)庫(kù)函數(shù)malloc和 free,但是在 C程序設(shè)計(jì)中,更為常見(jiàn)的是使用 new操作符分配內(nèi)存和delete操作符解除分配。new和delete操作符包括自動(dòng)對(duì)內(nèi)存泄漏的檢查。Windows中,堆的規(guī)模僅受系統(tǒng)中有效虛擬內(nèi)存總?cè)萘克拗啤?下面是典型的堆分配的實(shí)例:
60、二、棧 棧是保存函數(shù)參數(shù)和塊局部變量的內(nèi)存區(qū),編譯器為這些項(xiàng)自動(dòng)進(jìn)行內(nèi)存分配,且只要有函數(shù)調(diào)用,就將建立棧。棧分配的兩個(gè)特性是: 局部變量的自動(dòng)分配,包括大型數(shù)組及數(shù)據(jù)結(jié)構(gòu); 當(dāng)局部變量超出范圍時(shí),自動(dòng)解除局部分配。下面是典型的棧分配實(shí)例:上面的程序中,語(yǔ)句CClass ObjectOfClass;將在棧中為對(duì)象ObjectOfClass。分配一個(gè)內(nèi)存空間,當(dāng)該函數(shù)的調(diào)用完成后,棧自動(dòng)釋放 ObjectOfClass所占據(jù)的內(nèi)存空間。在應(yīng)用程序執(zhí)行時(shí),只要對(duì)象定義一到達(dá),立刻調(diào)用類(lèi)的構(gòu)造函數(shù)創(chuàng)建對(duì)象,在對(duì)象退出當(dāng)前范圍時(shí),調(diào)用對(duì)象的析構(gòu)函數(shù)。這樣就能保證內(nèi)存資源不會(huì)泄漏。在棧上使用變量和分配對(duì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- CCAA - 2012年06月建筑施工領(lǐng)域?qū)I(yè)答案及解析 - 詳解版(75題)
- 貴州省黔南布依族苗族自治州2025-2026學(xué)年八年級(jí)上學(xué)期1月期末考試地理試卷(含答案)
- 中學(xué)教學(xué)質(zhì)量監(jiān)控制度
- 養(yǎng)老院物資采購(gòu)制度
- 養(yǎng)老院安全管理與應(yīng)急制度
- 企業(yè)內(nèi)部審計(jì)規(guī)范制度
- 規(guī)范機(jī)器學(xué)習(xí)模型安全評(píng)估的標(biāo)準(zhǔn)
- 老年終末期共病多重用藥管理策略
- 油母頁(yè)巖提煉工安全演練測(cè)試考核試卷含答案
- 白酒原料粉碎工安全意識(shí)強(qiáng)化能力考核試卷含答案
- 民俗學(xué)課件萬(wàn)建中
- 能源與動(dòng)力工程專(zhuān)業(yè)培養(yǎng)目標(biāo)合理性評(píng)價(jià)分析報(bào)告
- 公司員工活動(dòng)室管理制度
- 2025年水晶手鏈?zhǔn)袌?chǎng)需求分析
- CJ/T 3066-1997內(nèi)磁水處理器
- 院內(nèi)急重癥快速反應(yīng)小組
- 湖南省省情試題及答案
- 幕墻玻璃板塊平整度檢查
- 船舶與海上技術(shù) 海上安全 氣脹式救生裝置用充氣系統(tǒng) 征求意見(jiàn)稿
- 紅巖中考試題及答案
- 人民幣銀行結(jié)算賬戶工作指引
評(píng)論
0/150
提交評(píng)論