求CPen的用法

lixling 2004-01-12 11:17:06
需要在界面中画线,使用MFC生成的基于对话框的程序。
把以下代码放到OnInitDialog函数中:

CDC* pDC;
CPen pen1;
pen1.CreatePen(PS_SOLID,2,RGB(0,0,255));
CPen* pPenOld=(CPen*)pDC->SelectObject(&pen1);
pDC->MoveTo(0,0);
pDC->LineTo(10,10);
pen1.DeleteObject();

编译无法通过。感觉是肯定不对,如果能放到OnDraw或者OnPaint里就会好些,但是肯定还有别的毛病。
求教如何解决这个画线的问题。
...全文
457 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixling 2004-01-12
  • 打赏
  • 举报
回复
问题解决,结帖
孟琦的第二个回复是对的。
handsomerun 2004-01-12
  • 打赏
  • 举报
回复
把这些你添加的内容
         CPen pen1;
pen1.CreatePen(PS_SOLID,3,RGB(0,0,255));
CPen* pPenOld=(CPen*)dc.SelectObject(&pen1);
dc.MoveTo(0,0);
dc.LineTo(100,100);
dc.SelectObject(pPenOld);
pen1.DeleteObject();

放在最下面,就是
else
{
CDialog::OnPaint();
}
的下面


jennifergiant 2004-01-12
  • 打赏
  • 举报
回复
void C***Dlg::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);
CDC* pDC;
CPen pen1;
pDC = GetDC();
pen1.CreatePen(PS_SOLID,2,RGB(0,0,255));
// CPen* pPenOld=(CPen*)pDC->SelectObject(&pen1);
pDC->SelectObject(pen1);
pDC->MoveTo(100, 200);
pDC->LineTo(100, 230);
pen1.DeleteObject();
ReleaseDC(pDC);
CDialog::OnPaint();
}
}
lixling 2004-01-12
  • 打赏
  • 举报
回复
编译通过,程序没反应。问题挺弱,我刚入门,大家谅解吧,先把整个OnPaint函数发上来,请各位帮忙修改。
void CTP03Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中
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;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);

CPen pen1;
pen1.CreatePen(PS_SOLID,3,RGB(0,0,255));
CPen* pPenOld=(CPen*)dc.SelectObject(&pen1);
dc.MoveTo(0,0);
dc.LineTo(100,100);
dc.SelectObject(pPenOld);
pen1.DeleteObject();

}
else
{
CDialog::OnPaint();
}
}
jennifergiant 2004-01-12
  • 打赏
  • 举报
回复
要在OnDraw或者OnPaint里面
CDC* pDC;
CPen pen1;
pDC = GetDC();
pen1.CreatePen(PS_SOLID,2,RGB(0,0,255));
pDC->SelectObject(pen1);
pDC->MoveTo(100, 200);
pDC->LineTo(100, 230);
pen1.DeleteObject();
ReleaseDC(pDC);
lixling 2004-01-12
  • 打赏
  • 举报
回复
OK
我去试试
handsomerun 2004-01-12
  • 打赏
  • 举报
回复
画线当然是放到OnDraw或者OnPaint里面啦,
  
还有 最后,要先把pen1选出设备描述表
 再把它删了
 就是要在删除之前
 pDC->SelectObject(pPenOld);
kongyunzhongque 2004-01-12
  • 打赏
  • 举报
回复
你这里的pDC没有指定,不是CPen的问题。一般不会在这里调用的在对话框一般是在OnPaint里

15,979

社区成员

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

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