BOOL CDialogTemplate::SetFont(LPCTSTR lpFaceName, WORD nFontSize) { ASSERT(m_hTemplate != NULL); if (m_dwTemplateSize == 0) return FALSE; DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)GlobalLock(m_hTemplate); BOOL bDialogEx = IsDialogEx(pTemplate); BOOL bHasFont = ::HasFont(pTemplate); int cbFontAttr = FontAttrSize(bDialogEx); if (bDialogEx) ((DLGTEMPLATEEX*)pTemplate)->style |= DS_SETFONT; else pTemplate->style |= DS_SETFONT; #ifdef _UNICODE int cbNew = cbFontAttr + ((lstrlen(lpFaceName) + 1) * sizeof(TCHAR)); BYTE* pbNew = (BYTE*)lpFaceName; #else WCHAR wszFaceName [LF_FACESIZE]; int cbNew = cbFontAttr + 2 * MultiByteToWideChar(CP_ACP, 0, lpFaceName, -1, wszFaceName, LF_FACESIZE); BYTE* pbNew = (BYTE*)wszFaceName; #endif BYTE* pb = GetFontSizeField(pTemplate); int cbOld = bHasFont ? cbFontAttr + 2 * (wcslen((WCHAR*)(pb + cbFontAttr)) + 1) : 0; BYTE* pOldControls = (BYTE*)(((DWORD)pb + cbOld + 3) & ~3); BYTE* pNewControls = (BYTE*)(((DWORD)pb + cbNew + 3) & ~3); BYTE nCtrl = bDialogEx ? (BYTE)((DLGTEMPLATEEX*)pTemplate)->cDlgItems : (BYTE)pTemplate->cdit; if (cbNew != cbOld && nCtrl > 0) memmove(pNewControls, pOldControls, (size_t)(m_dwTemplateSize - (pOldControls - (BYTE*)pTemplate))); *(WORD*)pb = nFontSize; memmove(pb + cbFontAttr, pbNew, cbNew - cbFontAttr); m_dwTemplateSize += (pNewControls - pOldControls); GlobalUnlock(m_hTemplate); m_bSystemFont = FALSE; return TRUE; }
UINT AFX_CDECL CDialogTemplate::GetTemplateSize(const DLGTEMPLATE* pTemplate) { BOOL bDialogEx = IsDialogEx(pTemplate); BYTE* pb = GetFontSizeField(pTemplate); if (::HasFont(pTemplate)) { // Skip font size and name pb += FontAttrSize(bDialogEx); // Skip font size, weight, (italic, charset) pb += 2 * (wcslen((WCHAR*)pb) + 1); } WORD nCtrl = bDialogEx ? (WORD)((DLGTEMPLATEEX*)pTemplate)->cDlgItems : (WORD)pTemplate->cdit; while (nCtrl > 0) { pb = (BYTE*)(((DWORD_PTR)pb + 3) & ~DWORD_PTR(3)); // DWORD align pb += (bDialogEx ? sizeof(DLGITEMTEMPLATEEX) : sizeof(DLGITEMTEMPLATE)); if (*(WORD*)pb == (WORD)-1) // Skip class name string or ordinal pb += 2 * sizeof(WORD); else pb = (BYTE*)_SkipString((WCHAR*)pb); if (*(WORD*)pb == (WORD)-1) // Skip text string or ordinal pb += 2 * sizeof(WORD); else pb = (BYTE*)_SkipString((WCHAR*)pb); WORD cbExtra = *(WORD*)pb; // Skip extra data if (cbExtra != 0 && !bDialogEx) cbExtra -= 2; pb += sizeof(WORD) + cbExtra; --nCtrl; } //IA64: Max dialog template size of 4GB should be fine return UINT(pb - (BYTE*)pTemplate); }
BOOL FDialog::IsSysFont() { DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)GlobalLock(m_hTemplate); BOOL hasFont = ::HasFont(pTemplate); GlobalUnlock(m_hTemplate); if (!hasFont) return FALSE; BOOL retval=FALSE; BYTE* pb = GetFontSizeField(pTemplate); pb += FontAttrSize(IsDialogEx(pTemplate)); #if defined(_UNICODE) || (defined(OLE2ANSI) && !defined(_MAC)) if (lstrcmp(pb,"MS Sans Serif")==0 || lstrcmp(pb,"Helv")==0) retval=TRUE; #else // Convert Unicode font name to MBCS if (wcscmp((WCHAR *)pb,L"MS Sans Serif")==0 || wcscmp((WCHAR *)pb,L"Helv")==0) retval=TRUE; #endif return retval; }
BOOL AFX_CDECL CDialogTemplate::GetFont(const DLGTEMPLATE* pTemplate, CString& strFace, WORD& nFontSize) { ASSERT(pTemplate != NULL); if (!::HasFont(pTemplate)) return FALSE; BYTE* pb = GetFontSizeField(pTemplate); nFontSize = *(WORD*)pb; pb += FontAttrSize(IsDialogEx(pTemplate)); #if defined(_UNICODE) // Copy font name strFace = (LPCTSTR)pb; #else // Convert Unicode font name to MBCS WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pb, -1, strFace.GetBufferSetLength(LF_FACESIZE), LF_FACESIZE, NULL, NULL); strFace.ReleaseBuffer(); #endif return TRUE; }
BOOL CDialogTemplate::SetFont(LPCTSTR lpFaceName, WORD nFontSize) { ASSERT(m_hTemplate != NULL); if (m_dwTemplateSize == 0) return FALSE; DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)GlobalLock(m_hTemplate); BOOL bDialogEx = IsDialogEx(pTemplate); BOOL bHasFont = ::HasFont(pTemplate); int cbFontAttr = FontAttrSize(bDialogEx); if (bDialogEx) ((DLGTEMPLATEEX*)pTemplate)->style |= DS_SETFONT; else pTemplate->style |= DS_SETFONT; int nFaceNameLen = lstrlen(lpFaceName); if( nFaceNameLen >= LF_FACESIZE ) { // Name too long return FALSE; } #ifdef _UNICODE int cbNew = cbFontAttr + ((nFaceNameLen + 1) * sizeof(TCHAR)); BYTE* pbNew = (BYTE*)lpFaceName; #else WCHAR wszFaceName [LF_FACESIZE]; int cbNew = cbFontAttr + 2 * MultiByteToWideChar(CP_ACP, 0, lpFaceName, -1, wszFaceName, LF_FACESIZE); BYTE* pbNew = (BYTE*)wszFaceName; #endif if (cbNew < cbFontAttr) { return FALSE; } BYTE* pb = GetFontSizeField(pTemplate); int cbOld = (int)(bHasFont ? cbFontAttr + 2 * (wcslen((WCHAR*)(pb + cbFontAttr)) + 1) : 0); BYTE* pOldControls = (BYTE*)(((DWORD_PTR)pb + cbOld + 3) & ~DWORD_PTR(3)); BYTE* pNewControls = (BYTE*)(((DWORD_PTR)pb + cbNew + 3) & ~DWORD_PTR(3)); WORD nCtrl = bDialogEx ? (WORD)((DLGTEMPLATEEX*)pTemplate)->cDlgItems : (WORD)pTemplate->cdit; if (cbNew != cbOld && nCtrl > 0) { size_t nBuffLeftSize=(size_t)(m_dwTemplateSize - (pOldControls - (BYTE*)pTemplate)); if (nBuffLeftSize > m_dwTemplateSize) { return FALSE; } Checked::memmove_s(pNewControls,nBuffLeftSize, pOldControls, nBuffLeftSize); } *(WORD*)pb = nFontSize; Checked::memmove_s(pb + cbFontAttr, cbNew - cbFontAttr, pbNew, cbNew - cbFontAttr); //IA64: Max dialog template size of 4GB should be fine m_dwTemplateSize += ULONG(pNewControls - pOldControls); GlobalUnlock(m_hTemplate); m_bSystemFont = FALSE; return TRUE; }