2 asd57473448 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();
}

求大神!!!!!!

1个回答

cuglifangzheng
cuglifangzheng   2014.01.09 22:30
已采纳

你的坐标点写死了还怎么随对话框变化而变化呢?

cuglifangzheng
cuglifangzheng 参见http://blog.csdn.net/awsqsh/article/details/6010252置坐标系。坐标点应该设定为类变量,让其在WM_SIZE消息里进行变化,根据窗口变化的比例进行调整。OnPain进行坐标点的绘制。希望回答对你有帮助。
大约 4 年之前 回复
cuglifangzheng
cuglifangzheng mfc默认的坐标系原点在左上角,x轴由左向右增大,y轴从上到下增大。 如果你要画一个笛卡尔也就是数学上常用的坐标系,那么就需要进行坐标系转换。
大约 4 年之前 回复
asd57473448
asd57473448 那应该如何让这些点随着对话框变化而变化,主要是不知道怎么转化和不知道这些点是什么坐标系的坐标
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!