VC++编程常见问题解答十六 问:如何重载MRU文件? 我创建了一个应用程序可以载入图象文件,但当我点击FILE菜单下MRU文件 列表时 ,却不能从磁盘载入以前曾经打开过的文件. 答:下面是我所能想到的解决方案: (1)在文档类中定义一个成员函数(例如:CMyDoc::Reopen)来处理重新打开 这个问题,指明参数和返回值. (2)产生一个CMultiDocTemplate的继承类(如CMyDocTemplate),定义一个构造 函数,取和基类相同的参数,不做任何事,只是调用基类的构造函数. (3)重载MatchDocType: CMyDocTemplate::Confidence CMyDocTemplate::MatchDocType( LPCTSTR lpszPath, CDocument *&rpDocMatch ) { Confidence match = CMultiDocTemplate::MatchDocType(lpszPath, rpDocMatch); if(yesAlreadyOpen == match) // clear enough { ASSERT_KINDOF(CMyDoc, rpDocMatch); ((CMyDoc *) rpDocMatch)->Reopen(/* your parameters */); // you can take any other actions here... } return match; } 当这函数返回"yesAlreadyOpen"时,你的文档框架将会被激活. 问:CImageList控件中图象橙色被显示为黄色? 我使用了一个CImageList控件来装入位图,用于TREE控件,其它的色彩都很正常 就是橙色被显示成为黄色 . 答:你只能使用系统指定的20种颜色(橙色不包括在内);当然,你也可以用下面的方法 来装载位图资源而不受颜色数的限制. HBITMAP LoadResourceBitmap(HINSTANCE hInstance, LPSTR lpString, HPALETTE FAR* lphPalette) { HRSRC hRsrc; HGLOBAL hGlobal; HBITMAP hBitmapFinal = NULL; LPBITMAPINFOHEADER lpbi; HDC hdc; int iNumColors; if (hRsrc = ::FindResource(hInstance, lpString, RT_BITMAP)) { hGlobal = ::LoadResource(hInstance, hRsrc); lpbi = (LPBITMAPINFOHEADER)LockResource(hGlobal); hdc = ::GetDC(NULL); *lphPalette = CreateDIBPalette ((LPBITMAPINFO)lpbi, &iNumColors); if (*lphPalette) { ::SelectPalette(hdc,*lphPalette,FALSE); ::RealizePalette(hdc); } hBitmapFinal = ::CreateDIBitmap(hdc,(LPBITMAPINFOHEADER)lpbi,(LONG)CBM_INIT, (LPSTR)lpbi + lpbi->biSize + iNumColors * sizeof(RGBQUAD), (LPBITMAPINFO)lpbi,DIB_RGB_COLORS ); ::ReleaseDC(NULL,hdc); // ::UnlockResource(hGlobal); // ::FreeResource(hGlobal); } return (hBitmapFinal); } // internally used by LoadResourceBitmap HPALETTE CreateDIBPalette (LPBITMAPINFO lpbmi, LPINT lpiNumColors) { LPBITMAPINFOHEADER lpbi; LPLOGPALETTE lpPal; HANDLE hLogPal; HPALETTE hPal = NULL; int i; lpbi = (LPBITMAPINFOHEADER)lpbmi; if (lpbi->biBitCount <= 8) *lpiNumColors="(1" << lpbi->biBitCount); else *lpiNumColors = 0; // No palette needed for 24 BPP DIB if (lpbi->biClrUsed > 0) *lpiNumColors = lpbi->biClrUsed; // Use biClrUsed if (*lpiNumColors) { hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) + sizeof (PALETTEENTRY) * (*lpiNumColors)); lpPal = (LPLOGPALETTE) GlobalLock (hLogPal); lpPal->palVersion = 0x300; lpPal->palNumEntries = *lpiNumColors; for (i = 0; i <*lpiNumColors; i++) { lpPal->pal PalEntry[i]. peRed = lpbmi->bmiColors[i].rgbRed; lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen; lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue; if (i<=10 || i>=246) lpPal->palPalEntry[i].peFlags = PC_NOCOLLAPSE; else lpPal->palPalEntry[i].peFlags = 0; } hPal = CreatePalette (lpPal); GlobalUnlock (hLogPal); GlobalFree (hLogPal); } return hPal; } 该函数也重载了位图调色板,这个功能被CBitmap::LoadBitmap忽略了(它假定位图 只 使用20种颜色).因此要保证在DC中有SelectPalette和RealizePalette.   问:无法正确改变应用程序的图标? 我有一个基于对话框的应用程序,在初始化时我使用了AfxGetApp()->LoadIcon(IDI_BRIEFCASE) 来载入自己的图标,当把程序拷贝到桌 面上时,图标是我所期望的.但在 资源管理器中的图标却还是MFC的图标. 答:资源管理器仅使用16x16的小图标,可能你在资源编辑器中只修改了32x32的标 准 图标.你需要重建16x16的小图标.