问个简单的gdi绘图的问题

luye1217 2012-12-11 03:41:26
想实现对话框MFC 用gdi+给按钮加载个png的图,旁边是一个矩形框,在onpaint中的else语句下这么写的:
Graphics graphics(m_button1.GetWindowDC()->m_hDC); //给按钮添加png
Image image(L"GreenLed.png", TRUE);
graphics.DrawImage(&image,10,10,60,60);

CPaintDC dc(this); // 用于绘制的设备上下文
using namespace Gdiplus;
Graphics graphics2( dc.m_hDC );
Pen newPen( Color( 255, 0, 0 ), 3 );
HatchBrush newBrush( HatchStyleCross,
Color(255, 0, 255, 0),
Color(255, 0, 0, 255));
graphics2.DrawRectangle( &newPen, 50, 50, 100, 60);
graphics2.FillRectangle( &newBrush, 50, 50, 100, 60); //画一个矩形框


CDialog::OnPaint();
运行后矩形框绘制出来了,但是按钮添加不了png图,如果拖动、切换改变下窗口,png图就添加上了。是不是因为窗口重绘调用ondraw函数给覆盖掉了?怎么画图能够使png图一直显示在按钮上呢?
...全文
169 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumos 2012-12-13
  • 打赏
  • 举报
回复
引用 6 楼 luye1217 的回复:
引用 3 楼 luye1217 的回复:引用 1 楼 zhoujielunzhimi 的回复: 你继承CButton,在CButton的OnPaint中绘制。 还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么 继承了button类后,将button的变量设为cbutton类,加载png图的确不随着窗口的切换、最大化最小化变化,但……
你可以先试着 用CButtonST(在codeproject下载),或者直接看源代码
luye1217 2012-12-13
  • 打赏
  • 举报
回复
引用 3 楼 luye1217 的回复:
引用 1 楼 zhoujielunzhimi 的回复: 你继承CButton,在CButton的OnPaint中绘制。 还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么 继承了button类后,将button的变量设为cbutton类,加载png图的确不随着窗口的切换、最大化最小化变化,但是其他按钮却开始会变了,会少一块等等,这样要讲窗口上所有的按钮都放……
现在只好用cBitmapbutton加载bmp了 放弃用png~~
luye1217 2012-12-12
  • 打赏
  • 举报
回复
引用 3 楼 luye1217 的回复:
引用 1 楼 zhoujielunzhimi 的回复:
你继承CButton,在CButton的OnPaint中绘制。

还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么
继承了button类后,将button的变量设为cbutton类,加载png图的确不随着窗口的切换、最大化最小化变化,但是其他按钮却开始会变了,会少一块等等,这样要讲窗口上所有的按钮都放……


先谢谢您了啊,m_button1是要贴上png图的按钮,代码如下: 继承类下的onpaint:
void CbuttonTJ::OnPaint()
{
CPaintDC dc(this); // device context for painting
graphics graphics(ppp); //ppp是引用的主对话框 extern HDC ppp;在主对话框里是:
--- ppp=m_button1.GetWindowDC()->m_hDC;//
Image image(L"YellowLed.png", TRUE);
graphics.DrawImage(&image,10,10,60,60);
}

主对话框是:
void CLedDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);

}
else
{




CPaintDC dc(this); // 用于绘制的设备上下文
using namespace Gdiplus;
Graphics graphics2( dc.m_hDC ); //绘制一个蓝色框框
Pen newPen( Color( 255, 0, 0 ), 3 );
HatchBrush newBrush( HatchStyleCross,
Color(255, 0, 255, 0),
Color(255, 0, 0, 255));
graphics2.DrawRectangle( &newPen, 50, 50, 100, 60);
graphics2.FillRectangle( &newBrush, 50, 50, 100, 60);


CDialog::OnPaint();

}
}


这样做mbutton成功的贴上了png 而且怎么动都不移动窗口都不会出问题,但是主窗口上其他的按钮除了默认的确认和取消都没了,要摸索的点击下就会出现。
sumos 2012-12-11
  • 打赏
  • 举报
回复
引用 3 楼 luye1217 的回复:
引用 1 楼 zhoujielunzhimi 的回复:你继承CButton,在CButton的OnPaint中绘制。 还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么 继承了button类后,将button的变量设为cbutton类,加载png图的确不随着窗口的切换、最大化最小化变化,但是其他按钮却开始会变了,会少一块等等,这样要……
surprise。 你把代码发上来,大家仔细看看
luye1217 2012-12-11
  • 打赏
  • 举报
回复
引用 1 楼 zhoujielunzhimi 的回复:
你继承CButton,在CButton的OnPaint中绘制。 还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么
继承了button类后,将button的变量设为cbutton类,加载png图的确不随着窗口的切换、最大化最小化变化,但是其他按钮却开始会变了,会少一块等等,这样要讲窗口上所有的按钮都放在cbutton继承类里啊
luye1217 2012-12-11
  • 打赏
  • 举报
回复
引用 1 楼 zhoujielunzhimi 的回复:
你继承CButton,在CButton的OnPaint中绘制。 还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么
我没想绘制对话款,本来给button 贴png,是放在另外一个函数里的,但是发现窗口一改变就不好使了,以为放在onpaint里会好,结果还是不行,一最小化窗口,png图就没了,但是那个绘制的蓝色框框怎么都不受影响。我折腾了一下午了~~我试试您的方法啊,先谢谢。我新手啊 各种戳~~
sumos 2012-12-11
  • 打赏
  • 举报
回复
你继承CButton,在CButton的OnPaint中绘制。 还有,既然你的对话框都自己绘制了,还要CDialog::OnPaint();做什么

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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