Описание проблемы:
Программа XXX написана и протестирована под Win2k. Затем возникает идея чтобы GUI этой программы в WinXP имел стиль XP. Для этого в папку с XXX.exe был помещен файл XXX.exe.manifest следующего содержания:
НАЧАЛО ФАЙЛА
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="
urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity processorArchitecture="*" version="5.1.0.0" type="win32"
name="Microsoft.Windows.Shell.shell32" />
<description>Windows Shell</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*"
processorArchitecture="*" />
</dependentAssembly>
</dependency>
</assembly>
КОНЕЦ ФАЙЛА
После этого все элементы GUI приобрели столь желанный XP стиль. Но! Панели инструментов (Toolbar) приобрели несколько странный вид: их grip (полоска, расположенная в самом начале toolbar’а) отрисовываются с явным изьяном. Изъян выглядит так, что как будто бы в момент прорисовки элемента (grip) он был прозрачным и сквозь него «просветился» незатертый фон.
Если кто-то сталкивался с похожей проблемой — поделитесь информацией!
O>Если кто-то сталкивался с похожей проблемой — поделитесь информацией!
Решение я нашел. Возможно оно не самое лучшее, но работает.
Для этого пришлось порыться в исходниках MFC.
Объявляем класс CExtToolBar (в файле ExtToolBar.hpp):
class CExtToolBar : public CToolBar {
protected:
/** Provides correct drawing of gripper of toolbar with WinXP. */
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
DECLARE_MESSAGE_MAP()
};
Реализуем этот класс:
#include "StdAfx.h"
#include "ExtToolBar.hpp"
BEGIN_MESSAGE_MAP(CExtToolBar, CToolBar)
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// ----------------------------------------------------------------------------
BOOL CExtToolBar::OnEraseBkgnd(CDC* pDC)
{
// this method contains slightly revised code of CControlBar::EraseNonClient
CRect rectClient;
GetClientRect(rectClient);
CRect rectWindow;
GetWindowRect(rectWindow);
ScreenToClient(rectWindow);
rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
CWindowDC dc(this);
// erase parts not drawn
dc.ExcludeClipRect(rectClient);
// fill background
dc.FillSolidRect(rectWindow, ::GetSysColor(COLOR_3DFACE));
// draw borders in non-client area
CControlBar::DrawBorders(&dc, rectWindow);
// draw gripper in non-client area
CControlBar::DrawGripper(&dc, rectWindow);
return CToolBar::OnEraseBkgnd(pDC);
}
А теперь везде вместо CToolBar пишем CExtToolBar.
Вроде работает...