标题:MFC按钮自绘
只看楼主
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
结帖率:75%
 问题点数:0 回复次数:1 
MFC按钮自绘
各位巨佬你们好,我自学MFC,感觉MFC按钮太老套,请问MFC按钮自绘函数怎么写?
我自己准备了三个位图(禁用,正常,点击),请问如何将它们绘制到按钮上?
搜索更多相关主题的帖子: 禁用 按钮 MFC 绘制 点击 
2020-02-02 21:23
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
得分:0 
感谢大家的关注
我在网上找了很久,虽然没找到三态按钮的自绘模板,但是我找到了二态的
程序代码:
CDC buttonDC;
CBitmap bitmapTrans;
BITMAP bmp;
CDC mem;
CRect rc;
buttonDC.Attach(lpDrawItemStruct->hDC);//得到用于绘制按钮的DC
mem.CreateCompatibleDC(&buttonDC);//准备向按钮区域传输图形

if (lpDrawItemStruct->CtlID == IDC_BUTTON1) {
    rc = lpDrawItemStruct->rcItem;//获取按钮所占的矩形大小
    UINT state = lpDrawItemStruct->itemState;//获取按钮当前的状态,不同状态绘制不同的按钮
    if (state & ODS_FOCUS) { //如果按钮已经取得焦点,绘制选中状态下的按钮
        bitmapTrans.LoadBitmap(IDB_BITMAP2); 
        bitmapTrans.GetBitmap(&bmp);
        CBitmap * old = mem.SelectObject(&bitmapTrans);
        //向按钮传输位图,使用stretcnblt可以使图片随按钮大小而改变
        buttonDC.StretchBlt(rc.left, rc.top, rc.right, rc.bottom, &mem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
        mem.SelectObject(old);
        bitmapTrans.DeleteObject();
    } else { //如果按钮已经取得焦点,绘制选中状态下的按钮
        bitmapTrans.LoadBitmap(IDB_BITMAP3);
        CBitmap *old2 = mem.SelectObject(&bitmapTrans);
        bitmapTrans.GetBitmap(&bmp);
        CBitmap *old = mem.SelectObject(&bitmapTrans);
        buttonDC.StretchBlt(rc.left, rc.top, rc.right, rc.bottom, &mem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
        mem.SelectObject(old2);
        bitmapTrans.DeleteObject();
    }
}
2020-02-22 18:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499076-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.086201 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved