让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果

作为windows工程师,UI开发是无可避免的工作,无论你是写一个供销存系统,还是一款聊天IM,UI开发总是会占据你大量的时间。前段时间在公司开发项目中,带着些许私心实现了一个构想了较长时间的UI引擎,自已在使用过程中感觉极大的加快了UI开发的效率,希望与大家分享,并用大家的建议来不断完善。

接下来将以几个在实际工作中常见的UI开发问题为例,介绍实现方法及效果,相信这几个问题能引起客户端UI开发同仁的共鸣。

1.多格式图片支持

2.文字和超链接

3.自绘按钮

4.脏处理与区域刷新

5.异形窗体(包括像素级透明异形窗体)

1.多格式图片支持

UI开发离不开图片,windows的api提供了一些加载图片的方法,如常用的LoadImage,使用很简单。但其功能也跟其用法一样简单,只能加载bmp,ico等几种格式。众所周知,bmp是不带alpha通道的,一旦需要实现阴影等alpha渐变的效果,系统提供的api就有些捉襟见肘了。当然很多人会想到大名鼎鼎的CxImage,这也是个不错的选择。我在内部也是封装了CxImage帮忙加载和保存多格式的图片,但加载之后的图像数据处理都是自处理的了,因为CxImage在处理RGB转hsl,旋转等特效时大量使用了浮点运算,效率不能使人十分满意。我把所有的浮点运算都转为整形运算,并大量使用了SSE2指令进行优化,实测证明在旋转,HSL转换,灰化等特效时,效率可以提高4-10倍(CPU为T2330 1.6GHz)。图片加载支持三种方式:从文件;从资源;从dc。需要说明的是从资源加载时请将资源类型命名为IMAGE。

演示代码如下:

//GetSonicUI是引擎导出的唯一函数,是类厂和引擎总控,负责创建对象和销毁对象等。
ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
pImg->Draw(hdc, 10, 10);
GetSonicUI()->DestroyObject(pImg);

OK,一个带透明通道的png图片绘制就完成了,是不是轻松惬意。

2.文字和超链接

UI开发过程中经常最麻烦的是绘制文字,需要你不停的初始化字体,设定字体属性,如果产品人员要求文字按一定的格式排版或输出彩色文字,那简直就是我们的噩梦了。而在自己的界面加入超链接,网上已经有不少演示代码了,但我相信ISonicString是一个更简单的实现方案。ISonicString是一个可以进行消息交互的UI组件对象。只需要像html语言一样加入一些类似的控制符,你就可以随心所欲的控制字体的大小颜色,超链接等属性,非常方便。

ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x, a='http://hi.csdn.net/zskof', font, font_height=16/点我打开链接", RGB(0, 0, 255));
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  PAINTSTRUCT ps;
  HDC hdc;
  switch (message)
  {
  case WM_PAINT:
    {
      hdc = BeginPaint(hWnd, &ps);
      pStr->TextOut(hdc, 0, 0, hWnd);
      EndPaint(hWnd, &ps);
    }
    break;
  }
  .
  .
  .
}

如何,只需要创建,然后像CString的Format一样格式化一个字符串,在WM_PAINT响应中输出即可,只需要三步,你就得到了一行蓝色的功能完整的超链接,是不是很方便。通过控制字符,你还可以设定下划线的样式,鼠标形状,响应鼠标时变色等细节,具体参看ISonicUI.h中的注释即可。

ISonicString也可以将文字和图片混合输出,或使图片带有超链接属性,需要用'p'控制符指定一个ISonicImage的id:

ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x/你好吗,朋友/p=%d, a='http://hi.csdn.net/zskof'/", RGB(0, 0, 255), pImg->GetObjectId());

这样就可以像写网页一样在你的界面上进行文字和图片的混合排版输出了。

时间: 2024-08-03 06:21:50

让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果的相关文章

Android UI开发专题(二) 之绘图基础

在Android UI开发专题(一) 之界面设计中我们介绍了有关Android平台资源使用以及Bitmap相关类的操作,接下来将会以实例的方式给大家演示各种类的用处以及注意点.今天我们继续了解android.graphics包中比较重要的绘图类. 一. android.graphics.Matrix 有关图形的变换.缩放等相关操作常用的方法有: void reset() // 重置一个matrix对象. void set(Matrix src) //复制一个源矩阵,和本类的构造方法 Matrix

UI开发的终极解决方案

呵呵,有点标题党的意思,但是如果你正在寻找UI解决方案,你一定不会白来的. 虽然没有直接开发前台界面,但是好呆也看了这么些年,碰到许多关于UI的问题: UI中JS的引入与顺序,JS合并的问题 UI中css的引入与顺序,CSS合并的问题 UI中碰到性能问题时的影响范围,比如:一个树出现问题,要改动许多用到树的地方 代码重复的问题,同样的内容在许多地方都有,如果要改动就要改动许多个地方 整体布局调整困难的问题 开发效率的问题 执行效率的问题,前台响应要求速度更快 集群的问题 国际化的问题 ... 这

UWP开发入门(十四)—— UserControl中Adaptive UI的小技巧

原文:UWP开发入门(十四)-- UserControl中Adaptive UI的小技巧 本篇我们通过绘制一个非常简单的UserControl控件,来分享一下对Adaptive UI的理解及一些图形绘制的技巧. 现在流行的APP都少不了精致的用户头像,首先假设我们需要绘制如下的图形作为默认头像: <UserControl x:Class="AdaptiveUserControl.Circle0" xmlns="http://schemas.microsoft.com/w

c++-C++ UI开发 界面开发 窗口开发

问题描述 C++ UI开发 界面开发 窗口开发 自学C++的,目前都是照着书本写程序的,书上从win32 API开始讲解,然后讲MFC 很简略,所以我只会用Winmain(win32 API)写很简单的窗体,但是win32 api写 窗口很丑,而且学win32 API主要是打基础,了解程序的运行方式, 然后呢MFC书本讲的很简单,找不到书也找不到相应MSDN, win32 API好歹有个MSDN 所以呢,C++UI开发有哪些软件呢?我要所有的软件名字好有个概念,然后求推荐其中哪个好用 解决方案

Android的ui开发类库 GreenDroid

问题描述 本帖最后由 天使牛 于 2015-2-22 18:28 编辑 GreenDroid是一个Android的ui开发类库,能够使你的ui开发更加简便.EasyREST_API.zip

Android界面效果UI开发资料汇总(附资料包)_Android

简介: Android界面效果UI开发资料汇总 1. Android_UI开发专题.rar 2. android界面效果全汇总.rar 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or oth

Cocos2d-x UI开发之场景切换代码实例_C 语言

cocos2d-x中的场景切换是通过导演类调用相应的方法完成的,可以通过CCDirector::sharedDirector()->replaceScene()方法切换场景,参数是要切换的新场景,这种方法会释放掉旧的场景.通过pushScene()切换则是将旧的场景压入到栈中,以便通过popScene()函数出栈,继续运行原场景.刚开始程序启动的时候通过runWithScene()运行一个新的场景.下面通过代码来说明.单击下图可以查看效果. 这次代码一共建立了俩个场景,一个是原来的hellowo

Cocos2d-x UI开发之菜单类使用实例_C 语言

菜单是我们在开发中经常用到的元素,cocos2d-x中的菜单基本上是分装了文本类和精灵类,代码注释有详细的说明,看代码吧!   bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); CCLabelTTF * ttf = CCLabelTTF::create("cocos2d","Arial",24); //没有设置坐标,默认放到CCMenu层的中间,第二个参

Cocos2d-x UI开发之文本类使用实例_C 语言

cocos2d-x中有三个文本类,用来在屏幕上显示文字,这三个类分别是CCLabelTTF.CCLabelBMFont.CCLabelAtlas.这三个类都继承自抽象类CCLabelProtocol,所以具有了setString()改变文本信息的方法和getString()获得文本信息的方法. bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); CCSize size = CCSize