小弟 刚学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中有什么不对??到底怎么回事,请大家指导!!!

解决方案 »

  1.   

    调用OnRed和OnBlue中调用Invalidate刷新界面,这样才会触发重新绘制图形。
      

  2.   

    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();
      

  3.   

    哦 对了 还有一点忘了 在书上正确代码中
    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中该怎么改啊??
      

  4.   

    关于这个Invalidate 能给我解释详细点吗??
      

  5.   

    可以使用 UpdateWindow 来触发OnDraw函数进行重画.
      

  6.   

    那这样行吗 代码如下:
    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( );

    我试了试 好想这样不行啊
      

  7.   

    没看到你是在CDocument派生类中响应函数
    你需要获取CView的指针才行
    pView->UpdateWindow(); 还是使用UpdateAllViews函数吧,是CDocument的函数
      

  8.   

    可以
    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); 

      

  9.   

    [Quote=引用 10 楼 tjudwt 的回复:]
    可以
    void CMy1View::OnRed()
    {
    // TODO: Add your command handler code here
    yanse=2;
    Invalidate();}
    哦,这个写错了,没试过用这个,一般都是有UpdateAllView(this);
      

  10.   

    你的yanse=0没有出现在switch里面另外RGB(0,0,0)就是黑色啊还有你的思路有些混乱啊,这些都是很好明白的。
      

  11.   

    还是不是多明白啊 那个Invalidate()函数我用了 放在两个消息处理函数中确实管用,但是UpdateWindow( ); 这个函数怎么用啊 我试了试 放在ONDRAW或者两个消息处理函数都不管用啊