假设主对话框上有10个按钮,用来显示图片,图片是动态显示的,现在有2中方法。子类和ownerdraw方法,首先子类的话应该是在子类的onpaint里面绘图,如果全绘出来的话那如果10个按钮中有n个需要重绘的话就调用n次onpaint,所以这样感觉不好,比较理想的是一次onpaint显示一副,然后哪个按钮需要重绘就onpaint哪个,不过这样我不会实现。还有ownerdraw方法,这个我没有试过,所以问问高手怎么在多个按钮上显示图像?

解决方案 »

  1.   

    就是采用子类的时候10个按钮都继承这个子类,所以显示图像在子类的onpaint里面,这样如果有8个图像要显示的话onpaint一次就可以显示完全了,但是每个都继承这个子类,所以如果有多个按钮需要重绘的话就要连续onpaint多次,所以我觉得在onpaint里面应该只绘一幅图,对应一个按钮,当这个按钮需要重绘时只是onpaint这幅图就够了。
      

  2.   

    派生CButton
    在新类中处理 
    在对话框类中 做响应的初始化就好了我的博客里有篇我自己写的 
    你看下吧
    http://blog.csdn.net/FireBirdCN/archive/2008/10/11/3056891.aspx
      

  3.   

    非也 非也 绘图在OnDrawItem中
      

  4.   

    修改了 DrawItem函数void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    // TODO: Add your code to draw the specified item
    CRect rc;
    GetClientRect(&rc);
    CDC dc;
    using namespace Gdiplus;//应用 GDI+前必须的设置
    Graphics graph(GetDC()->m_hDC);
    USES_CONVERSION;  // 很复杂的定义  头文件添加了#include "atlbase.h"
    wchar_t* TempBoardPath=A2W(m_ResoucePath);//CString 转 wchar_t if(m_ResoucePath.IsEmpty())
    {
    Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON 水晶1.png");
    graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top); }
    else
    {
        Image image(TempBoardPath);
        graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top); }}
      

  5.   

    类应该是对象的抽象。这里你可以定义一个组建变量 在类实例话对象的时候车传递进一个 ID(资源方式),或文件名,外部文件方式再进行绘制。例如5楼的,Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON 水晶1.png");  难道一个按钮类就为实现一个对象?
    这里文件名完全可以用变量!,当实例化时将变量赋值,来决定需要加载的是哪幅图像!
      

  6.   


    你说那个 只是在没有指定资源是 默认的图像显示if(m_ResoucePath.IsEmpty()) 

    Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON 水晶1.png"); 
    graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top); } 
    else 

        Image image(TempBoardPath); 
        graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top); } m_ResoucePath就是外部传来的图像 在这里加了判断 有的话则用
         Image image(TempBoardPath); 
        graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top); 

      

  7.   

    不管你怎么设计,按钮重绘都是要调用OnPaint函数的,“n个需要重绘的话就调用n次onpaint”。