2013-03-19 2 views
5

Прокрутка в хром или firefox не имеет ручки. Они управляются без ручек, но они имеют одинаковые характеристики и поведение, как панель прокрутки по умолчанию. Из этого можно сделать вывод, что эти браузеры используют API-интерфейс окон, например DrawThemeBackground, для рисования полосы прокрутки.Как firefox/chrome нарисовать полосу прокрутки?

Однако API, такие как DrawThemeBackground, являются GDI, chrome/firefox используют skia/cario для рендеринга всего холста. Моя проблема заключается в том, как они сочетают эту технологию двух видов?

код Pesudo:

WM_PAINT: 
    prepare canvas; 
    draw the canvas with skia/cario; 
    bitblt to the dc; 
    draw the theme-related handless control;(???) 
    bitblt to the dc or directly draw to the dc;(???) 

ли процедура напоминает один из приведенных выше?

+3

Исходный код для обоих браузеров доступен, может быть, вам стоит взглянуть? –

ответ

5

Firefox

На самом деле каир имеет функцию, чтобы получить DC от поверхности каир. Пример кода:

VOID OnPaint(HWND hwnd, HDC hdc) 
{ 
    RECT rc; 
    ::GetClientRect(hwnd, &rc); 
    //draw one line 
    cairo_surface_t* surface = cairo_win32_surface_create(hdc); 
    cairo_t* cr = cairo_create(surface); 
    cairo_set_source_rgb(cr, 0xff, 0, 0); 
    cairo_set_line_width(cr, 1); 
    cairo_move_to(cr, 0, 0); 
    cairo_line_to(cr, rc.right, rc.bottom); 
    cairo_stroke(cr); 
    cairo_destroy(cr); 

    //draw the theme background 
    HDC hdcNew = cairo_win32_surface_get_dc(surface); 
    HTHEME hTheme = OpenThemeData(NULL, L"SCROLLBAR"); 
    RECT rcArrow; 
    SetRect(&rcArrow, 30, 30, 45, 45); 
    DrawThemeBackground(hTheme, hdcNew, SBP_ARROWBTN, ABS_DOWNDISABLED, &rcArrow, NULL); 
    cairo_surface_destroy(surface); 
} 

gfxWindowsNativeDrawing::BeginNativeDrawing() вызов HDC gfxWindowsSurface::GetDCWithClip(gfxContext *ctx) наконец позвонить каир win32.

Chrome

Skia не обеспечивает функциональные возможности преобразования из Skia холста HDC, но проект хромо добавить расширение к Skia и выполнять эту функцию.

в Skia/Ext/bitmap_platform_device_win.cc:

HDC BitmapPlatformDevice::BitmapPlatformDeviceData::GetBitmapDC() { 
} 

, которые создают постоянный ток памяти из холста внутреннего растрового изображения.

Так что, когда краска, нужно ли использовать нативный постоянный ток или общий холст кайро/скиа, больше не имеет значения.

Пример кода:

void TestChromeExt(HWND hwnd, HDC hdc) 
{ 
    RECT rc; 
    GetClientRect(hwnd, &rc); 
    skia::BitmapPlatformDevice* pBmpDevice = skia::BitmapPlatformDevice::Create(rc.right, rc.bottom, true); 
    skia::PlatformCanvas *pCanvas = new skia::PlatformCanvas(pBmpDevice); 
    pCanvas->clear(SK_ColorWHITE); 
    SkPaint paint; 
    paint.setColor(SK_ColorRED); 
    paint.setStrokeWidth(3); 
    paint.setStyle(SkPaint::kStroke_Style); 
    pCanvas->drawLine(0, 0, rc.right, rc.bottom, paint); 
    HDC memdc = skia::BeginPlatformPaint(pCanvas); 
    RECT rcArrow; 
    SetRect(&rcArrow, 100, 200, 120, 220); 
    DrawThemeBackground(OpenThemeData(NULL, L"SCROLLBAR"), memdc, SBP_ARROWBTN, ABS_DOWNDISABLED, &rcArrow, NULL); 
    skia::EndPlatformPaint(pCanvas); 
    skia::DrawToNativeContext(pCanvas, hdc, 0, 0, &rc); 
} 

Для Windows, чтобы обеспечить родной внешний вид, когда визуальный стиль включен, эти браузеры будут использовать DrawThemeBackground. Однако, когда визуальный стиль отключен (классический режим один), они будут использовать DrawFrameControl для рисования элементов управления.

Смежные вопросы