惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
Check Point Blog
F
Fortinet All Blogs
腾讯CDC
V
V2EX
Y
Y Combinator Blog
I
InfoQ
月光博客
月光博客
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
J
Java Code Geeks
D
DataBreaches.Net
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
The Cloudflare Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
Engineering at Meta
Engineering at Meta
B
Blog RSS Feed
P
Proofpoint News Feed

博客园 - Clingingboy

冒个泡,刷刷存在感 使用文件映射和信号量来进程间通信 Xperf Basics: Recording a Trace (the easy way)(转) Xperf Basics: Recording a Trace(转) Xperf Analysis Basics(转) Android相关sdk使用 Uniscribe文字自动换行 Chrome RenderText分析(2) c++智能指针 codepage IMLangCodePages GUI 快捷键的实现思路 Menu实现逻辑 控件保持多种绘图状态的做法 2个函数宏技巧 DirectUI消息循环的简单封装 c++以代理的方式来实现接口化编程 c++对象工厂 使用模板来解决接口继承问题 VC++ 使用attributes定义接口
绘图 Painter转接口封装的方式
Clingingboy · 2013-11-21 · via 博客园 - Clingingboy

2013-11-21 11:52  Clingingboy  阅读(394)  评论()    收藏  举报

记录下思想

适用于业务逻辑相对单纯的一些画法,比如画背景(颜色,背景,边框等)

一个Draw方法中如果绘制比较复杂的话,就会导致代码混乱,而不灵活,每次需求更改就得重新画过,可重用性差.

以接口的方式可以很好的重复利用功能,不必因为需求的更改而大量变更代码

chrome的方法定义如下

// Painting ------------------------------------------------------------------

// Background
scoped_ptr<Background> background_;

// Border.
scoped_ptr<Border> border_;

// Focus border.
scoped_ptr<FocusBorder> focus_border_;
// The background object is owned by this object and may be NULL.
void set_background(Background* b) { background_.reset(b); }
const Background* background() const { return background_.get(); }
Background* background() { return background_.get(); }

// The border object is owned by this object and may be NULL.
void set_border(Border* b) { border_.reset(b); }
const Border* border() const { return border_.get(); }
Border* border() { return border_.get(); }

// The focus_border object is owned by this object and may be NULL.
void set_focus_border(FocusBorder* b) { focus_border_.reset(b); }
const FocusBorder* focus_border() const { return focus_border_.get(); }
FocusBorder* focus_border() { return focus_border_.get(); }

具体调用

void View::OnPaintBackground(gfx::Canvas* canvas) {
  if (background_.get()) {
    TRACE_EVENT2("views", "View::OnPaintBackground",
                 "width", canvas->sk_canvas()->getDevice()->width(),
                 "height", canvas->sk_canvas()->getDevice()->height());
    background_->Paint(canvas, this);
  }
}

void View::OnPaintBorder(gfx::Canvas* canvas) {
  if (border_.get()) {
    TRACE_EVENT2("views", "View::OnPaintBorder",
                 "width", canvas->sk_canvas()->getDevice()->width(),
                 "height", canvas->sk_canvas()->getDevice()->height());
    border_->Paint(*this, canvas);
  }
}

void View::OnPaintFocusBorder(gfx::Canvas* canvas) {
  if (focus_border_.get() &&
      HasFocus() && (focusable() || IsAccessibilityFocusable())) {
    TRACE_EVENT2("views", "views::OnPaintFocusBorder",
                 "width", canvas->sk_canvas()->getDevice()->width(),
                 "height", canvas->sk_canvas()->getDevice()->height());
    focus_border_->Paint(*this, canvas);
  }
}