我在资源视图中添加了对话框资源,该对话框具有两全单选按钮和一个确定、一个取消按钮并利用向导为其添加了.h和.cpp,添加了一个变量m_ht,两个单选按钮为IDC_DAP和IDC_ALL,并为单选按钮添加了鼠标单击消息处理函数:
void CMyDlg::OnBnClickedDap()
     {  
      m_ht=1;
     }
void CMyDlg::OnBnClickedAll()
    {
     m_ht=2;
    }
BOOL CMyDlg:: OnInitDialog()
{
  CDialog::OnInitDialog(); if (m_ht==1)
    {CheckDlgButton(IDC_DAP,1);}
  else 
     {CheckDlgButton(IDC_ALL,1);}
return TRUE;
}
在CMyView.cpp中添加如下函数
void CMyViewView:: OnLButtonDown(UINT nFlags,CPoint point)
{
CView::OnLButtonDown(nFlags,point);
CClientDC dc(this);
dc.SetMapMode(MM_TEXT);
CPoint pos=point;
if(pos.x>=0&&pos.x<=92&&pos.y<=720&&pos.y>=685)
           {
            CMyDlg dlg;
            dlg.m_ht=m_ht;
   if (dlg.DoModal()==IDOK)
             {
              m_ht=dlg.m_ht;
    }
            }
void CMyiew::OnDraw(CDC* pDC)
{
  CRect  rect(0,0,1024,685);
  pDC->FillSolidRect(rect,RGB(0,0,0));
  CClientDC dc(this);  
  CPen pen(PS_SOLID,1,RGB(0,255,0));;
  CPen *poldPen=dc.SelectObject(&pen);
if(m_ht==1)
   {
   for(int i=0;i<9;i++)
       {
y=80+i*70;
         dc.MoveTo(898,y);
dc.LineTo(1024,y);
dc.MoveTo(898,80);
dc.LineTo(898,640);
}
    }
 
if(m_ht==2)
    {
 for(int j=0;j<20;j++)
       {
     x=80+j*30;
     dc.MoveTo(898,x);
              dc.LineTo(1024,x);
     dc.MoveTo(898,80);
              dc.LineTo(898,650);
   }
      }
当我在指定区域单击时对话框出现,而且操作正常,但就是不画线,我感觉是在对话框中的变量在退出对话框时被销毁,在CMyiew中的m_ht与对话框中的m_ht不是同一变量,没办法我在CMyApp中引入全局变量m_hty,在鼠标单击函数中添加
void CMyDlg::OnBnClickedDap()
     {  
      m_ht=1;
      CMyApp *app=(CMyApp*)AfxGetApp();
      m_hty=1;
     }
void CMyDlg::OnBnClickedAll()
    {
     m_ht=2;
      CMyApp *app=(CMyApp*)AfxGetApp();
      m_hty=2;
    }
在void CMyiew::OnDraw(CDC* pDC)的if(m_hty==1)前添加CMyApp *app=(CMyApp*)AfxGetApp();if(m_hty==1)的条件改为
if(m_hty==1)
{
画线1
}
if(m_hty==1)
{
画线2
}
但还不不会画线,如果在if语句前添加m_hty==1则能画线1,说明OnDraw没有问题,请大家帮帮忙,谢谢!

解决方案 »

  1.   

    逻辑上没问题的,可能是你的程序哪里有问题,把m_hty的内存给盖了。导致的m_hty既不是1也不是2.你可以在OnDraw函数里打下Trace看下具体的m_hty的值。
      

  2.   


    void CMyDlg::OnBnClickedDap() 
    {  
    m_ht=1; 
    CMyApp *app=(CMyApp*)AfxGetApp(); 
    m_hty=1; 

    void CMyDlg::OnBnClickedAll() 

        m_ht=2; 
    CMyApp *app=(CMyApp*)AfxGetApp(); 
    m_hty=2; 

    应该是void CMyDlg::OnBnClickedDap() 
    {  
    m_ht=1; 
    CMyApp *app=(CMyApp*)AfxGetApp(); 
    app->m_hty=1;  // 

    void CMyDlg::OnBnClickedAll() 

        m_ht=2; 
    CMyApp *app=(CMyApp*)AfxGetApp(); 
    app->m_hty=2; //
      

  3.   

    trace  dlg.m_ht的值。
    可以把dlg.m_ht 改为int*,dlg.m_ht= &m_ht
      

  4.   

    出现在这吧,这里面m_ht值一直就没有传进来啊,
    CMyDlg:: OnInitDialog() //函数里面的两条语句也是多余的,
    你的赋值在初始化对话框后才创建的,所以一直就没有获取到值。
      

  5.   

    我用Trace看下具体的m_hty的值,结果是“0”,我的原程序同mmilmf的
    void CMyDlg::OnBnClickedDap() 
    {  
        m_ht=1;      CMyApp *app=(CMyApp*)AfxGetApp(); 
        app->m_hty=1;  // 

    void CMyDlg::OnBnClickedAll() 

        m_ht=2; 
        CMyApp *app=(CMyApp*)AfxGetApp(); 
        app->m_hty=2; //

    唉,还不不行
      

  6.   

    CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDlg::IDD, pParent)
    ,m_ht(1)
    {}
    m_ht(1)的初始化在这里已完成了
      

  7.   

    m_ht你是不是跟CheckBox控件做了映射啊?
      

  8.   

    我在按钮单击处理程序改为
    void CMyDlg::OnBnClickedDap()
    {
        m_ht=0;
        CmMyApp *app=(CMyApp*)AfxGetApp(); 
        app->m_hty=m_ht;
    }void CMyDlg::OnBnClickedAll()
    {
        m_ht=1;
        CMyApp *app=(CMyApp*)AfxGetApp(); 
        app->m_hty=m_ht;
    }
    我在void CMyView::OnDraw(CDC* pDC)中添加了TRACE,如下
    CMyApp *app=(CMyApp*)AfxGetApp(); 
    CMyDlg dlg;
    app->m_hty=dlg.m_ht;
       TRACE( "The value of app->m_hty is %d\n", app->m_hty );
       TRACE( "The value of dlg.m_ht is %d\n", dlg.m_ht );运行后显示:The value of app->m_hty is 0
    The value of dlg.m_ht is 0
    我在对话框中选择第二个单选按钮,输出如下
    The value of app->m_hty is 0
    The value of dlg.m_ht is 0
    The value of dlg.m_ht is 1
    The value of dlg.m_ht is 1
    我不明白单选按钮实际上运行正常,但为什么app->m_hty=dlg.m_ht;不能将dlg.m_ht的值“1”赋给app->m_hty,
    运行程序后出现画线1,但选择画线2后却不能出现画线2而仍是画线1
      

  9.   

    变量m_ht是在资源CMyDlg中添加的,我该怎么办
      

  10.   


    你直接在类里添加一个m_ht试试,不要与ID绑定
      

  11.   

    直接在类里添加一个m_ht还是不行
      

  12.   

    以下是我的全部代码,请大家帮忙看看,我实在是没有办法,已忙了几天了,就是解决不了:
    对话框.h
    #pragma once
    #include "ml.h"
    class Mydlg : public CDialog
    {
    DECLARE_DYNAMIC(Mydlg)public:
    Mydlg(CWnd* pParent = NULL);   // 标准构造函数
    virtual ~Mydlg();
    virtual BOOL  OnInitDialog();
    enum { IDD = IDD_Mydlg };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    DECLARE_MESSAGE_MAP()
    public:
    int m_ht;  
    public:
    afx_msg void OnBnClickedAdp();
    public:
    afx_msg void OnBnClickedAll();
    };
    对话框.cpp#include "stdafx.h"#include "Mydlg.h"IMPLEMENT_DYNAMIC(Mydlg, CDialog)BEGIN_MESSAGE_MAP(Mydlg, CDialog)
    ON_BN_CLICKED(IDC_ADP, &Mydlg::OnBnClickedAdp)
    ON_BN_CLICKED(IDC_ALL, &Mydlg::OnBnClickedAll)
    END_MESSAGE_MAP()Mydlg::Mydlg(CWnd* pParent /*=NULL*/)
    : CDialog(Mydlg::IDD, pParent)
    ,m_ht(0)
    {}
    void Mydlg::OnBnClickedAdp()
    {
        m_ht=0;
        CmlApp *app=(CmlApp*)AfxGetApp(); 
        app->m_hty=m_ht;
    }void Mydlg::OnBnClickedAll()
    {

        m_ht=1;
        CmlApp *app=(CmlApp*)AfxGetApp(); 
        app->m_hty=m_ht;
     }
    BOOL Mydlg:: OnInitDialog()
    {
      CDialog::OnInitDialog();    if (m_ht==0)
       {
        CheckDlgButton(IDC_ADP,1);
       }
        else 
       {
        CheckDlgButton(IDC_ALL,1);
       }
    return TRUE;
    }Mydlg::~Mydlg()
    {
    }void Mydlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }
    视图CMyview.cpp
    #pragma once#include "stdafx.h"
    #include "ml.h"
    #include "myView.h"
    #include "Mydlg.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endifIMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
    ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()CMyView::CMyView()
    {
    }CMyView::~CMyView()
    {
    }BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
    { return CView::PreCreateWindow(cs);
    }void CMyView:: OnLButtonDown(UINT nFlags,CPoint point)
    {
    CView::OnLButtonDown(nFlags,point);
    CClientDC dc(this);
    dc.SetMapMode(MM_TEXT);
    CPoint pos=point;
        if(pos.x>=837&&pos.x<=929&&pos.y<=720&&pos.y>=685)
           {
              Mydlg dlg;
              dlg.DoModal();
            }
    void CMyView::OnDraw(CDC* pDC)
    {
      CRect  rect(0,0,1024,685);
      pDC->FillSolidRect(rect,RGB(0,0,0));
      CClientDC dc(this);  
      CPen pen(PS_SOLID,1,RGB(0,255,0));;
      CPen *poldPen=dc.SelectObject(&pen);
     
     CMyDLG dlg;
     CmlApp *app=(CmlApp*)AfxGetApp();               
     dlg.m_ht=app->m_hty;
     if (dlg.DoModal()==IDOK)
        {
         app->m_hty=dlg.m_ht;
         } if(dlg.m_ht==0)
       {
       for(int i=0;i<9;i++)
           {
    y=80+i*70;
            dc.MoveTo(898,y);
    dc.LineTo(1024,y);
    dc.MoveTo(898,80);
    dc.LineTo(898,640);
      }
        }
     
     else
        {
     for(int j=0;j<20;j++)
           {
         x=80+j*30;
         dc.MoveTo(898,x);
                 dc.LineTo(1024,x);
         dc.MoveTo(898,80);
                 dc.LineTo(898,650);
       }
          }}BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    return DoPreparePrinting(pInfo);
    }void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {}void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {

    }#ifdef _DEBUG
    void CMyView::AssertValid() const
    {
    CView::AssertValid();
    }void CMyView::Dump(CDumpContext& dc) const
    {
    CView::Dump(dc);
    }CMyDoc* CMyView::GetDocument() const // 非调试版本是内联的
    {
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CmyDoc)));
    return (CmyDoc*)m_pDocument;
    }
    #endif //_DEBUG由于m_ht初始为0,运行程序后程序只能执行画线1,在对话框中点击单选按钮2后却不能画线2
      

  13.   

    1. CPen pen(PS_SOLID,1,RGB(0,255,0));;(两个分号) 
    2.CMyApp *app=(CMyApp*)AfxGetApp(); 
          m_hty=2;(中文符号) 
    楼主你这几个小问题有没有发现,第一个问题有两个分号,第二个问题有一个中文符号