2013-03-19 16 views
5

Scrollbas w chrome lub firefox nie ma uchwytu. Są one kontrolowane ręcznie, ale mają ten sam wygląd i zachowanie, co domyślny pasek przewijania systemu. Z którego możemy wywnioskować, że te przeglądarki używają interfejsu Windows API, takiego jak DrawThemeBackground, do rysowania paska przewijania.W jaki sposób firefox/chrome narysuje pasek przewijania?

Jednak interfejsy API takie jak DrawThemeBackground to GDI, chrome/firefox używają funkcji skia/cario do renderowania całego obszaru roboczego. Mój problem polega na tym, w jaki sposób łączą one te dwa rodzaje technologii?

kod 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;(???) 

Czy procedura przypominają powyżej jednego?

+3

Kod źródłowy obu tych przeglądarek jest dostępny, może powinieneś rzucić okiem? –

Odpowiedz

5

Firefox

Właściwie Kair posiada funkcję, aby uzyskać DC z powierzchni Kairze. Przykładowy kod:

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() wezwanie HDC gfxWindowsSurface::GetDCWithClip(gfxContext *ctx) wreszcie zadzwonić Kair win32.

Chrome

Skia nie zapewnia funkcjonalność transformacji z skia płótnie do HDC, ale chrom projekt dodać rozszerzenie do skia i spełniają tę funkcję.

w skia/ext/bitmap_platform_device_win.cc:

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

które tworzą dc z wewnętrznej pamięci bitmapy płótnie.

Tak więc, gdy farba, bez względu na to, czy potrzebujesz natywnego dc, czy też ogólnego płótna cairo/skia, nie ma już znaczenia.

Przykładowy kod:

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); 
} 

przypadku systemu Windows, w celu zapewnienia natywną wygląd, styl wizualny, gdy jest włączona, te przeglądarek użyłby DrawThemeBackground. Jednak po wyłączeniu stylu wizualnego (tryb klasyczny to jeden), będą używać DrawFrameControl do rysowania elementów sterujących.