2013-03-19 14 views
5

Krom veya firefox'ta kaydırma çubuğunun tanıtıcısı yoktur. Elsiz kontrol vardır, ancak sistem varsayılan kaydırma çubuğuyla aynı görünüm ve davranışı paylaşırlar. Bunun için, bu tarayıcıların kaydırma çubuğunu çizmek için DrawThemeBackground gibi windows teması API'sini kullandığını söyleyebiliriz. Ancak, DrawThemeBackground gibi API'lar GDI, tüm tuvali oluşturmak için chrome/firefox skia/cario kullanır. Benim sorunum, bu iki tür teknolojiyi nasıl birleştiriyor?Firefox/chrome kaydırma çubuğunu nasıl çiziyor?

Pesudo kodu:

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

prosedür yukarıdaki birini benzeyebilir mi?

+3

Her iki tarayıcı için de kaynak kodu kullanılabilir, belki bir göz atmalısınız? –

cevap

5

Firefox

Aslında kahire bir kahire yüzeyinden DC almak için bir işlevi vardır. Örnek kod: HDC gfxWindowsSurface::GetDCWithClip(gfxContext *ctx) nihayet kahire win32 diyoruz

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() çağrı.

Krom

Skia hdc için Skia tuval gelen dönüşüm işlevleri sağlamaz, ancak proje krom skia bir uzantısı eklemek ve bu işlevselliği yerine getirmek.

Skia/ext/bitmap_platform_device_win.cc içinde: tuval iç bitmap'ten bir bellek dc oluşturmak

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

.

Bu nedenle, boya kullanıldığında, doğal dc kullanmanız gerekip gerekmediği veya genel cairo/skia tuvali artık önemli değil.

Örnek kod: Windows için

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

, görsel stil etkinleştirildiğinde, bu tarayıcılar DrawThemeBackground kullanırsınız, yerli bir görünüm sağlamak ve hissetmek için. Ancak, görsel stil devre dışı bırakıldığında (klasik mod birdir), denetimleri çizmek için DrawFrameControl kullanırlar.