Проблема отрисовки Toolbar в WinXP при использовании manifes
От: olegvls Россия  
Дата: 11.06.04 11:25
Оценка:
Описание проблемы:
Программа 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) он был прозрачным и сквозь него «просветился» незатертый фон.

Если кто-то сталкивался с похожей проблемой — поделитесь информацией!
Re: Проблема отрисовки Toolbar в WinXP при использовании man
От: Andrew S Россия http://alchemy-lab.com
Дата: 11.06.04 12:48
Оценка:
O>Если кто-то сталкивался с похожей проблемой — поделитесь информацией!

Думаю, сталкивались все, кто использовал стандартные MFC проекты. Решение — использовать Rebar в качестве подложки (это даст объемный вид тулбара под темами) и отказаться от docable тулбара. Имхо это не нужно в большинстве случаев. Если таки нужно — тогда либо изобретать doc window с ребаром наново самому, либо просто убрать грип — исключить стиль CBRS_GRIPPER
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: Проблема отрисовки Toolbar в WinXP при использовании
От: Аноним  
Дата: 15.06.04 07:05
Оценка:
AS> Решение — использовать Rebar в качестве подложки (это даст объемный вид тулбара под темами) и отказаться от docable тулбара. Имхо это не нужно в большинстве случаев. Если таки нужно — тогда либо изобретать doc window с ребаром наново самому, либо просто убрать грип — исключить стиль CBRS_GRIPPER

Спасибо за предложенные варианты. Только интерфейс программы определяется заказчиком, и поэтому отказаться от docable тулбара не получится.
Re: Проблема отрисовки Toolbar в WinXP при использовании man
От: Аноним  
Дата: 15.06.04 07:13
Оценка:
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.

Вроде работает...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.