這次是最後一部分的對話框的部分了
這次主要是對一個程序作介紹,這個程序用了三個窗口類(實際上只是結構體,只是非常像WNDCLASS)
前兩個很相似,最後一個涉及到字體創建的可能與前兩個有所不同
1:FINDREPLACE
這個類就是一個創建查詢框的一個類,類的內容都可以在MSDN上可以查到詳細的,這裏就不說了,值得一提的是,這裏面自帶了一個HOOK的位置,如果有需要,可以自己寫一個窗口過程,類似於WNDCLASS裏面的WndProc一樣。
同時我們可以在定義完以後調用:
FindText (LPFINDREPLACE) ;和ReplaceText (LPFINDREPLACE) ;來對其進行查找和查找並替換。
(注意兩個窗口樣式不同,所以一個類不可以直接創建兩個窗口,而是要先註冊完一個之後在修改註冊另一個(這個是對wndclass修改的方法)在這裏,通常都是分別創建,因爲兩者正常情況下是不可能同時出現的(調用FindText (LPFINDREPLACE) ;和ReplaceText (LPFINDREPLACE);將出現兩個對話框)。
2:OPENFILENAME
這個類和之前的那一個類似,只是參數更多了一些,同樣,也可以到MSDN上找到非常詳細的說明,這裏就只有一個調用顯示的函數:GetOpenFileName (LPOPENFILENAME) ;
在書上的PopPad3程序中:(片段)
BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
ofn.hwndOwner = hwnd ;
ofn.lpstrFile = pstrFileName ;
ofn.lpstrFileTitle = pstrTitleName ;
ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;
return GetOpenFileName (&ofn) ;
}
BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
ofn.hwndOwner = hwnd ;
ofn.lpstrFile = pstrFileName ;
ofn.lpstrFileTitle = pstrTitleName ;
ofn.Flags = OFN_OVERWRITEPROMPT ;
return GetSaveFileName (&ofn) ;
}
我們首先注意到我們打開和保存都會對這個類裏面的內容做一些更新,這就是和之前那個的一個小區別(其實之前那個也可以這麼做)。
之後就是一個很難得到的地方了:這個程序用了一個Unicode的判斷方法:
BOOL PopFileWrite (HWND hwndEdit, PTSTR pstrFileName)
{
DWORD dwBytesWritten ;
HANDLE hFile ;
int iLength ;
PTSTR pstrBuffer ;
WORD wByteOrderMark = 0xFEFF ;
// Open the file, creating it if necessary
if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, 0, NULL)))
return FALSE ;
// Get the number of characters in the edit control and allocate
// memory for them.
iLength = GetWindowTextLength (hwndEdit) ;
pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ;
if (!pstrBuffer)
{
CloseHandle (hFile) ;
return FALSE ;
}
// If the edit control will return Unicode text, write the
// byte order mark to the file.
#ifdef UNICODE
WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif
// Get the edit buffer and write that out to the file.
GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;
WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR),
&dwBytesWritten, NULL) ;
if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten)
{
CloseHandle (hFile) ;
free (pstrBuffer) ;
return FALSE ;
}
CloseHandle (hFile) ;
free (pstrBuffer) ;
return TRUE ;
}
這段代碼
#ifdef UNICODE
WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif
這一段就是將佔位符0xFEFF定位字節序寫入文件頭表示這個文本爲Unicode,同時還要考慮到大小斷續的問題(檢測字節序的順序)