技术开发 频道

如何开发绚丽、高效率的界面(Windows嵌入式系统)

  【IT168 技术】据我了解Microsoft、Nokia、Google等,还有国内的Baidu是有比较专业的UE团队。对于我们这样的普通团队、普通开发者来说,这样的经验实在太少了。而且普遍更认为UE是UI Designer的事情,与我们这样的Developer没有太多关系。

  当然不是,UE远超过UI。很多因素造成了UE差,比如一份不正确的数据表明17%的用户认为手机运行速度慢,Windows Mobile手机开机漫长的等待就十分的让我受不了。我们开发的应用是否有过优化?运行效率是否已经很让用户满意了?等等这些问题留在开发中思考吧。

  在使用优秀的产品时用心体会、用心观察、用心思考,在此基础上创新。逐渐提高UE设计能力。

  这篇文章仅仅讨论有关界面开发上Developer涉及到的技术问题,在学习过程中,随着越深越广越觉得自身水平的不足,所以只敢抛砖引玉,更多希望能够引起大家对界面开发技术、对UE的讨论。先介绍下如何使用Win32下的GDI等接口实现绚丽、高效率的界面。这样我们就能发现GDI等接口的不足,进而引申到DirectDraw上面。

  1.如何让界面绚丽?

  怎么样的算绚丽?有很漂亮的图片?有Alpha透明?有Animation?

  每个人的审美观点都不同,所以如果你的界面很多人认为绚丽那就可以了。设计界面主要是Designer的工作,包括UI逻辑的设计,色彩搭配设计等,我认为这也可以进一步分工:熟悉用户习惯的Designer、美学Designer等。但是一般情况下这些让程序员给代劳了。

  下面介绍Windows提供给开发人员的相关接口,利用这些接口设计你认为绚丽的界面。

  2.如何透明?如何半透明?如何颜色渐变?

  以下是我使用Imaging COM组件封装的一个函数,可以使用其绘制PNG图片,当然也可以绘制其它图片。绘制带Alpha通道的PNG图片即实现了透明。

#include <imaging.h>
#include
<initguid.h>
#include
<imgguids.h>

#pragma comment(lib, "Imaging.lib")

BOOL DrawPNG(HDC hDC, TCHAR
*szPicString, RECT &rcDraw)
{
    BOOL br
= FALSE;
    IImagingFactory
*pImgFactory = NULL;
    IImage
*pImage = NULL;
    ImageInfo sImgInfo;

    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    
// Create the imaging factory.
    if (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IImagingFactory,
        (
void **)&pImgFactory)))
    {
        
// Load the image from the JPG file.
        if (SUCCEEDED(pImgFactory->CreateImageFromFile(
            szPicString,
            
&pImage)))
        {
            
// Draw the image.
            pImage->Draw(hDC, &rcDraw, NULL);
            pImage
->Release();
            pImage
= NULL;
            br
= TRUE;
        }

        pImgFactory
->Release();
    }
    CoUninitialize();

    
return br;
}

  而封装的这个函数实现了将一个DC根据Alpha值半透明绘制到另一个DC上,使用GDI函数AlphaBlend实现。

BOOL AlphaBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest,
              
int nWidthDest, int nHeightDest,
              HDC hdcSrc,
int nXOriginSrc, int nYoriginSrc,
              
int nWidthSrc, int nHeightSrc,
              BYTE alpha) {

                  BLENDFUNCTION bf;
                  bf.BlendOp
= AC_SRC_OVER;
                  bf.BlendFlags
= 0;
                  bf.SourceConstantAlpha
= alpha;
                  bf.AlphaFormat
= 0;

                  
return AlphaBlend(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
                      hdcSrc, nXOriginSrc, nYoriginSrc, nWidthSrc, nHeightSrc, bf);

}

  如果你的设备支持AlphaBlend硬件加速那将是非常棒的事情,否则软件方式会有点影响性能。

  颜色渐变也是直接有API可以支持:

  

BOOL GradientFill(
  HDC hdc,
  PTRIVERTEX pVertex,
  ULONG nVertex,
  PVOID pMesh,
  ULONG nCount,
  ULONG ulMode
);hdc
[
in] Handle to the destination device context.

pVertex
[
in] Pointer to an array of TRIVERTEX structures, each of which defines a triangle vertex.

nVertex
[
in] The number of vertices in pVertex.

pMesh
[
in] Array of GRADIENT_RECT structures in rectangle mode.

nCount
[
in] The number of rectangles in pMesh.

ulMode
[
in] Specifies gradient fill mode. The following table shows the possible values for ulMode.

This function fills rectangular regions with a background color that
is interpolated from color values specified at the vertices.

  不管你使用.Net CF平台调用这些API,还是Win32/MFC/ATL/WTL直接调用这些API,你都是可以实现这些效果的。更多内容请查询开发文档,毕竟那才是最好的参考资料。

0
相关文章