在网上看到一个做界面的,无源文件,只有示例,上面是其中一个图片,然后在他的示例里所有按钮都可以用XP样式的(不管多大多少)来正常显示,我猜想他是用上面的图片通过拉伸自绘按钮实现的。
但是我在我的程序里根据实际按钮的大小用GetDIBits和StrechBit等函数将上面的图片进行放大或缩小并贴图后,如果实际按钮与上面图片大小差不多还没事,一旦大小差别很大,缩放后就严重失真。我的问题是,谁能帮我解决:就用上面的图片,自绘按钮时用该图片贴图,不管实际按钮多大多小,都能想出一种办法让其缩放后显示正常,不失真。我在学做界面,其它的方法我研究了一些,觉得还是这种方法最简单(截图,帖图),所以想弄懂。注:我说的那个界面大家可以下载看看:下载

解决方案 »

  1.   

    StrechBit的拉伸算法很简单,不能满足要求。你要么是多准备两副图片,然后根据实际情况选择最合适的来StrechBit;要么自己通过运算生成需要大小的图片,然后BitBlt。
      

  2.   

    将图片分成9部分(4个角,4条边和中间部分),放大时分成5次stretchblt(上下边只横向stretch, 左右边只纵向stretch, 中间按比例stretch)+4次bltblt(4个顶角直接复制)
      

  3.   

    同上,将图片切分。
    还有个办法是自绘时直接画线。网上有个Xp风格的按钮代码,可以直接Google到。
      

  4.   

    这不是拉伸出来的,而是画出来的,用DrawFrameControl(),它会利用当前的主题风格来绘制。
      

  5.   

    是画出来的,用DrawFrameControl(),它会利用当前的主题风格来绘制。拉伸的话跟按钮大小、图片大小、显示器的分辨率都有关。
      

  6.   

    谢谢各位兄弟。DrawFrameControl会利用当前的主题风格来绘制,这个效果不是我要的。除了这种方法:把按钮分成9个部分,4个角直接贴图,4条边保持宽度不变来拉伸,中间整体拉伸。
    切割拉伸以外,的确没有别的简单的办法了吗?
    大家知道我说的那个“界面专家”他是用什么办法做的吗?
      

  7.   

    难道就不能再仔细查查MSDN关于桌面主题的内容?同时画出多种主题的按钮是可以做得到的:
    OpenThemeData 获得特定主题句柄
    DrawThemeBackground 根据选定的主题句柄绘制控件的背景
    DrawThemeEdge 根据选定的主题句柄绘制窗口边界
    DrawThemeText 根据选定的主题句柄绘制窗口文本
      

  8.   

    HOHO 这个是画出来的 并不是贴图 我记得我学自绘按钮的时候就是学的这个第一个例子。
    如果要贴图的话 你可以把图片分为4角图    左上角和右上角高度的中间图  左下角和右下角高度的中间图 以及左上角和左下角之间的中间图  各为一像素即可。剩下就是区域重复性贴图了。四个角是定点贴图