1. 程式人生 > >MFC裡在對話方塊下的Static text控制元件裡畫網格

MFC裡在對話方塊下的Static text控制元件裡畫網格

1.新建一個MFC工程,在資源檢視->Dialog下新建一個對話方塊ID為IDC_DIALOG1,在工具箱裡為該對話方塊新增Static text ,並設定ID為IDC_TEXT,在類嚮導裡新增一個類ControlDlg類繼承於CDIALOGEX;

2.專案->新增類 新增一個Graph類繼承於CStatic,並在裡面實現畫網格程式碼如下:

//標頭檔案 .h

class CGraph : public CStatic
{
DECLARE_DYNAMIC(CGraph)


public:
CGraph();
virtual ~CGraph();


protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
void RefreshGraph(CDC* pDC);


private:
CRect m_rectCtrl;//控制元件矩形區域
COLORREF m_bkColor;// 背景顏色
COLORREF m_gridColor;//網格顏色
COLORREF m_lineColor;//線條顏色
COLORREF m_fontColor;//字型顏色
CRect m_rectDraw;//用於繪製曲線的區域
int m_gapLeft;//左邊留白距離
int m_gapBottom;//下邊留白距離
int m_gapTop; //上邊留白距離
int m_xPointNum;//X軸的點數
int m_yPointNum;//Y軸的點數
double m_xGridSpacing;//網格水平方向間距
double m_yGridSpacing;//網格垂直方向間距
CArray<double, double> m_valueArray;//動態陣列用於儲存點的值(高度)
double m_yPixHeight;//Y軸每個畫素點所代表的高度
double m_yScaleInterval;//Y軸兩個刻度值之間的數值差
double m_tableMax;//表格上限值
double m_tableMin;//表格下限值
CArray<double, double> m_XCor;//X軸刻度的X座標
CArray<double, double> m_YCor;//Y軸刻度的Y座標
int m_refreshRate;//重新整理速度
double m_yTextBoxWidth;//Y軸刻度值的寬度
double m_yTextBoxHeight;//Y軸刻度值的高度


public:
void DrawBackground(CDC* pDc);
// 更新介面
void RefreshLayout();
//繪製座標軸
void DrawAxises(CDC* pDC);
void DrawGrids(CDC* pDC);
// 繪製曲線
void DrawLines(CDC* pDC);
void SetTableMaxAndMin(CArray<double, double>& m_array, double& tMax, double& tMin);
// 尋找動態陣列最大最小值
void FindMaxAndMin(CArray<double, double>& m_array, double& tMax, double& tMin);
// 啟動定時器,開始重新整理畫面
void Start();
void SetRefreshRate(int eTime);
// 新增新值
void AddNewValue(double value);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnSize(UINT nType, int cx, int cy);
// 設定X軸刻度個數
void SetXPointNum(int num);
// 設定Y軸刻度個數
void SetYPointNum(int num);
// 新增一系列值
void AddSeriesNewValue(CArray<double, double>& ptArray);
// 清除所有的值
void ClearAllValue();
// 獲取繪圖區域
CRect GetRectDraw();
};


//////CPP檔案
#include "stdafx.h"
#include "Medea.h"
#include "Graph.h"
// CGraph
IMPLEMENT_DYNAMIC(CGraph, CStatic)
CGraph::CGraph()
{
m_bkColor = RGB(0, 0, 0);
m_lineColor = RGB(0, 0, 255);
m_gridColor = RGB(0, 50, 0);
m_fontColor = RGB(255, 255, 255);
m_gapLeft = 50;
m_gapBottom = 20;
m_gapTop = 20;
m_xPointNum = 50;
m_yPointNum = 10;
m_yTextBoxWidth = 40.0;
m_yTextBoxHeight = 20.0;
}
CGraph::~CGraph()
{
}
BEGIN_MESSAGE_MAP(CGraph, CStatic)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_SIZE()
END_MESSAGE_MAP()

void CGraph::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO:  在此處新增訊息處理程式程式碼
// 不為繪圖訊息呼叫 CStatic::OnPaint()
CDC *pDC = GetDC();
CRect rect;
GetClientRect(&rect);

//建立一個記憶體中的顯示裝置
CDC nDC;
nDC.CreateCompatibleDC(NULL);
//建立一個記憶體中的影象
CBitmap nBitmap;
nBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
//指定記憶體顯示裝置在記憶體中的影象上畫圖
nDC.SelectObject(&nBitmap);
// 重新整理控制元件
RefreshGraph(&nDC);
//將記憶體中畫好的影象直接拷貝到螢幕指定區域上
pDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &nDC, 0, 0, SRCCOPY);
//釋放相關資源
nBitmap.DeleteObject();
nDC.DeleteDC();
ReleaseDC(pDC);
}
void CGraph::RefreshGraph(CDC* pDC)
{
//更新佈局
RefreshLayout();
//繪製背景
DrawBackground(pDC);
//繪製座標軸
DrawAxises(pDC);
//繪製網格
DrawGrids(pDC);
//繪製圖例
//DrawLegend(pDC, m_rectLegend);
////繪製標題
//DrawTile(pDC, m_rectTitle);
//繪製曲線
DrawLines(pDC);
}
void CGraph::DrawBackground(CDC* pDC)
{
pDC->FillSolidRect(&m_rectCtrl, m_bkColor);
}
// 更新介面
void CGraph::RefreshLayout()
{
GetClientRect(&m_rectCtrl);//獲取控制元件區域
m_rectDraw.left = m_rectCtrl.left + m_gapLeft;
m_rectDraw.bottom = m_rectCtrl.bottom - m_gapBottom;
m_rectDraw.right = m_rectCtrl.right;
m_rectDraw.top = m_rectCtrl.top + m_gapTop;
m_xGridSpacing = (double)m_rectDraw.Width() / (double)m_xPointNum;
m_yGridSpacing = (double)m_rectDraw.Height() / (double)m_yPointNum;
SetTableMaxAndMin(m_valueArray, m_tableMax, m_tableMin);
m_yPixHeight = (m_tableMax - m_tableMin) / (double)m_rectDraw.Height();
m_yScaleInterval = (m_tableMax - m_tableMin) / (double)m_yPointNum;
}

void CGraph::DrawAxises(CDC* pDC)
{
if (!pDC->GetSafeHdc()){ return; }
// 繪製X軸
CPen pen(PS_SOLID, 2, RGB(0, 255, 0));
CPen *oldPen = pDC->SelectObject(&pen);
// 下方X軸
pDC->MoveTo(m_rectDraw.left, m_rectDraw.bottom);
pDC->LineTo(m_rectDraw.right, m_rectDraw.bottom);
// 上方X軸
pDC->MoveTo(m_rectDraw.left, m_rectDraw.top);
pDC->LineTo(m_rectDraw.right, m_rectDraw.top);
// 恢復畫筆
//pDC->SelectObject(oldPen);
// 繪製Y軸
// 繪製橫線
pDC->MoveTo(m_rectDraw.left, m_rectDraw.bottom);
pDC->LineTo(m_rectDraw.left, m_rectDraw.top);
// 恢復畫筆
pDC->SelectObject(oldPen);
}
void CGraph::DrawGrids(CDC* pDC)
{
/*if ((!pDC->GetSafeHdc()) || (!this->ShowGrid))
{
return;
}*/
CString txtStr;// 顯示座標值的文字
CFont textFont;// 座標值文字格式
// 座標值文字格式
textFont.CreatePointFont(80, _T("Courier New"), NULL);
// 繪製縱向網格
CPen pen(PS_SOLID, 2, m_gridColor);
CPen *oldPen = pDC->SelectObject(&pen);
for (int i = 1, xi = 0; xi = i*m_xGridSpacing + m_rectDraw.left, xi <= m_rectDraw.right; i++)
{
pDC->MoveTo(xi, m_rectDraw.bottom - 2);
pDC->LineTo(xi, m_rectDraw.top + 2);
// 顯示X座標
//CFont *oldFont = pDC->SelectObject(&textFont);// 設定字型格式
//pDC->SetTextColor(m_fontColor);// 設定字型顏色
//txtStr.Format(_T("%4.1f"), m_tableMin+ i*yScaleInterval);
//pDC->DrawText(txtStr, CRect(xi - m_yTextBoxWidth / 2,
//m_rectDraw.bottom + 1,// +1是為了不擋住X座標軸
//xi + yScaleInterval / 2,
//m_rectDraw.bottom + m_yTextBoxHeight + 1),
//DT_BOTTOM | DT_CENTER);
//pDC->SelectObject(oldFont);
}
// 繪製橫向網格
for (int i = 1, yi = 0; yi = m_rectDraw.bottom - i*m_yGridSpacing, yi>m_rectDraw.top; i++)
{
pDC->MoveTo(m_rectDraw.left, yi);
pDC->LineTo(m_rectDraw.right, yi);
// 顯示Y座標值
CFont *oldFont = pDC->SelectObject(&textFont);// 設定字型格式
pDC->SetTextColor(m_fontColor);// 設定字型顏色
txtStr.Format(_T("%4.1f"), m_tableMin + i*m_yScaleInterval);
pDC->DrawText(txtStr, CRect(m_rectCtrl.left,
yi - m_yTextBoxHeight / 2,
m_rectDraw.left - 1,
yi + m_yTextBoxHeight / 2),
DT_BOTTOM | DT_RIGHT);
if (i==1){
txtStr.Format(_T("%4.1f"), m_tableMin);
pDC->DrawText(txtStr, CRect(m_rectCtrl.left,
m_rectDraw.bottom - m_yTextBoxHeight / 2,
m_rectDraw.left - 1,
m_rectDraw.bottom + m_yTextBoxHeight / 2),
DT_BOTTOM | DT_RIGHT);
}
if (i == m_yPointNum - 1){
txtStr.Format(_T("%4.1f"), m_tableMax);
pDC->DrawText(txtStr, CRect(m_rectCtrl.left,
m_rectDraw.top - m_yTextBoxHeight / 2,
m_rectDraw.left - 1,
m_rectDraw.top + m_yTextBoxHeight / 2),
DT_BOTTOM | DT_RIGHT);
}
pDC->SelectObject(oldFont);
}
// 恢復畫筆
pDC->SelectObject(oldPen);
}
// 繪製曲線
void CGraph::DrawLines(CDC* pDC)
{
// 畫筆
CPen pen(PS_SOLID, 2, m_lineColor);
CPen *oldPen = pDC->SelectObject(&pen);
int vaSize = m_valueArray.GetSize();
//if (vaSize <= xPointNum + 1){
if (vaSize > m_xPointNum + 1)
m_valueArray.RemoveAt(0);
for (int i = 0; i < m_valueArray.GetSize() - 1; i++)
{
int h = m_rectDraw.Height();
int v1 = m_valueArray[i ];
int x1 = i*m_xGridSpacing + m_rectDraw.left;
int y1 = (m_valueArray[i] - m_tableMin) * m_rectDraw.Height() / (m_tableMax - m_tableMin);
y1 = m_rectDraw.bottom - y1;
pDC->MoveTo(x1, y1);
int x2 = (i + 1)*m_xGridSpacing + m_rectDraw.left;
int v2 = m_valueArray[i + 1];

int y2 = (m_valueArray[i + 1] - m_tableMin) * m_rectDraw.Height() / (m_tableMax - m_tableMin);
y2 = m_rectDraw.bottom - y2;
pDC->LineTo(x2, y2);
}
//}
// 恢復畫筆
pDC->SelectObject(oldPen);
//}
}
void CGraph::SetTableMaxAndMin(CArray<double, double>& m_array, double& tMax, double& tMin)
{
double max = 0;
double min = 100;
FindMaxAndMin(m_array, max, min);
if (tMax > max + 1 || tMax < max)
tMax = max;
if (tMin<(min - 1) || tMin>min)
tMin = min;
}
// 尋找動態陣列最大最小值
void CGraph::FindMaxAndMin(CArray<double, double>& m_array, double& tMax, double& tMin)
{
for (int i = 0; i < m_array.GetSize(); i++)
{
tMax = tMax>m_array[i] ? tMax : m_array[i];
tMin = tMin < m_array[i] ? tMin : m_array[i];
}
}
// 啟動定時器,開始重新整理畫面
void CGraph::Start()
{
SetTimer(1, m_refreshRate, NULL);
}
void CGraph::SetRefreshRate(int eTime)
{
m_refreshRate = eTime;
}
// 新增新值
void CGraph::AddNewValue(double value)
{
m_valueArray.Add(value);
}
void CGraph::OnTimer(UINT_PTR nIDEvent)
{
// TODO:  在此新增訊息處理程式程式碼和/或呼叫預設值
this->Invalidate();
CStatic::OnTimer(nIDEvent);
}
void CGraph::OnSize(UINT nType, int cx, int cy)
{
CStatic::OnSize(nType, cx, cy);
// TODO:  在此處新增訊息處理程式程式碼
CRect cr;
//GetClientRect(&cr);
GetClientRect(&cr);
RefreshLayout();
Invalidate();
}
// 設定X軸刻度個數
void CGraph::SetXPointNum(int num)
{
m_xPointNum = num;
}
// 設定Y軸刻度個數
void CGraph::SetYPointNum(int num)
{
m_yPointNum = num;
}
// 新增一系列值
void CGraph::AddSeriesNewValue(CArray<double, double>& ptArray)
{
for (int i = 0; i < ptArray.GetSize(); i++)
{
m_valueArray.Add(ptArray[i]);
}
}
// 清除所有的值
void CGraph::ClearAllValue()
{
m_valueArray.RemoveAll();
}
// 獲取繪圖區域
CRect CGraph::GetRectDraw()
{
return m_rectDraw;
}

2,右鍵Static text 為該控制元件新增CGraph型別的變數m_Graph,(CGraph型別是手動改的!!!)

3.為ControlDlg.cpp里加上OnSize(),在裡面新增::SetWindowPos(m_Graph.GetSafeHwnd(), HWND_BOTTOM, 0, 0, cx, cy, SWP_NOZORDER);

相關推薦

模式對話方塊中“static text控制元件的字型大小改變

原文連結:http://blog.csdn.net/yf210yf/article/details/6955283 在對話方塊標頭檔案新增: CStatic m_static;  CFont   font; 在BOOL CYourDlg::OnInitDialog()中新增 m_static.Subcl

MFC對話方塊Static text控制元件網格

1.新建一個MFC工程,在資源檢視->Dialog下新建一個對話方塊ID為IDC_DIALOG1,在工具箱裡為該對話方塊新增Static text ,並設定ID為IDC_TEXT,在類嚮導裡新增一個類ControlDlg類繼承於CDIALOGEX; 2.專案->

MFC 對話方塊Picture Control(圖片控制元件)中靜態和動態顯示Bmp圖片

        最近有同學問我如何實現MFC基於對話方塊在圖片控制元件中載入圖片?其實使用MFC顯示圖片的方法各種各樣,但是還是有些同學不知道怎樣顯示.以前在《數字影象處理》課程中完成的軟體都是基於單

MFC對話方塊程式EDIT類控制元件的自動換行,垂直滾動條自動下移

1.新建一個Edit Control,將其Multiline屬性設定為True,Auto HScroll屬性設定False,這樣就可以實現每一行填滿後自動換行了。2.再將Vetrical Scroll屬性設定為True,當輸入或顯示超過編輯框的大小後就會出現垂直滾動條

VS2013/MFC程式設計入門之七(對話方塊:建立對話方塊類和新增控制元件變數)

前兩講中為大家講解了如何建立對話方塊資源。建立好對話方塊資源後要做的就是生成對話方塊類了。再宣告下,生成對話方塊類主要包括新建對話方塊類、新增控制元件變數和控制元件的訊息處理函式等。        因為給大家的例程Addition是基於對話方塊的程式,所以程式自動建立了

MFC中設定static text控制元件的背景色、字型、字號和顏色

在實際的應用中,可以用WM_CTLCOLOR 訊息改變mfc中控制元件的顏色,比如現在就來改變一個static text控制元件的 字型、字型大小、字型顏色和背景色。 例如對話方塊的類為CTestDlg. 1. 在對話方塊的類中新增兩個變數. 方法:在classview選項卡中,選擇CTestDlg,右鍵,

MFC 如何設定子對話方塊背景透明而控制元件不透明

想子對話方塊透明,主要是截獲WM_ERASEBKGND訊息不去清空背景或者設定視窗default brush為NULL_BRUSH,另外重要的一點是window style中不能包含WS_CLIPSIBLINGS標記,同時parent window的style不能包含WS_C

MFC 如何給ComboBox拉框控制元件新增item,如何新增順序索引的資料項?

提到了新增item可以用AddString方法,效果如下: 我定義了一個數組: CString strFont[5] = { _T("宋體"),_T("楷體"),_T("仿宋"),_T("黑體"),_T("華文細黑") }; 想把這5個按陣列索引的順序新增到控制元件

VC/MFC對話方塊中建立檢視並在檢視區新增ListCtrl控制元件

自定義的view類用於顯示在對話方塊上 class CGroupMenuView : public CScrollView { protected:  CGroupMenuView(); ……………… ………… };   class CWorkView :

MFC對話方塊新增背景圖片(非picture control控制元件

本文在這裡希望把這個東西的設計說的詳細一些。 在建立一個MFC的對話方塊專案後,可以在資源檢視中新增點陣圖,如不理解可以在百度中搜索mfc新增點陣圖,相信應該很多,這裡就不解釋了。 假設我們載入的點陣圖ID為IDB_BITMAP1 在我們對話方塊的類中的標頭檔案新增如下變

六,關閉視窗X的控制MFC 禁止對話方塊關閉按鈕和Alt+F4

使得選單項無效,以便它不能被選擇,但不變灰使得選單項有效,以便它能夠被選擇,並可從變灰的狀態中恢復出來 獲取視窗選單:       CMenu *pSysMenu = GetSystemMenu(FALSE);      ASSERT(pSysMenu != NULL);使關

MFC對話方塊獲得tab control子對話方塊控制元件的值

1.建立兩個對話方塊程式,用來當做Tab Control控制元件的兩個頁。別忘了把Style改為Child,Border改為None。然後就可以在上面加其他控制元件了。 接著分別為這兩個對話方塊建立兩個類,比如CPage1和CPage2。 然後在對話方塊類標頭檔案中,加入這

VC/MFC如何設定對話方塊static背景顏色

方法一:呼叫CWinApp類的成員函式SetDialogBkColor來實現。 (這個函式已經廢棄) ? 1 void SetDialogBkColor(COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF cl

MFC修改對話方塊控制元件背景顏色

HBRUSH CMyDlg::OnCtlColor(CDC* pDC,CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes o

MFC通過對話方塊視窗控制代碼獲得對話方塊物件指標

MFC在很多的對話方塊操作中,我們經常要用到在一個對話方塊中呼叫另一個對話方塊的函式或變數.可以用如下方法來解決. HWND hWnd=::FindWindow(NULL,_T("視窗名"));      //得到對話方塊的控制代碼C***Dialog* pWnd= (C*

MFC對話方塊呼叫主對話方塊的變數和函式

1、在子對話方塊中定義主對話方塊的物件指標: CSensorSysDlg *parent = (CSensorSysDlg*)GetParent();//CSensorSysDlg是主對話方塊對應的類 2、呼叫 //呼叫變數 parent->i;//i是主對話方塊內int型別的

MFC修改對話方塊的標題以及圖示

一、對話方塊標題欄內容為靜態 直接在對話方塊屬性“General”的“Caption”中修改。 二、對話方塊標題欄內容為動態生成的 在對應對話方塊的初始化函式OnInitDialog()中新增以下程式碼: CString title; title.Format("%d",Id

MFC對話方塊新增圖片背景

在windows開發當中做介面的主要技術之一就是使用MFC,通常我們看到的QQ,360,暴風影音這些漂亮的介面都可以用MFC來實現。今天我們來說一下如何用MFC美化對話方塊,預設情況下,對話方塊的背景如下: 那麼,我們如何將它的背景變成如下介面呢,而且還要保留對話方塊的移動功能,漂亮背

MFC對話方塊資源的複製

在工程中匯入已建好的對話方塊,方法有三: 法一: 1、首先要生成一個*.ogx的檔案。    方法:開啟包含有所要加的對話方塊資源的工程(別的工程)。          在檢視資源(ClassView)中滑鼠右鍵點選所需的對話方塊的類(也可以是所需的類)      

MFC擷取對話方塊指定位置的點陣圖

    //儲存點陣圖     CDC *pDC =  getDC();     CDC memDC;                    // 建立並繫結繪畫DC和Bitmap     CBitmap bitmap;     memDC.CreateCompatible