小问题!

dengfei007 2009-08-06 09:31:59
小弟 刚学VC没多久 ,今天学绘图这一部分的时候 我想着创建一个单文档应用程序 在工具栏中添加两个工具栏按钮,一个是显示红色,一个显示蓝色,然后用CPen绘制一个椭圆,这样当我用鼠标左键单击红色按钮的时候就椭圆颜色就变成红色,而单击蓝色按钮的时候就显示蓝色,题目很简单。
我的思路就是如下:
用VC6.0先在AppWizard向导创建一个基于单文档视图的应用程序,然后添加上述工具栏按钮两个。然后在CMY1VIEW(因为我取的工程名字叫1 所以也就是CMY1VIEW)中建立两个变量
public:
int yanse;
COLORREF m_color;
然后在CMY1VIEW的构造函数中对变量yanse进行初始化:
CMy1View::CMy1View()
{
// TODO: add construction code here
yanse=0;

}
然后给两个工具栏按钮添加消息处理函数如下:
void CMy1View::OnRed()
{
// TODO: Add your command handler code here
yanse=2;

}
void CMy1View::OnBlue()
{
// TODO: Add your command handler code here
yanse=1;

}
然后在OnDraw函数中添加代码,因为该练习需要在工具栏选取颜色后实时改变画笔的颜色,这就需要使用到程序流程语句中的多重选择,所以此处用SWITCH CASE语句 详细代码如下:
void CMy1View::OnDraw(CDC* pDC)
{
CMy1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
switch (yanse)
{
case 1:
m_color=RGB(0,0,0);
break;
case 2:
m_color=RGB(0,0,255);
break;
}
CPen newpen(PS_SOLID,3,m_color);
CPen *pOldpen=pDC->SelectObject(&newpen);
pDC->Ellipse(100,100,200,200);
pDC->SelectObject(pOldpen);
}
这就是我的思路 ,问题是现在一运行,它只出现黑色的椭圆 按蓝色工具栏按钮不管用?为什么呢?我看的书上它做的思路是把变量yanse放在了CMY1Doc中了,m_color放在了CMY1VIEW中。给两个工具栏按钮的消息处理函数也放在了CMY1Doc中了,然后在OnDraw函数中基本上没变 无非就是在switch(pDoc->yanse)代替了switch (yanse),这样就可以成功实现预想功能了?
题目很简单,但是我想了两天了 还是想不出我把变量和消息处理函数都放在CMY1VIEW中有什么不对??到底怎么回事,请大家指导!!!
...全文
123 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengfei007 2009-08-08
  • 打赏
  • 举报
回复
还是不是多明白啊 那个Invalidate()函数我用了 放在两个消息处理函数中确实管用,但是UpdateWindow( ); 这个函数怎么用啊 我试了试 放在ONDRAW或者两个消息处理函数都不管用啊

dfkjsdhfks 2009-08-06
  • 打赏
  • 举报
回复
学习。
zngsai 2009-08-06
  • 打赏
  • 举报
回复
你的yanse=0没有出现在switch里面

另外RGB(0,0,0)就是黑色啊

还有你的思路有些混乱啊,这些都是很好明白的。
tjudwt 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tjudwt 的回复:]
可以
void CMy1View::OnRed()
{
// TODO: Add your command handler code here
yanse=2;
Invalidate();}
哦,这个写错了,没试过用这个,一般都是有UpdateAllView(this);
tjudwt 2009-08-06
  • 打赏
  • 举报
回复
可以
void CMy1View::OnRed()
{
// TODO: Add your command handler code here
yanse=2;
Invalidate();
}
或者
void CMy1View::OnDraw(CDC* pDC)
{
CMy1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
UpdateWindow( );

switch (yanse)
{
case 1:
m_color=RGB(0,0,0);
break;
case 2:
m_color=RGB(0,0,255);
break;
}
CPen newpen(PS_SOLID,3,m_color);
CPen *pOldpen=pDC->SelectObject(&newpen);
pDC->Ellipse(100,100,200,200);
pDC->SelectObject(pOldpen);
}
雪影 2009-08-06
  • 打赏
  • 举报
回复
没看到你是在CDocument派生类中响应函数
你需要获取CView的指针才行
pView->UpdateWindow();

还是使用UpdateAllViews函数吧,是CDocument的函数
dengfei007 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mas9815 的回复:]
可以使用 UpdateWindow 来触发OnDraw函数进行重画.

[/Quote]
那这样行吗 代码如下:
void CMY1Doc::OnRED()
{
// TODO: Add your command handler code here
yanse=1;
UpdateWindow( );

}

void CMY1Doc::OnBlue()
{
// TODO: Add your command handler code here
yanse=2;
UpdateWindow( );


}
我试了试 好想这样不行啊
yuhudie203 2009-08-06
  • 打赏
  • 举报
回复
立即重绘,刷新~
mas9815 2009-08-06
  • 打赏
  • 举报
回复
可以使用 UpdateWindow 来触发OnDraw函数进行重画.
dengfei007 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 socoola 的回复:]
调用OnRed和OnBlue中调用Invalidate刷新界面,这样才会触发重新绘制图形。
[/Quote]
关于这个Invalidate 能给我解释详细点吗??
dengfei007 2009-08-06
  • 打赏
  • 举报
回复
哦 对了 还有一点忘了 在书上正确代码中
void CMY1Doc::OnRED()
{
// TODO: Add your command handler code here
yanse=1;
UpdateAllViews(NULL);
}

void CMY1Doc::OnBlue()
{
// TODO: Add your command handler code here
yanse=2;
UpdateAllViews(NULL);

}
多了UpdateAllViews(NULL);难道是因为这个语句的事吗 那要是按我的想法把变量和消息处理函数都放在CMY1VIEW中该怎么改啊??
雪影 2009-08-06
  • 打赏
  • 举报
回复
OnRed或OnBlue之后再调用Invalidate();

void CMy1View::OnRed()
{
// TODO: Add your command handler code here
yanse=2;
Invalidate();

}
void CMy1View::OnBlue()
{
// TODO: Add your command handler code here
yanse=1;
Invalidate();
}
socoola 2009-08-06
  • 打赏
  • 举报
回复
调用OnRed和OnBlue中调用Invalidate刷新界面,这样才会触发重新绘制图形。
dengfei007 2009-08-06
  • 打赏
  • 举报
回复
在线等!!

16,550

社区成员

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

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

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