日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于对话框的绘图

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于对话框的绘图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 對話框的繪圖機制
MFC中對話框的繪圖是由對話框接受系統WM_PAINT消息后,根據消息處理程序來執行相應的操作。可以在類向導中的消息中添加處理程序,亦或是在對話框資源列表中添加處理程序,一般繪圖消息處理程序函數名位OnPaint()。

void SpectrumDlg::OnPaint() {CPaintDC dc(this); // 獲得設備上下文vector<double> Vt = CaculateMatrixR();//程序繪圖所需要的數據(這里是一個風譜的時間序列)COLORREF Color = RGB(0, 100, 0);CBrush Brush(Color);//設置刷的顏色dc.FillRect(&m_RectSample,&Brush)//m_RectSample為對話框初始化時設置的繪圖區域,將該區域填充。CPen aPen(PS_SOLID,2,RGB(255,0,0));//設置鋼筆顏色dc.SelectObject(&aPen);//選擇鋼筆dc.MoveTo(m_RectSample.left, m_RectSample.top);//從某點開始畫int width = m_RectSample.right - m_RectSample.left;int height = m_RectSample.top - m_RectSample.bottom;for (int i = 0; i != Vt.size();++i)dc.LineTo(double(i) / Vt.size() * width + m_RectSample.left, Vt[i] / 10 * height + m_RectSample.bottom / 2);//根據繪圖區域將數據規整化}

最后得到的結果如下圖所示:

雖然很丑。。。但是我們注重的不是邏輯嘛!!

根據對話框不同控件數據的變化,繪圖區域的數據也應該同步更新。如上圖所示,不同風速會對應不同的風譜圖。這就需要將編輯框控件與對話框之間建立聯系,可以為每個控件添加事件處理程序來處理參數發生變化時,對話框圖形的重繪。代碼很簡單:

void SpectrumDlg::OnEnChangePress() {// TODO: 如果該控件是 RICHEDIT 控件,它將不// 發送此通知,除非重寫 CDialogEx::OnInitDialog()// 函數并調用 CRichEditCtrl().SetEventMask(),// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。int Temp = GetDlgItemInt(IDC_PRESS);//IDC_PRESS為該控件的ID,GetDlgItemInt()函數可以獲得指定ID控件的整型數據。V10 = Temp;//V10為要改變的參數InvalidateRect(&m_RectSample);//將m_RectSample區域內重繪UpdateWindow();//更新窗口// TODO: 在此添加控件通知處理程序代碼}

總結

以上是生活随笔為你收集整理的基于对话框的绘图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。