




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、單擊此處編輯母版標(biāo)題樣式*單擊此處編輯母版文本樣式第二級第三級第四級第五級Click to edit Master title styleClick to edit Master text stylesSecond levelThird levelFourth levelFifth level*吉林大學(xué)遠程教育課件-WindowsAPI編吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時: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/注冊消息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) ; /函數(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對話框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對話框/函數(shù):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) ;/函數(shù):PopFileLength/作用:計算文件長度static long PopFileLength (FILE *file) int iCurrentPos, iFileLength ; iCur
19、rentPos = ftell (file) ; 吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時: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;/打開文件 if (NULL = (file = fopen (pstrFileName, rb) return FALSE; iLength = PopFileLength (file);/獲取文件長度 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/作用:寫文件BOOL PopFileWrite (HWND hwndEdit, PSTR pstrFileName) FILE *file ; int iLength ; PSTR pstrBuffer ; if (NULL = (file = fopen (pstrFileName, wb)/打開文件 return FALSE ; iLength = GetWindowTextLength (hwndEdit) ; /獲取編輯框中的文本內(nèi)容長度 if (NULL =
22、 (pstrBuffer = (PSTR) malloc (iLength + 1) fclose (file) ;/關(guān)閉文件 return FALSE ; /獲取編輯框中的文本內(nèi)容 GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;/寫文件 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對話框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對話框 /函數(shù):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對話框/函數(shù):PopFindFindText/作用:查找字符串BOOL PopFindFindText (HWND hwndEdit, int *piSearchOffset, LPFINDREPLACE pfr) int iLength, iPos; PSTR pstrDoc, pstrPos;/獲取編輯框中的文本內(nèi)容長度 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對話框 return FALSE; SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) pfr-lpstrReplaceWith); return TRUE;BOOL PopFindValidFind (void) return *szFindText != 0
30、;首先聲明了一個OPENFILENAME結(jié)構(gòu)體的全局靜態(tài)變量ofn,這個變量用于記錄打開一個文件時系統(tǒng)需要的各種信息。OPENFILENAME結(jié)構(gòu)體的具體定義如下:在調(diào)用打開文件對話框打開一個文件之前,必須先對OFN變量的各個域進行初始化。在處理消息WM_CREATE時,程序調(diào)用自定義的函數(shù)PopFilelnitialize對OFN進行初始化操作。函數(shù)PopFileInitialize的完整定義如下:然后,程序調(diào)用函數(shù)RegisterWindowMessage對消息FINDMSGSTRING進行注冊。Windows允許用戶使用系統(tǒng)預(yù)定義的消息,也允許用戶使用自定義的消息,但是在使用自定義的消息
31、之前,必須對消息進行注冊。函數(shù)RegisterWindowMessage的原型定義如下:程序通過如下語句取得在命令行中指定的文件名: 其中,lParatn是消息處理函數(shù)的參數(shù)lParam是指向CREATESTRUCT結(jié)構(gòu)體的指針,CREATESTRUCT結(jié)構(gòu)體的成員變量 lpCreateParams中記錄在創(chuàng)建窗口時,程序傳遞給CreateWindow函數(shù)的 lpParam參數(shù)的值 szCmdLine,而 szCmdLine又是 WinMain函數(shù)用于接收用戶命令行的參數(shù)。 所以,上述語句的目的就是取得用戶的命令行參數(shù)。lstrcpy用于把字符串復(fù)制到另一個字符串中,函數(shù)原型定義如下:如果命令
32、行中指定了打開的文件名,即szFileName不為空,則程序調(diào)用如下語句來加以處理:吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十二講)其中,函數(shù)GetFileTitle用于獲取文件名,函數(shù)原型定義如下所示。 在取得文件名后,程序調(diào)用函數(shù)PopFileRead把文件中的數(shù)據(jù)讀人到編輯框中。函數(shù)PopFileRead的具體定義如下:在PopFileRead函數(shù)中,首先定義了文件指針file,然后通過函數(shù)fopen打開由pstrFileName指定的文件,fopen函數(shù)的原型定義如下:然后,程序調(diào)用 PopFileLength采取得文件的長度,PopFi
33、leLength也是自定義的函數(shù),其具體定義如下:函數(shù)PopFileLength中首先通過ftell取得文件指針的當(dāng)前位置,并把結(jié)果保存在iCurrentPos中,ftell函數(shù)的原型定義如下: PopFileLength然后調(diào)用 fseek函數(shù)移動文件指針到文件末尾處, fseek函數(shù)的原型定義如下:程序中指定 offset參數(shù)的值為 0,指定 origin參數(shù)的值為 SEEK_END,表示把文件指針移動到距離文件末尾為0的位置,即文件的末尾處。在把文件指針移動到文件末尾后,再一次調(diào)用函數(shù)ftell取得當(dāng)前的文件指針的位置,并把結(jié)果保存在iFileLength變量中。在取得文件的長度后,還必
34、須把文件指針復(fù)位,以便后續(xù)的文件操作。函數(shù)fread實現(xiàn)讀取文件中的數(shù)據(jù),這個函數(shù)的原型定義如下;函數(shù)SetWindowsText用于把讀取到的數(shù)據(jù)顯示在編輯框中,函數(shù)原型定義如下: OkMessage是自定義的一個通用函數(shù),其主要作用是當(dāng)程序順利完成某一項操作后向用戶通報操作成功的消息。 DoCaption也是自定義的一個通用函數(shù),其主要作用是處理某個窗口的標(biāo)題。 如果用戶選擇了文件菜單下的“打開”菜單項,則程序通過圖形代碼來進行相應(yīng)的處理。用戶選擇文件菜單下的“打開”菜單項的目的就是希望打開一個新文件,但是在打開新文件之前必須檢查編輯框中的內(nèi)容是否已經(jīng)保存,如果沒有保存,則bNeedSav
35、e變量將被置成TRUE,通過檢查bNeedSave變量的值可以決定是否需要對編輯框中的內(nèi)容進行保存操作。函數(shù)AskAboutSave是自定義的函數(shù),其作用是提示用戶對沒有保存的內(nèi)容進行保存。函數(shù)AskAboutSave的具體定義如下: 在上述程序中,函數(shù)MessageBox用于彈出一個消息框,函數(shù)原型定義如下:如果用戶認(rèn)為需要保存文件,則必然會單擊消息框中的Yes按鈕,這時MessageBox函數(shù)的返回值為IDYES,程序于是接著調(diào)用SendMessage函數(shù)向應(yīng)用程序發(fā)送一條WM_COMMAND消息,對這條消息的附加信息指定為IDM_SAVE。應(yīng)用程序在接收到這條消息后,程序流程將轉(zhuǎn)到對保存
36、菜單項進行相應(yīng)處理的代碼處。 真正實現(xiàn)彈出 Open對話框的是 PopFileOpenDlg函數(shù),函數(shù)的定義如下:上述程序段中通過對 Windows API函數(shù) GetOpenFileName的調(diào)用來實現(xiàn)彈出 Open對話框,GetOpenFileName函數(shù)的原型定義如下:如果成功地打開某一個文件后,PopFileOpeDlg函數(shù)將返回TRUE,于是程序接著調(diào)用函數(shù)DoCaption改變窗口標(biāo)題,同時把變量bNeedSave的值設(shè)置為FALSE。其他對話框的使用大致也遵循和Open對話框類似的過程。 例題的頭文件Edith如下:例題的資源文件如下例題執(zhí)行結(jié)果如圖所示。 吉林大學(xué)遠程教育課件W
37、indows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十三講)第十章多文檔界面 第一節(jié)MDI概念 第二節(jié)示例程序 吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十四講)吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十五講)吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十六講)第十一章 動態(tài)鏈接庫 第一節(jié) 動態(tài)鏈接庫基礎(chǔ)知識 吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十七講)吉林大學(xué)遠程教育課件Windows A
38、P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十八講)吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第三十九講)吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時: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āng)?shù)目return FALSE; iLength = strlen (pStringIn);/獲取字符串長度 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)換成大寫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);/聲明動態(tài)鏈接庫中的函數(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/作用:對話可小型處理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)閉對話框 return TRUE; EndDialog (hDlg, FALSE);/關(guān)閉對話框 return TRUE; return FALSE ; /函數(shù):EnumCallBack/作用:通知主窗口中的數(shù)據(jù)是否發(fā)生變化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 ;/函數(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 :/單擊輸入菜單項/生成添加對話框if (DialogBox (hInst, EnterDlg, hwnd, &DlgProc)
53、if (EnterString (szString)/調(diào)用DLL中定義的函數(shù)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); /調(diào)用動態(tài)鏈接庫定義中的函數(shù)GetStrings GetStrings (&cbparam); EndPaint (hwnd, &ps); return 0;PostQuitMessage (0);return 0; return DefWindowProc (hwnd, iMsg, wParam, lParam);吉林大學(xué)遠程教育課件Windows A P I編 程主講人 : 翟慧杰學(xué) 時:48(第四十一講) 第12章 Windo
56、ws的內(nèi)存管理 第一節(jié) Windows內(nèi)存管理概述 Windows是一個多任務(wù)的操作系統(tǒng),由于同時可以運行多個任務(wù),因此Windows必須小心地管理系統(tǒng)的存儲空間,以便一個應(yīng)用程序?qū)?nèi)存的要求得到滿足的同時不會影響其他任務(wù)的執(zhí)行。 盡管微處理機向物理內(nèi)存寫或讀都是使用物理地址,但是程序員在程序設(shè)計中卻是使用邏輯地址來對物理內(nèi)存進行操作。邏輯地址包括兩部分: 段標(biāo)識符 用于說明存取的內(nèi)存段的值; 偏移值 相對于段地址的字節(jié)數(shù)。 微處理器能把由段地址和偏移地址組成的邏輯地址轉(zhuǎn)換成物理地址。 在Windows系統(tǒng)平臺中,進程是系統(tǒng)內(nèi)存管理的基礎(chǔ)。通常,進程具有它自己私有的虛擬地址空間、代碼、數(shù)據(jù)和其
57、他操作系統(tǒng)資源。進程必須至少具有一個運行在該進程之內(nèi)的執(zhí)行線程。 每個運行于Windows下的進程和其他進程可以得到私有的32位虛擬地址空間,最多可訪問 4GB內(nèi)存。在 Windows 95中底層 IGB的內(nèi)存空間是處于完全保護狀態(tài),頂層2GB的內(nèi)存空間處于較差的安全狀態(tài);而在Windows NT中,系統(tǒng)保持整個4GB的內(nèi)存空間是完全保護的。 內(nèi)存分配歸為兩個主要類型:堆分配和棧分配。當(dāng)用堆分配時,使用指向內(nèi)存塊的指針;當(dāng)用棧分配時,與實際內(nèi)存進行交互操作。在堆上分配的空間則要求應(yīng)用程序顯式地刪除堆分配;在棧上分配對象時,程序分配給對象的內(nèi)存空間將會自動被刪除。堆和棧都是和某一個進程相關(guān)的內(nèi)存
58、塊。頁是Windows對內(nèi)存的分配單位,通過頁可以實現(xiàn)對內(nèi)存的訪問。一、堆: 堆是保留由進程分配的一個內(nèi)存區(qū)。Windows在全局堆或局部堆中為應(yīng)用程序分配內(nèi)存。全局堆對所有應(yīng)用程序均可以使用,而局部堆只局限于為一個應(yīng)用程序所使用。 全局堆是Windows操作系統(tǒng)控制的內(nèi)存空間,全局堆以Windows裝入內(nèi)存的地方開始,包括了剩余的可用內(nèi)存。當(dāng)Windows操作系統(tǒng)啟動時,代碼和數(shù)據(jù)內(nèi)存塊首先被分配。分配完代碼和數(shù)據(jù)內(nèi)存塊后余下的內(nèi)存稱為自由內(nèi)存區(qū),它可以由應(yīng)用程序使用。全局堆往往用來分配大的內(nèi)存塊(它也可以用于分配任意大小的內(nèi)存塊,只是在小內(nèi)存塊的分配中很少使用全局堆)。 全局堆內(nèi)存塊的分配
59、一般應(yīng)按照以下原則進行: 固定段從底往上分配; 可廢棄段從頂住下分配; 可移動段和不可廢棄的數(shù)據(jù)段在固定段與可廢棄段之間進行分配; 最大的自由內(nèi)存塊往往位于可廢棄段下面。與棧變量不同的是,當(dāng)定義堆變量時,它們不存在,而是使用指針訪問堆變量,并使用C或C十內(nèi)存分配函數(shù)、方法及操作碼來動態(tài)分配內(nèi)存。盡管最終可安全地使用Windows運行時庫函數(shù)malloc和 free,但是在 C程序設(shè)計中,更為常見的是使用 new操作符分配內(nèi)存和delete操作符解除分配。new和delete操作符包括自動對內(nèi)存泄漏的檢查。Windows中,堆的規(guī)模僅受系統(tǒng)中有效虛擬內(nèi)存總?cè)萘克拗啤?下面是典型的堆分配的實例:
60、二、棧 棧是保存函數(shù)參數(shù)和塊局部變量的內(nèi)存區(qū),編譯器為這些項自動進行內(nèi)存分配,且只要有函數(shù)調(diào)用,就將建立棧。棧分配的兩個特性是: 局部變量的自動分配,包括大型數(shù)組及數(shù)據(jù)結(jié)構(gòu); 當(dāng)局部變量超出范圍時,自動解除局部分配。下面是典型的棧分配實例:上面的程序中,語句CClass ObjectOfClass;將在棧中為對象ObjectOfClass。分配一個內(nèi)存空間,當(dāng)該函數(shù)的調(diào)用完成后,棧自動釋放 ObjectOfClass所占據(jù)的內(nèi)存空間。在應(yīng)用程序執(zhí)行時,只要對象定義一到達,立刻調(diào)用類的構(gòu)造函數(shù)創(chuàng)建對象,在對象退出當(dāng)前范圍時,調(diào)用對象的析構(gòu)函數(shù)。這樣就能保證內(nèi)存資源不會泄漏。在棧上使用變量和分配對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《Linux操作系統(tǒng)》課件-1.認(rèn)識Linux(全)
- 景區(qū)開發(fā)石子運輸合同樣本
- 《建設(shè)項目設(shè)計概算編審規(guī)范》
- 網(wǎng)吧包工裝修合同
- 裝修施工合同及清單
- 智能家居語音系統(tǒng)
- 倉儲系統(tǒng)解決方案
- 地鐵施工安全防護方案
- 物資回收行業(yè)廢品分類回收方案
- 基于云計算的物流信息化平臺升級改造方案
- 高血壓員工免責(zé)協(xié)議范本
- 工藝部述職報告
- 供貨交貨進度計劃及保證措施
- 第17課《學(xué)習(xí)中的煩心事》課件
- 規(guī)劃選址及用地預(yù)審流程
- 外語學(xué)習(xí)焦慮與對策
- 關(guān)于衛(wèi)健系統(tǒng)工作調(diào)研報告
- 烯烴習(xí)題參考答案
- 2023-2024學(xué)年山東省淄博市高青縣七年級下學(xué)期期中考試英語試題 (含答案)
- 各國鋼材牌號對照大全
- 房樹人的內(nèi)容分析 房樹人分析
評論
0/150
提交評論