GUI开发-GUI九宫格的原理是怎么实现的,当缩放时他是如何工作的?

GUI开发-GUI九宫格的原理是怎么实现的,当缩放时他是如何工作的?

瑾兮 发布于 2017-04-02 字数 99 浏览 1398 回复 3

最好有图文和代码的说明。。本人比较菜。。
(注:一般用于客户端的图片背景,非游戏九宫格)

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-09-01 3 楼

这里有一篇原理可供参考
http://blog.csdn.net/soulxu/article/details/6162743

归属感 2017-08-05 2 楼

9宫格缩放规则如下:
1、将一张图分割成9块
2、四个角(1,3,7,9)在缩放的时候是保持大小不变
3、图块2,8仅当宽度变化时缩放宽度。
4、图块4,6仅当高度变化时缩放高度。
5、图块5当图片大小发生变化,宽度和高度都进行缩放。

浮生未歇 2017-05-01 1 楼

但需要补充一下,当发生大小变换时,一般为了效率和图片质量考虑,都把缩放模式改为平铺。

这是一些示例代码。你可以参考一下

int width_top_left = imagetl_->GetWidth(); 
int width_top_right = imagetr_->GetWidth();
int height_top_left = imagetl_->GetHeight(); 
int height_top_right = imagetr_->GetHeight(); 

int width_bottom_left = imagebl_->GetWidth(); 
int width_bottom_right = imagebr_->GetWidth();
int height_bottom_left = imagebl_->GetHeight(); 
int height_bottom_right = imagebr_->GetHeight(); 

int width_left = imagel_->GetWidth(); 
int width_right = imager_->GetWidth();
int height_top = imaget_->GetHeight(); 
int height_bottom = imageb_->GetHeight(); 

int width_center = imagec_->GetWidth();
int height_center = imagec_->GetHeight();

//绘制中间
for(int left = width_left; left < client.right - width_right; left += width_center)
{
  for(int top = height_top; top < client.bottom - height_bottom; top += height_center)
  {
    imagec_->Draw(dc, left, top);
  }
}

//绘制上方
int top_width = imaget_->GetWidth();
for(int left = width_top_left; left < client.right - width_top_right; left += top_width)
  imaget_->Draw(dc, left, 0);

//绘制下方
int bottom_width = imageb_->GetWidth();
for(int left = width_bottom_left; left < client.right - width_bottom_right; left += bottom_width)
  imageb_->Draw(dc, left, client.bottom - height_bottom);

//绘制左方
imagel_->Draw(dc, 0, height_top_left, width_left, client.bottom - height_top_left - height_bottom_left);

//绘制右方
imager_->Draw(dc, client.right - width_right, height_top_right, width_right, client.bottom - height_top_right - height_bottom_right);

//绘制四个角的图片
imagetl_->Draw(dc, 0, 0);
imagetr_->Draw(dc, client.right - width_top_right, 0);
imagebl_->Draw(dc, 0, client.bottom - height_bottom_left);
imagebr_->Draw(dc, client.right - width_bottom_right, client.bottom - height_bottom_right);