菜鸟问题,大家过来拿分吧。

GARY 2009-10-22 10:02:19
小弟是菜鸟初学者,问个简单的问题。
我建立的是MFC程序,智能设备应用程序,VC2005。
基于对话框。
我只是想在对话框出来之后,自动就在屏幕上画个椭圆。
我刚开始是这样写的。
BOOL CtestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

CDC *pDC=new CClientDC(this);
CBrush brushGreen(RGB(0,255,0));
CBrush* pOldBrush=pDC->SelectObject(&brushGreen);
CPen penBlack;
penBlack.CreatePen(PS_SOLID,3,RGB(255,0,0));
CPen* pOldPen=pDC->SelectObject(&penBlack);
CRect rect;
GetClientRect(rect);
rect.DeflateRect(20,20);
pDC->Ellipse(rect);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
brushGreen.DeleteObject();
penBlack.DeleteObject();
delete pDC;
pDC=NULL;

// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回TRUE
}
结果没有反应,我设了个断点。程序走到这的时候,窗口还没有绘制出来。
所以程序中的CDC *pDC=new CClientDC(this);就不会起作用
因为还没有客户区,是这样吗?
然后我写了如下代码,我想在OnPaint()中添加代码
void CtestDlg::OnPaint()
{
CPaintDC dc(this);
CBrush brushGreen(RGB(0,255,0));
CBrush* pOldBrush=dc.SelectObject(&brushGreen);
CPen penBlack;
penBlack.CreatePen(PS_SOLID,3,RGB(255,0,0));
CPen* pOldPen=dc.SelectObject(&penBlack);
CRect rect;
GetClientRect(rect);
rect.DeflateRect(20,20);
dc.Ellipse(rect);
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
brushGreen.DeleteObject();
penBlack.DeleteObject();
}

因为OnPaint函数应该就是绘制窗口的吧?
编译出现错误
error C2509: 'OnPaint' : member function not declared in 'CtestDlg'
然后我去testDlg.h文件加了
private:
void OnPaint();
编译没错误了。但是运行,还是什么反应都没有。
我在这个函数设置了断点,调试运行,发现程序好像都不进入这个函数。为什么?
希望大家指点我一下,首先看我理解的对不对。然后教我一下,怎么才对话框建立之后,
自动在屏幕上就绘制了一个椭圆。当然直线什么的也行,都是一个道理。
...全文
138 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobeiliuyouqi 2010-01-11
  • 打赏
  • 举报
回复
邮箱:lyqgzce@163.com,有问题可以一起讨论,我接触这方面时间也不长。
baobeiliuyouqi 2010-01-11
  • 打赏
  • 举报
回复
我的QQ是273741201,有兴趣的话请加我(注明CSDN),我也在用VS2005,弄智能设备的应用程序。
baobeiliuyouqi 2010-01-11
  • 打赏
  • 举报
回复
在你的头文件声明OnPaint处(void OnPaint() )的前面加上afx_msg,在源文件中的BEGIN_MESSAGE_MAP(CCtrProV_1Dlg, CDialog)和END_MESSAGE_MAP()中找到//}}AFX_MSG_MAP
在后面添加一行:ON_WM_PAINT(),应该就可以了。这是MFC的消息映射机制,你需要改这两个地方。
另外也可以在 ‘类视图’中选中要改的(绘图)那个类,然后在右边下方的属性框中选择 ‘消息’(属性下那排图标的第五个),最后找到WM_ONPAIN添加,后点编辑代码即可输入相应代码进行画图了。
GARY 2009-10-23
  • 打赏
  • 举报
回复
D基本对话框是基类是CDrawDialog什么的?还是?
我建立MFC类向导的时候。
是建立基于CDialog的。
是我不是WINCE下的应用程序,和WINDOWS下的基类不同呢?
GARY 2009-10-23
  • 打赏
  • 举报
回复
D基本对话框是对应的Draw?
我用的是VC2005建立的智能设备应用程序
就是WINCE下的。
没看到能建立什么D基本对话框啊?
GARY 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yangyunchao212 的回复:]
直接创建一个 D基本对话框
在OnPaint()函数中if/else结构的else中添加如下代码即可:
void CDrawEllipseDlg::OnPaint()
{
if (IsIconic())
{
……
}
else
{
  CPaintDC dc(this);
  dc.Ellipse(50, 50, 200, 100);

  CDialog::OnPaint();
}
}

[/Quote]
Q1:什么是“D基本对话框”?
Q2:“CDrawEllipseDlg”要改成我自己的对话框类名称吗?
Q3:我自己的不也是“void CtestDlg::OnPaint()”吗
小弟菜鸟,再给讲讲就结贴。
TalesTen 2009-10-23
  • 打赏
  • 举报
回复
哈哈,接分~
weixiaoshashou 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bancxc 的回复:]
接分
[/Quote]
扔分吧楼主。嘻嘻。
用户 昵称 2009-10-23
  • 打赏
  • 举报
回复
再等待也是4楼的方法,你先试试。
GARY 2009-10-22
  • 打赏
  • 举报
回复
楼上的方法没看懂,继续等待。
yangyunchao212 2009-10-22
  • 打赏
  • 举报
回复
直接创建一个 D基本对话框
在OnPaint()函数中if/else结构的else中添加如下代码即可:
void CDrawEllipseDlg::OnPaint()
{
if (IsIconic())
{
……
}
else
{
CPaintDC dc(this);
dc.Ellipse(50, 50, 200, 100);

CDialog::OnPaint();
}
}
GARY 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
创建一个windows应用程序,在
On_Paint里绘制椭圆
[/Quote]
我在WINCE下,需要用MFC,在MFC下不能实现吗?
wuyq11 2009-10-22
  • 打赏
  • 举报
回复
创建一个windows应用程序,在
On_Paint里绘制椭圆

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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