CBitmapButton或者CButtonST怎么随按钮大小自动拉伸背景位图???

大树学长 2019-07-24 03:12:43
第一个CBitmapButton因为用起来很简单在初始化时设置四个状态位图就可以了
m_button1.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2, IDB_BITMAP3, IDB_BITMAP4);
当按钮大小改变后,上面的位图没有变,因为有4个状态位图使用StretchBlt也没有单个方便,不知道有没有什么好的方法??

第二个因为CBitmapButton遇到的问题就转而使用CButtonST,但是CButtonST好像没有对背景位图有伸缩处理,这个有什么办法???
...全文
291 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-07-25
  • 打赏
  • 举报
回复
从 CBitmapButton 派生新类,重载 DrawItem , 参照原来的代码,把BitBlt贴图修改为StretchBlt 即可

// Draw the appropriate bitmap
void CImageButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
  ASSERT(lpDIS != NULL);
  // must have at least the first bitmap loaded before calling DrawItem
  ASSERT(m_bitmap.m_hObject != NULL);     // required
  
  // use the main bitmap for up, the selected bitmap for down
  CBitmap* pBitmap = &m_bitmap;
  UINT state = lpDIS->itemState;
  if ((state & ODS_SELECTED) && m_bitmapSel.m_hObject != NULL)
    pBitmap = &m_bitmapSel;
  else if ((state & ODS_FOCUS) && m_bitmapFocus.m_hObject != NULL)
    pBitmap = &m_bitmapFocus;   // third image for focused
  else if ((state & ODS_DISABLED) && m_bitmapDisabled.m_hObject != NULL)
    pBitmap = &m_bitmapDisabled;   // last image for disabled
  
  // draw the whole button
  CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  CDC memDC;
  memDC.CreateCompatibleDC(pDC);
  CBitmap* pOld = memDC.SelectObject(pBitmap);
  if (pOld == NULL)
    return;     // destructors will clean up
  

  CRect rect;
  rect.CopyRect(&lpDIS->rcItem);

  /*
  pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
    &memDC, 0, 0, SRCCOPY);
  */
  
  BITMAP bmInfo;  pBitmap->GetBitmap(&bmInfo);
  pDC->SetStretchBltMode(HALFTONE);
  pDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(),
    &memDC, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, SRCCOPY);

  memDC.SelectObject(pOld);
}
走好每一步 2019-07-24
  • 打赏
  • 举报
回复
引用 楼主 大树学长 的回复:
第一个CBitmapButton因为用起来很简单在初始化时设置四个状态位图就可以了 m_button1.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2, IDB_BITMAP3, IDB_BITMAP4); 当按钮大小改变后,上面的位图没有变,因为有4个状态位图使用StretchBlt也没有单个方便,不知道有没有什么好的方法?? 第二个因为CBitmapButton遇到的问题就转而使用CButtonST,但是CButtonST好像没有对背景位图有伸缩处理,这个有什么办法???
有个Gdi+ button 在 git上面有,csdn好像也有下载
schlafenhamster 2019-07-24
  • 打赏
  • 举报
回复
自绘是早晚要学会的技能。
tiger波波 2019-07-24
  • 打赏
  • 举报
回复
https://www.codeproject.com/Questions/591776/Howplustoplusprogrammaticlyplussizeplusbitmapplusr
大树学长 2019-07-24
  • 打赏
  • 举报
回复
引用 2 楼 tiger波波 的回复:
LoadBitmaps后加上m_button1.SizeToContent()试试

这个是按钮大小适合位图来的,要反过来的效果,本来位图就小了
tiger波波 2019-07-24
  • 打赏
  • 举报
回复
LoadBitmaps后加上m_button1.SizeToContent()试试
赵4老师 2019-07-24
  • 打赏
  • 举报
回复
自绘是早晚要学会的技能。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧