程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> mfc-用VS2010.。裡MFC編程基於對話框動態繪圖的問題

mfc-用VS2010.。裡MFC編程基於對話框動態繪圖的問題

編輯:編程綜合問答
用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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved