asd57473448 于 2014.01.09 21:11 提问
- 用VS2010.。里MFC编程基于对话框动态绘图的问题
-
主要是3个问题(注意是VS2010!!)
我初学MFC
我想要主要实现的功能是 在对话框里添加背景图 并在背景图上动态根据坐标画线,并且图和线都随着对话框大小的改变对应按比例改变。。
1。在我的绘图过程中 最后一段线 就是从N-1到N段 没有画出来 我这里取的是N=12段 共13个点,只有拖拽或者最大化对话框的时候才出现。。;
2。每当画完(不包括缺失的最后一段)时,会出现一个从原点到N-1点的直线(我本意的线可以从坐标点里看出),并且与我本意的线同时出现;
3。我所画的线不随对话框大小改变而改变,包括最大化 拉伸和压缩。可能是我没搞清楚这些点是在什么坐标系下的,但是貌似要ScreenToClient() 也没用。。这是我最纠结的问题。
4.另外CSDN问答不会加图片。。。那种什么链接格式的添加图片法 不懂哎。。求大神指导,最好有代码例子 或是对我的程序的指导的建议,最好不要对我的代码大动干戈。。。能实现功能就好。
下面是我的代码,中文注释之间的乱码可以无视,应该不影响看代码
这是头文件
// 789Dlg.h : 头文件
//#pragmaonce
#include"activexcontrol1.h"// CMy789Dlg 对?话¡ã框¨°
class CMy789Dlg : public CDialogEx
{
// 构1造¨¬
public:
CMy789Dlg(CWnd* pParent = NULL); // 标À¨º准Á?构1造¨¬函¡¥数ºy
int hua;
// 对?话¡ã框¨°数ºy据Y
enum { IDD = IDD_MY789_DIALOG };protected: virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ì持?
// 实º¦Ì现?
protected:
HICON m_hIcon;// 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP()
public:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);CRect rect; afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnBnClickedButton1();
//afx_msg void InvalidateRect();
afx_msg void OnBnClickedOk();
};下面cpp文件
// 789Dlg.cpp : 实º¦Ì现?文?件t
//#include"stdafx.h"
#include"789.h"
#include"789Dlg.h"
#include"afxdialogex.h"#ifdef _DEBUG
#definenew DEBUG_NEW
#endif// 用®?于®¨²应®|用®?程¨¬序¨°“¡ã关?于®¨²”¡À菜?单Ì£¤项?的Ì? CAboutDlg 对?话¡ã框¨°
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();// 对?话¡ã框¨°数ºy据Y
enum { IDD = IDD_ABOUTBOX };protected: virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ì持?
// 实º¦Ì现?
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()// CMy789Dlg 对?话¡ã框¨°
CMy789Dlg::CMy789Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMy789Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMy789Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
//DDX_Control(pDX, IDC_ACTIVEXCONTROL1, m_aaa);
}BEGIN_MESSAGE_MAP(CMy789Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_ERASEBKGND()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, &CMy789Dlg::OnBnClickedButton1)
ON_BN_CLICKED(IDOK, &CMy789Dlg::OnBnClickedOk)
END_MESSAGE_MAP()// CMy789Dlg 消?息¡é处ä|理¤¨ª程¨¬序¨°
BOOL CMy789Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();// 将?“¡ã关?于®¨²...”¡À菜?单Ì£¤项?添¬¨ª加¨®到Ì?系¦Ì统ª3菜?单Ì£¤中D。¡ê // IDM_ABOUTBOX 必À?须?在¨²系¦Ì统ª3命¨¹令¢?范¤?围¡ì内¨²。¡ê ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设¦¨¨置?此ä?对?话¡ã框¨°的Ì?图ª?标À¨º。¡ê当Ì¡À应®|用®?程¨¬序¨°主¡Â窗ä¡ã口¨²不?是º?对?话¡ã框¨°时º¡À,ê?框¨°架¨¹将?自Á?动¡¥ // 执¡ä行D此ä?操¨´作Á¡Â SetIcon(m_hIcon, TRUE); // 设¦¨¨置?大䨮图ª?标À¨º SetIcon(m_hIcon, FALSE); // 设¦¨¨置?小?图ª?标À¨º // TODO: 在¨²此ä?添¬¨ª加¨®额?外ªa的Ì?初?始º?化¡¥代䨲码? hua=-1; return TRUE; // 除y非¤?将?焦1点Ì?设¦¨¨置?到Ì?控?件t,ê?否¤?则¨°返¤¦Ì回? TRUE
}
void CMy789Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}// 如¨?果?向¨°对?话¡ã框¨°添¬¨ª加¨®最Á?小?化¡¥按ã¡ä钮£¤,ê?则¨°需¨¨要°a下?面?的Ì?代䨲码?
// 来¤¡ä绘?制?该?图ª?标À¨º。¡ê对?于®¨²使º1用®?文?档̦Ì/视º¨®图ª?模¡ê型¨ª的Ì? MFC 应®|用®?程¨¬序¨°,ê?
// 这a将?由®¨¦框¨°架¨¹自Á?动¡¥完ª¨º成¨¦。¡êvoid CMy789Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用®?于®¨²绘?制?的Ì?设¦¨¨备À?上¦?下?文?SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使º1图ª?标À¨º在¨²工¡è作Á¡Â区?矩?形?中D居¨®中D int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘?制?图ª?标À¨º dc.DrawIcon(x, y, m_hIcon); } else { //Invalidate(); //UpdateWindow(); CPaintDC dc(this); // 用®?于®¨²绘?制?的Ì?设¦¨¨备À?上¦?下?文? CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP4); BITMAP bmp; bitmap.GetBitmap(&bmp); CDC dcCompatible; //CDC* pDC; dcCompatible.CreateCompatibleDC(&dc); dcCompatible.SelectObject(&bitmap); //CRect rect; GetClientRect(&rect); //GetUpdateRect(&rect); //pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //return CDialogEx::OnEraseBkgnd(pDC); this->GetClientRect(&rect); CDC *pDC=GetDC();//=pwnd->GetDC(); ScreenToClient(rect); int a[100]={0,10,20,30,40,50,60,70,80,90,100,110,250};//x int b[100]={0,10,20,30,40,50,50,70,80,90,100,110,250};//y int height=rect.Height(); int width=rect.Width(); CPen pen1; CPen *oldPen; pen1.CreatePen(PS_SOLID,2,RGB(192,192,2));//创ä¡ä建¡§对?象¨® oldPen=dc.SelectObject(&pen1);//将?画-笔À¨º选?入¨?设¦¨¨备À?描¨¨述º?表À¨ª,ê?并¡é保À¡ê存ä?旧¨¦的Ì?画-笔À¨º
int i=-1;
for(i=-1;i<=hua;i++) { int x=a[i]; int y=b[i]; int x1=a[i+1]; int y1=b[i+1]; dc.MoveTo(x,y);//定¡§义°?起e点Ì? dc.LineTo(x1,y1);//线?的Ì?终?点Ì? }; pDC->SelectObject(oldPen);//将?以°?前¡ã的Ì?画-笔À¨º选?入¨?设¦¨¨备À?描¨¨述º?表À¨ª''''''*/ Invalidate(); CDialogEx::OnPaint(); }
}
//当Ì¡À用®?户¡ì拖ª?动¡¥最Á?小?化¡¥窗ä¡ã口¨²时º¡À系¦Ì统ª3调Ì¡Â用®?此ä?函¡¥数ºy取¨?得Ì?光a标À¨º
//显?示º?。¡ê
HCURSOR CMy789Dlg::OnQueryDragIcon()
{
returnstatic_cast(m_hIcon);
}BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ìreturn CDialogEx::OnEraseBkgnd(pDC);
}
BOOL CMy789Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì
//CRect rect;
//CBitmap bitmap;
//bitmap.LoadBitmap(IDB_BITMAP3);
//BITMAP bmp;
//bitmap.GetBitmap(&bmp);//// //CDC dcCompatible; ////CDC* pDC; //dcCompatible.CreateCompatibleDC(pDC); // dcCompatible.SelectObject(&bitmap); // //CRect rect; // GetClientRect(&rect); // //GetUpdateRect(&rect); // //pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); // pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //////return CDialogEx::OnEraseBkgnd(pDC); // int a[100];//x // int b[100];//y // int height=rect.Height(); // int width=rect.Width(); // // //GetUpdateRect(&rect); // return (TRUE);
}
void CMy789Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì//CMy789Dlg::OnPaint(); ++hua;
if (hua>11)
{
KillTimer(1);};
InvalidateRect(rect,true);
CDialogEx::OnTimer(nIDEvent);
}void CMy789Dlg::OnBnClickedButton1()
{
SetTimer(1, 1000, NULL);
hua=0;// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
}void CMy789Dlg::OnBnClickedOk()
{
// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码?
CDialogEx::OnOK();
}求大神!!!!!!
-
- cuglifangzheng 2014.01.09 22:30
- 已采纳
你的坐标点写死了还怎么随对话框变化而变化呢?
-
- cuglifangzheng 参见http://blog.csdn.net/awsqsh/article/details/6010252置坐标系。坐标点应该设定为类变量,让其在WM_SIZE消息里进行变化,根据窗口变化的比例进行调整。OnPain进行坐标点的绘制。希望回答对你有帮助。
- 4 年多之前 回复
-
- cuglifangzheng mfc默认的坐标系原点在左上角,x轴由左向右增大,y轴从上到下增大。 如果你要画一个笛卡尔也就是数学上常用的坐标系,那么就需要进行坐标系转换。
- 4 年多之前 回复
-
- asd57473448 那应该如何让这些点随着对话框变化而变化,主要是不知道怎么转化和不知道这些点是什么坐标系的坐标
- 4 年多之前 回复