我在资源视图中添加了对话框资源,该对话框具有两全单选按钮和一个确定、一个取消按钮并利用向导为其添加了.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没有问题,请大家帮帮忙,谢谢!
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没有问题,请大家帮帮忙,谢谢!
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; //
}
可以把dlg.m_ht 改为int*,dlg.m_ht= &m_ht
CMyDlg:: OnInitDialog() //函数里面的两条语句也是多余的,
你的赋值在初始化对话框后才创建的,所以一直就没有获取到值。
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; //
}
唉,还不不行
: CDialog(CMyDlg::IDD, pParent)
,m_ht(1)
{}
m_ht(1)的初始化在这里已完成了
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
你直接在类里添加一个m_ht试试,不要与ID绑定
对话框.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
2.CMyApp *app=(CMyApp*)AfxGetApp();
m_hty=2;(中文符号)
楼主你这几个小问题有没有发现,第一个问题有两个分号,第二个问题有一个中文符号