主要是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();
}
求大神!!!!!!
你的坐標點寫死了還怎麼隨對話框變化而變化呢?