日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)低成本多通道波形采集顯示方案的軟件實(shí)現(xiàn)方法

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-01-15 14:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

英創(chuàng)ARM9系列嵌入式主板EM9170加上新近推出的數(shù)據(jù)采集擴(kuò)展模塊ETA108,可實(shí)現(xiàn)低成本的多通道波形采集。該方案的硬件平臺見如下文章:《低成本多通道波形采集方案》。本文將從應(yīng)用的角度詳細(xì)介紹ETA108接口的使用方法,并在此基礎(chǔ)之上實(shí)現(xiàn)一個完整的多通道波形采集的圖形界面顯示方案。

該方案采用EM9170嵌入式主板,及擴(kuò)展模塊ETA108,可同時采集8個通道,最高采樣頻率100KHz,AD轉(zhuǎn)換精度12bit。圖形界面在7寸屏上全屏顯示,以波形圖形式同時顯示各個通道AD采樣結(jié)果。用戶可以自由移動觀察波形,并通過鼠標(biāo)指針獲得波形圖中各點(diǎn)詳細(xì)信息。

下圖為ETA108波形采集程序?qū)σ宦氛ê鸵宦啡遣ǖ腁D采樣截圖,采樣頻率為50000Hz。

本文介紹該方案中ETA108模塊參數(shù),驅(qū)動安裝,接口調(diào)用方法,以及使用C++編程,實(shí)現(xiàn)圖形界面顯示的一些程序開發(fā)方法。

1、ETA108模塊參數(shù)

ETA108是為了進(jìn)一步支持EM9170在儀器儀表,數(shù)據(jù)采集領(lǐng)域應(yīng)用,同時也是為了方便客戶使用而推出的一款低成本高性能AD采集模塊。ETA108的主要性能如下:

? 8通道單端輸入或4通道差分輸入

? 單極性輸入量程0~4V或雙極性輸入量程±2V

? 每通道具有獨(dú)立的高阻抗增益放大器(PGA),可實(shí)現(xiàn)各種傳感器之間的直接接口連接,并支持用戶配置通道增益(Gain=1/2/4/8)

? AD轉(zhuǎn)換精度12bit

? AD最高采樣速度100ksps

? 可選擇多種平均操作模式,使輸出AD精度達(dá)到14bit

? 單5V供電

關(guān)于ETA108的詳細(xì)介紹,可閱讀ETA108的手冊:《ETA108數(shù)據(jù)采集模塊使用手冊》。

2、驅(qū)動安裝

復(fù)制ETA108驅(qū)動程序安裝包Emtronix ETA108.cab到EM9170主板NandFlash目錄下。

安裝該文件到NandFlash目錄下。

安裝完成后在NandFlash目錄下會生成驅(qū)動文件ETA108V2.dll。安裝完成之后,斷電重啟不需要重復(fù)安裝。

3、ETA108模塊調(diào)用方法

請參考產(chǎn)品光盤中ETA108的測試?yán)蹋诠こ讨刑砑覧TA108.h和ETA108.cpp文件,并添加對應(yīng)的引用,即可非常方便的使用API控制ETA108模塊。

ETA108驅(qū)動程序提供的接口函數(shù)說明如下:

(1) BOOL ETA108Open( )
功能描述:調(diào)用CreateFile函數(shù),打開ETA108驅(qū)動程序
返回值:=TRUE:打開ETA108成功 = FALSE:打開失敗

(2) BOOL Setup( PADS_CONFIG pADSConfig, PADS_CONFIG pADSConfigOut )
功能描述:設(shè)置AD采集相關(guān)參數(shù),采集通道,采樣長度等
輸入?yún)?shù):pADSConfig 配置參數(shù)結(jié)構(gòu)體指針
輸出參數(shù):pADSConfigOut
返回值:=TRUE:參數(shù)設(shè)置成功 =FALSE:參數(shù)設(shè)置失敗

ADSConfig結(jié)構(gòu)體是ETA108的配置數(shù)據(jù)結(jié)構(gòu)體,包含了采樣率,采樣長度,采樣通道設(shè)置,通道寄存器配置等參數(shù)。其定義如下:

typedef struct
{
DWORD dwSamplingRate;
DWORD dwSamplingLength;
DWORD dwSamplingChannel;
LPVOID lpContrlWord;
DWORD dwContrlWordLength;
} ADS_CONFIG, *PADS_CONFIG;

ADS_CONFIG結(jié)構(gòu)體即可用為函數(shù)的輸入?yún)⒖?,也可作為輸出參?shù)使用,其結(jié)構(gòu)體成員含義說明如下:

成員 輸入?yún)?shù)定義 輸出參數(shù)定義
dwSamplingRate 設(shè)置每個AD通道的采樣率 返回總的采樣率(=每通道采樣率*采樣通道數(shù))
dwSamplingLength 設(shè)置每個AD通道的采樣長度
>0:單次采樣 =0:連續(xù)采樣
返回總的采樣長度(=每通道采長度*采樣通道數(shù))
dwSamplingChannel* 設(shè)置需要采樣的通道 返回采樣的通道數(shù)
lpContrlWord 指向AD通道配置的buffer,此參數(shù)用于設(shè)置ETA108的
寄存器,lpContrlWord =NULL時,系統(tǒng)使用默認(rèn)配置
dwContrlWordLength lpContrlWord 指向buffer的長度

*dwSamplingChannel的低8bit(bit0~bit7)依次對應(yīng)AD通道0~通道7,如果要采集某個通道的數(shù)據(jù),需要將其對應(yīng)的位置為1。比如要采集通道0、通道1和通道7的數(shù)據(jù),則應(yīng)設(shè)置dwSamplingChannel=0x83。

(3) BOOL Start( )
功能描述:啟動AD采集
返回值:=TRUE 開始AD采集 =FALSE 啟動AD采集

(4) BOOL WaitDataReady( DWORD dwTimeOut )
功能描述:等待AD采集完成
輸入?yún)?shù):dwTimeOut 等待超時時間(ms),設(shè)置dwTimeOut=0時,驅(qū)動程序?qū)⒆詣佑嬎阋粋€合適的等待時間。連續(xù)采樣模式下,此函數(shù)大約250ms返回一次
返回值:=TRUE AD采集完成,接下來可讀取采集數(shù)據(jù) =FALSE 等待超時,AD采集存在錯誤

(5) DWORD Read( LPVOID pBuf, DWORD dwReadLength )
功能描述:讀取采集數(shù)據(jù)
輸入?yún)?shù):pBuf 用于存放數(shù)據(jù)的buffer dwReadLength 要讀取的數(shù)據(jù)個數(shù)(以字節(jié)計數(shù))即采樣長度×采樣通道數(shù)×sizeof(UINT32)
返回值:>0 實(shí)際讀取的字節(jié)數(shù) =0 無采集數(shù)據(jù) =-1 函數(shù)執(zhí)行失敗

(6) BOOL Stop( )
功能描述:中止當(dāng)前AD采集。
返回值:=TRUE 函數(shù)執(zhí)行成功 =FALSE 函數(shù)執(zhí)行失敗

(7) void ETA108Close ( )
功能描述:關(guān)閉ETA108,釋放相關(guān)資源

4、采樣結(jié)果

使用Read函數(shù),傳入32bit數(shù)組指針。該數(shù)組長度為ADSConfigOut. dwSamplingChannel,即采樣長度×采樣通道數(shù)。獲得的采樣數(shù)據(jù)在數(shù)組中按各通道依次排列。

例如:pBuf為數(shù)組指針,采樣通道為AD3和AD5,采樣長度為5000,那么pBuf長度為10000,即5000*2*sizeof(UINT32)字節(jié),其中AD3的5000長度數(shù)據(jù)依次放在pBuf[0]到pBuf[4999],AD5的5000長度數(shù)據(jù)依次放在pBuf[5000]到pBuf[9999]。

數(shù)組中每一位32bit數(shù)據(jù)具體定義如下:

其中第0位是單端/差分標(biāo)識位,第1-3位是通道地址位,第4、5位平均模式下增加的2位分辨率,第6-17為12bit的AD數(shù)據(jù)。

例如:獲得pBuf中第n位的AD數(shù)據(jù)值v,即v = pBuf[n]>>6。

理想情況下,輸入電壓與AD輸出的12bit數(shù)據(jù)定義如下:

描述 模擬量輸入 二進(jìn)制數(shù)字輸出 十六進(jìn)制數(shù)字輸出
滿量程范圍 V?REF?
最小分辨率
(LSB)
V?REF/4096?
滿量程 V?REF-1LSB 1111 1111 1111 FFFF
1/2量程 V?REF/2 1000 0000 0000 8000
1/2量程-1LSB V?REF/2-1LSB 0111 1111 1111 7FFF
0V 0000 0000 0000 0000

5、連續(xù)采樣

設(shè)置dwSamplingLength=0時,ETA108工作在連續(xù)采樣模式。在連續(xù)采樣模式下,驅(qū)動程序連續(xù)不斷的進(jìn)行數(shù)據(jù)采集,并大約每隔250ms通知一次應(yīng)用程序,以便應(yīng)用程序可將數(shù)據(jù)從驅(qū)動緩存中讀出。應(yīng)用程序可從Setup函數(shù)的輸出參數(shù):ADS_CONFIG結(jié)構(gòu)體的dwSamplingLength成員,得到每次可以讀取的數(shù)據(jù)總長度。

6、波形采集程序說明

ETA108波形采集例程實(shí)現(xiàn)了單次采樣的操作,并將采樣的波形繪制成曲線,顯示在界面上。

(1)在對話框初始化函數(shù)OnInitDialog中初始各個參數(shù)和界面設(shè)置,然后打開ETA108設(shè)備。

// 加載驅(qū)動
if (!ETA108Open())
{
AfxMessageBox(L'打開設(shè)備失敗');
}

(2)在“采集”按鈕的響應(yīng)函數(shù)中,根據(jù)界面中選擇的采樣頻率,采樣長度,采樣通道,將參數(shù)設(shè)置到配制結(jié)構(gòu)體ADSConfig中,執(zhí)行Setup函數(shù)設(shè)置參數(shù)。

ADS_CONFIG adsConfig; // 采樣參數(shù)設(shè)置
ADS_CONFIG adsConfigOut; // 返回采樣參數(shù)
adsConfig.dwSamplingRate = m_dwSamplingRate;
adsConfig.dwSamplingLength = m_dwSamplingLength;
adsConfig.dwSamplingChannel = m_dwSamplingChannel;

ret = Setup(&adsConfig,&adsConfigOut);
if (!ret)
{
AfxMessageBox(L'參數(shù)設(shè)置失敗');
return;
}

(3)根據(jù)采樣長度申請一段數(shù)組存儲AD數(shù)據(jù)。


UINT32* pBuf; // 接收區(qū)指針
if(pBuf != NULL)
{
delete [] pBuf;
pBuf = NULL;
}
pBuf = new UINT32[adsConfigOut.dwSamplingLength];
if( pBuf == NULL )
{
AfxMessageBox(L'創(chuàng)建BUFFER失敗');
return;
}

(4)執(zhí)行Start函數(shù)開始采集。


ret = Start();
if (!ret)
{
AfxMessageBox(L'執(zhí)行失敗');
return;
}

(5)執(zhí)行等待函數(shù)WaitDataReady等待ETA108采樣完成。


ret = WaitDataReady(0);

(6)在等待完成后執(zhí)行Read函數(shù)讀出AD采樣結(jié)果。


DWORD dwNumberOfBytesRead;
dwNumberOfBytesRead = Read( pBuf, adsConfigOut.dwSamplingLength*sizeof(UINT32));
if (dwNumberOfBytesRead == -1)
{
AfxMessageBox(L'讀取失敗');
return;
}

(7)處理BUF內(nèi)的數(shù)據(jù),然后根據(jù)實(shí)際需要將數(shù)據(jù)存放數(shù)據(jù)庫,或是曲線形式顯示在界面上。例程中根據(jù)采樣長度設(shè)置滾動條,并執(zhí)行繪制曲線函數(shù)DrawCurve。

(8)程序關(guān)閉函數(shù)中,釋放資源,關(guān)閉ETA108。


ETA108Close();

7、界面設(shè)計

本波形采集程序使用MFC的對話框程序,繪圖部分使用的GDI函數(shù)。程序界面對應(yīng)7寸屏,界面大小為800×480。

(1)全屏顯示,隱藏WINCE系統(tǒng)工具欄,設(shè)置對話框大小為800×480,然后在對話框初始函數(shù)中添加代碼

方案一:

1.然后使用API函數(shù)獲得工具欄窗口句柄。
HWND hWnd = ::FindWindow(L'HHTaskBar', NULL);

2.重新設(shè)置,隱藏窗口。
::ShowWindow(hWnd, SW_MINIMIZE);

這個方法在關(guān)閉程序后工具欄不會恢復(fù),并且每次重啟后,工具欄會恢復(fù)。如果設(shè)置程序為自啟動,希望在系統(tǒng)啟動到打開程序期間不會讓用戶看到彈出的工具欄,可以使用方案二。

方案二:

1.設(shè)置工具欄自動隱藏,并設(shè)置工具欄不會總在最上方,該操作可以右鍵工具欄->屬性,進(jìn)行設(shè)置。

代碼實(shí)現(xiàn)為修改注冊表,然后通知工具欄更新。

/*BOOL bAutoHide = TRUE;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L'Software\Microsoft\Shell\AutoHide', 0, KEY_ALL_ACCESS, &hkey);
if(lRet != ERROR_SUCCESS) {
lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, L'Software\Microsoft\Shell\AutoHide', 0, NULL, 0, KEY_ALL_ACCESS,
NULL, &hkey, &dw);
}
if (lRet == ERROR_SUCCESS) {
RegSetValueEx(hkey, L'', 0, REG_DWORD, (LPBYTE)&bAutoHide, sizeof(DWORD));
RegCloseKey(hkey);
}*/
BOOL bOnTop = FALSE;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L'Software\Microsoft\Shell\OnTop', 0, KEY_ALL_ACCESS, &hkey);
if(lRet != ERROR_SUCCESS) {
lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, L'Software\Microsoft\Shell\OnTop', 0, NULL, 0, KEY_ALL_ACCESS,
NULL, &hkey, &dw);
}
if (lRet == ERROR_SUCCESS) {
RegSetValueEx(hkey, L'', 0, REG_DWORD, (LPBYTE)&bOnTop, sizeof(DWORD));
RegCloseKey(hkey);
}
::PostMessage(hWnd, WM_WININICHANGE, 0, 5000);

(2)程序背景設(shè)計

MFC自帶的邊框和標(biāo)題欄顏色比較單調(diào),另外其他控件也過于樸實(shí)。所以例程里將窗體的Border屬性設(shè)置為None,然后以圖片背景的形式設(shè)計程序的標(biāo)題欄,及其他控件的背景。

使用繪圖軟件,如Photoshop根據(jù)實(shí)際應(yīng)用狀況,制作一副800×480的界面圖。

根據(jù)界面圖調(diào)整各個控件的位置,MFC的界面設(shè)計如下。

將背景圖片添加到資源文件中,然后新建背景畫刷,修改對話框的OnCtlColor函數(shù),在重刷對話框的時候,返回背景畫刷。

Brush brBk;
BOOL CETA108_TESTDlg::OnInitDialog()
{

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP_BK);
brBk.CreatePatternBrush(&bmp);
bmp.DeleteObject();

}

HBRUSH CETA108_TESTDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (pWnd == this)
{
return brBk;
}

}

(3)自定義按鈕的實(shí)現(xiàn)

靜態(tài)控件可以都放在背景圖片中,按鈕需要另外制作。

1、同樣在Photoshop中設(shè)計好按鈕各個狀態(tài)的圖片。這里有兩個按鈕,一個是“開始采樣”按鈕,一個是“退出”按鈕。
其中“開始采樣”按鈕設(shè)計3個狀態(tài)。

普通狀態(tài) 高亮狀態(tài) 按下狀態(tài)

“退出”按鈕設(shè)計2個狀態(tài)。

?
普通狀態(tài) 高亮狀態(tài)

將這些圖片添加到資源中。

2、添加一個基于MFC普通按鈕CButton的新類CMyButton。

在對話框界面中右鍵->添加類,選擇基類為CButton,添加一個新類CMyButton。

// 給這個類添加儲存各個狀態(tài)位圖的CBitmap成員
CBitmap m_bmpBtnnormal; // 普通
CBitmap m_bmpBtnon; // 高亮
CBitmap m_bmpBtndown; // 按下
// 添加一個成員記錄按鍵是否處于鼠標(biāo)位置(高亮狀態(tài))
BOOL m_bTracking;

3、在對話框中添加自定義按鈕,設(shè)置他們?yōu)镃MyButton。

CMyButton m_BtnBegin;
CMyButton m_BtnExit;

4、給自定義按鈕添加消息響應(yīng)函數(shù)。

如果按鈕要實(shí)現(xiàn)鼠標(biāo)移動上去顯示高亮的效果,需要給CMyButton類添加消息響應(yīng)。如果鼠標(biāo)移動到按鍵上,則設(shè)置m_bTracking = TRUE;當(dāng)鼠標(biāo)離開,則設(shè)置m_bTracking = FALSE;

Wince不同于Windows,CButton不能添加WM_MOUSEHOVER和WM_MOUSELEAVE消息,只能設(shè)置鼠標(biāo)移動消息響應(yīng)函數(shù)。

頭文件添加
DECLARE_MESSAGE_MAP()
afx_msg void OnMouseMove(UINT nFlags, CPoint point);

cpp文件添加
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_MOUSEMOVE() // 必須在按鈕上移動才有消息
// ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover) // wince不行
// ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
if (!m_bTracking)
{
m_bTracking = TRUE;
Invalidate();
}
// CButton::OnMouseMove(nFlags, point);
}

按鈕的鼠標(biāo)移動消息是當(dāng)鼠標(biāo)在按鈕上移動時才響應(yīng),所以在響應(yīng)函數(shù)里直接設(shè)置m_bTracking = TRUE;而鼠標(biāo)移開的消息只能在對話框的鼠標(biāo)移動消息函數(shù)中來通知。

給CMyButton添加一個方法:
public:
void MouseLeave();
void CMyButton::MouseLeave() // WINCE控件響應(yīng)不到MOUSE事件,只好DIALOG來通知了
{
if (m_bTracking)
{
m_bTracking = FALSE;
Invalidate();
}
}

對話框的鼠標(biāo)移動消息里面調(diào)用自定義按鈕的MouseLeave方法:
void CETA108_TESTDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//加按鈕處理
m_BtnBegin.MouseLeave();
m_BtnExit.MouseLeave();

}

5、添加CMyButton類的初始化函數(shù),在初始化函數(shù)中重新加載控件,并加載按鈕圖片。

BOOL CMyButton::InitButton(CDialog* pParent, UINT nCtlID, UINT nID1, UINT nID2, UINT nID3) // 在OnInitDialog()中初始化按鈕上使用
{
CWnd *pWnd = pParent->GetDlgItem(nCtlID); // 取得控件的指針
if (pWnd)
{
pWnd->GetWindowRect(&m_rect); // 返回指定窗口的邊框矩形的尺寸(屏幕坐標(biāo))
pParent->ScreenToClient(&m_rect); // 以用戶坐標(biāo)替代屏幕坐標(biāo)

CString szCaption;
pWnd->GetWindowText(szCaption); // 獲取控件上已賦的文本
DWORD dwStyle= pWnd->GetStyle(); // 獲取控件原有的風(fēng)格
pWnd->DestroyWindow(); // 銷毀控件
Create(szCaption, dwStyle|BS_OWNERDRAW,m_rect, pParent, nCtlID); // 在控件的基礎(chǔ)上創(chuàng)建一個新控件
// 加載圖片
m_bmpBtnnormal.LoadBitmap(nID1);
m_bmpBtnon.LoadBitmap(nID2);
m_bmpBtndown.LoadBitmap(nID3);
return TRUE;
}
else
{
return FALSE;
}
}

在對話框的初始化函數(shù)中調(diào)用自定義按鈕初始函數(shù),傳入對話框指針和按鈕圖片資源ID。

BOOL CETA108_TESTDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 設(shè)置此對話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動
// 執(zhí)行此操作
SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)
SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)

// 自定義Button
m_BtnBegin.InitButton(this, IDC_BUTTON1, IDB_BITMAP_BTNNORMAL, IDB_BITMAP_BTNON, IDB_BITMAP_BTNDOWN);
m_BtnExit.InitButton(this, IDC_BUTTON2, IDB_BITMAP_BTN_EXIT_NORMAL, IDB_BITMAP_BTN_EXIT_ON, IDB_BITMAP_BTN_EXIT_NORMAL);

return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回TRUE
}

6、在CMyButton的析構(gòu)函數(shù)中釋放圖片資源。

CMyButton::~CMyButton()
{
// 釋放個圖片資源
if(m_bmpBtnnormal.GetSafeHandle() != NULL)
{
m_bmpBtnnormal.DeleteObject();
}
if(m_bmpBtnon.GetSafeHandle() != NULL)
{
m_bmpBtnon.DeleteObject();
}
if(m_bmpBtndown.GetSafeHandle() != NULL)
{
m_bmpBtndown.DeleteObject();
}
}

7、重寫CMyButton的DrawItem方法,實(shí)現(xiàn)自定義按鈕的畫圖。

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
BOOL bSelected = FALSE;
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
bSelected = TRUE;
}
else
{
bSelected = FALSE;
}
CDC DC;
DC.Attach(lpDrawItemStruct->hDC);
CDC dcMem;
dcMem.CreateCompatibleDC(&DC);
CBitmap* pOldBmp = NULL;
CRect rcItem(lpDrawItemStruct->rcItem);
BITMAP bp;
if (bSelected) // 按下鼠標(biāo)時的狀態(tài)
{
pOldBmp = dcMem.SelectObject(&m_bmpBtndown);
m_bmpBtndown.GetBitmap(&bp);
DC.BitBlt(0,0,bp.bmWidth, bp.bmHeight,&dcMem,0,0,SRCCOPY);
}
else if (m_bTracking) // 鼠標(biāo)置于按鈕上,但未按下
{
pOldBmp = dcMem.SelectObject(&m_bmpBtnon);
m_bmpBtnon.GetBitmap(&bp);
DC.BitBlt(0,0,bp.bmWidth, bp.bmHeight,&dcMem,0,0,SRCCOPY);
}
else // 鼠標(biāo)未置于按鈕上時的常態(tài)
{
pOldBmp = dcMem.SelectObject(&m_bmpBtnnormal);
m_bmpBtnnormal.GetBitmap(&bp);
DC.BitBlt(0,0,bp.bmWidth,bp.bmHeight,&dcMem,0,0,SRCCOPY);
}
dcMem.SelectObject(pOldBmp);
DC.Detach();
}

8、修改對話框的OnCtlColor函數(shù)。

對話框重畫控件前會先用畫刷重刷繪圖區(qū)域。默認(rèn)的畫刷顏色是MFC底色灰色,如不修改,會有比較明顯的閃爍情況,這里稍作處理,在自定義按鈕重刷時使用空畫刷。


HBRUSH CETA108_TESTDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (pWnd == this)
{
return brBk;
}
else
{
int ID = pWnd->GetDlgCtrlID();
if (( ID == IDC_BUTTON1)||(ID == IDC_BUTTON2))
{
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}

其他自定義控件的實(shí)現(xiàn)方法與按鈕類似,根據(jù)需要,可以實(shí)現(xiàn)自己的ComboBox,ScrollBar,Edit等。

(4)使用GDI畫波形曲線圖

實(shí)際應(yīng)用可以根據(jù)程序需求,使用GDI函數(shù)進(jìn)行曲線界面繪制,為了防止界面閃爍,可以先把去曲線圖繪制在內(nèi)存DC中,最后在調(diào)用BitBlt繪制到屏幕上。

1、.對話框初始化函數(shù)中建立內(nèi)存位圖。

// 圖片位置,大小
#define CURVE_BMP_X 42
#define CURVE_BMP_Y 72
#define CURVE_BMP_W 520
#define CURVE_BMP_H 320 // 340減去scrollbar高度
CDC m_dcMem;
CBitmap m_bitmap
BOOL CETA108_TESTDlg::OnInitDialog()
{

CDC* pDC = GetDC();
m_dcMem.CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC,CURVE_BMP_W,CURVE_BMP_H);
m_dcMem.SelectObject(&m_bitmap);

ReleaseDC(pDC);

}

2、在畫波形圖函數(shù)DrawCurve中在內(nèi)存DC即 m_dcMem中畫圖,最后BitBlt到屏幕。

void CETA108_TESTDlg::DrawCurve()
{
int i, ii;

CBrush brush;

brush.CreateSolidBrush(COLOR_BK);
m_dcMem.FillRect(m_rect,&brush);
brush.DeleteObject();

// m_dcMem中繪制坐標(biāo)軸,坐標(biāo)線,坐標(biāo)值

// 從pBuf內(nèi)讀出AD數(shù)據(jù),在m_dcMem中繪制成曲線

// m_dcMem中繪制一個圖例框

CDC *pDC=GetDC();
pDC->BitBlt(CURVE_BMP_X, CURVE_BMP_Y, CURVE_BMP_W, CURVE_BMP_H, &m_dcMem, 0, 0, SRCCOPY);
ReleaseDC(pDC);
return;
}

3、重寫對話框OnPaint函數(shù)。

void CETA108_TESTDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
dc.BitBlt(CURVE_BMP_X, CURVE_BMP_Y, CURVE_BMP_W, CURVE_BMP_H, &m_dcMem, 0, 0, SRCCOPY);
// Do not call CDialog::OnPaint() for painting messages
}

4、注意事項

GDI對象應(yīng)當(dāng)做到Create和Delete一一對應(yīng),Get和Release一一對應(yīng),避免內(nèi)存泄漏。

當(dāng)SelectObject時最好記錄函數(shù)返回的原對象值,然后在繪圖完畢后還原。

在DrawText繪制文字前應(yīng)當(dāng)先設(shè)置文字背景為透明,即SetBkMode(TRANSPARENT) 。

(5)浮動信息框?qū)崿F(xiàn)

當(dāng)鼠標(biāo)在曲線圖上移動到坐標(biāo)點(diǎn)附件時,顯示一個浮動的信息框。

可以再建一個內(nèi)存DC,設(shè)置它的位圖大小為浮動信息框所占大小。當(dāng)需要畫信息框時,先將屏幕DC的位圖BitBlt到信息框DC內(nèi),并記錄相應(yīng)的坐標(biāo)點(diǎn)。

當(dāng)信息框移動或改變后,先將信息框DC的備份內(nèi)容還原到屏幕DC中,備份新的位置的位圖,然后記錄新坐標(biāo)點(diǎn),再在新的位置繪制信息框。

為了避免快速度移動的重畫導(dǎo)致屏幕閃爍,可以先在一個另外的內(nèi)存DC中畫好,再BitBlt到屏幕上。

詳細(xì)完整的代碼請參考英創(chuàng)產(chǎn)品光盤中的ETA108波形采集顯示例程。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3707

    瀏覽量

    94355
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6107

    瀏覽量

    37175
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    瑞芯微RK3506實(shí)現(xiàn)64通道高速ADC并行采集,QT二次開發(fā)SDK,基于觸覺智能方案

    本文基于觸覺智能RK3506核心板/開發(fā)板,介紹RK3506+64通道高速ADC采集+QT顯示方案,具備低成本、高實(shí)時、低抖動特性。
    的頭像 發(fā)表于 04-21 10:17 ?150次閱讀
    瑞芯微RK3506<b class='flag-5'>實(shí)現(xiàn)</b>64<b class='flag-5'>通道</b>高速ADC并行<b class='flag-5'>采集</b>,QT二次開發(fā)SDK,基于觸覺智能<b class='flag-5'>方案</b>

    MAX17014:用于LCD TV的低成本多輸出電源解決方案

    MAX17014:用于LCD TV的低成本多輸出電源解決方案 在電子設(shè)備飛速發(fā)展的今天,LCD TV的應(yīng)用越來越廣泛。而對于LCD TV的正常運(yùn)行,穩(wěn)定且高效的電源供應(yīng)至關(guān)重要。MAX17014作為
    的頭像 發(fā)表于 03-17 14:15 ?185次閱讀

    探索MAX8728:為LCD顯示器和電視量身打造的低成本多輸出電源

    探索MAX8728:為LCD顯示器和電視量身打造的低成本多輸出電源 在電子設(shè)備日新月異的今天,LCD顯示器和電視的性能不斷提升,對電源的要求也越發(fā)嚴(yán)苛。MAX8728作為一款專為TFT LCD面板
    的頭像 發(fā)表于 03-17 13:35 ?176次閱讀

    Pico示波器如何實(shí)現(xiàn)通道同步采集

    一般情況下,同一臺示波器的多通道間可以通過軟件上的簡單控制來實(shí)現(xiàn)“同步”采集,但多臺示波器多通道間的“同步”
    發(fā)表于 03-17 11:28

    MAX1772:低成本多化學(xué)電池充電器的理想之選

    MAX1772:低成本多化學(xué)電池充電器的理想之選 在電子設(shè)備的電池充電領(lǐng)域,一款高效、多功能且低成本的充電器控制芯片往往能為產(chǎn)品帶來顯著優(yōu)勢。今天,我們就來深入了解一下MAXIM公司的MAX1772
    的頭像 發(fā)表于 02-26 11:10 ?332次閱讀

    OBOO鷗柏丨國產(chǎn)信創(chuàng)顯示屏電容觸控廣告信息大屏展示終端發(fā)展趨勢

    信息技術(shù)應(yīng)用創(chuàng)新(信創(chuàng))產(chǎn)業(yè)蓬勃發(fā)展的今天,顯示終端作為人機(jī)交互的核心窗口,其自主化、安全性與智能化水平至關(guān)重要。一款集成了國產(chǎn)化芯片與系統(tǒng)的43英寸電容觸控信創(chuàng)
    的頭像 發(fā)表于 01-29 13:31 ?685次閱讀
    OBOO鷗柏丨國產(chǎn)信<b class='flag-5'>創(chuàng)</b><b class='flag-5'>顯示</b>屏電容觸控廣告<b class='flag-5'>信息</b>大屏展示終端發(fā)展趨勢

    64通道+166μs采樣!觸覺智能RK3506+OneOS低成本實(shí)時ADC采集方案

    本文基于觸覺智能RK3506核心板/開發(fā)板,介紹RK3506+OneOS低成本實(shí)時ADC采集方案。電網(wǎng)ADC采集隨著智能電網(wǎng)建設(shè)的加速推進(jìn),電力系統(tǒng)對數(shù)據(jù)
    的頭像 發(fā)表于 01-27 08:00 ?525次閱讀
    64<b class='flag-5'>通道</b>+166μs采樣!觸覺智能RK3506+OneOS<b class='flag-5'>低成本</b>實(shí)時ADC<b class='flag-5'>采集</b><b class='flag-5'>方案</b>

    龍芯中科助力2025教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦

    2025年11月13日-15日,由中國教育技術(shù)協(xié)會主辦、浙江大學(xué)與中國教育技術(shù)協(xié)會網(wǎng)絡(luò)安全專業(yè)委員會聯(lián)合承辦,中國電子工業(yè)標(biāo)準(zhǔn)化技術(shù)協(xié)會信息技術(shù)應(yīng)用創(chuàng)新工作委員會、浙江高校信
    的頭像 發(fā)表于 11-21 16:23 ?940次閱讀

    FZH16 固定花樣 6 通道LED流星雨顯示效果驅(qū)動IC

    是固定花樣 6 通道LED流星雨顯示效果驅(qū)動IC。本產(chǎn)品內(nèi)部自帶振蕩器,PWM輸出進(jìn)行灰度 漸變。上電復(fù)位后,輸出PWM波形,進(jìn)行 6 通道的LED依次循環(huán)控制,
    發(fā)表于 11-14 09:34

    MEMS組合導(dǎo)航如何實(shí)現(xiàn)低成本?

    低成本,同時保障核心性能的呢? 關(guān)鍵轉(zhuǎn)變:從“硬件堆料”到“算法賦能” 傳統(tǒng)方案依賴于本身價格極高的慣性器件來保證性能。而ER-GNSS/MINS-05的思路是: · 采用經(jīng)過市場驗證的低成本MEMS傳感器作為基礎(chǔ)。 · 通過
    的頭像 發(fā)表于 10-23 15:30 ?543次閱讀
    MEMS組合導(dǎo)航如何<b class='flag-5'>實(shí)現(xiàn)</b>超<b class='flag-5'>低成本</b>?

    易華錄入選國家級信息技術(shù)應(yīng)用創(chuàng)新典型解決方案

    近日,工業(yè)和信息化部網(wǎng)絡(luò)安全產(chǎn)業(yè)發(fā)展中心(工業(yè)和信息化部信息中心)公布了“2024年信息技術(shù)應(yīng)用創(chuàng)新解決方案”評選結(jié)果。易華錄申報的“基于節(jié)
    的頭像 發(fā)表于 08-07 15:35 ?1801次閱讀

    信息技術(shù)應(yīng)用產(chǎn)學(xué)協(xié)同人才培養(yǎng)行動計劃”正式發(fā)布,誠邁科技入選首批參與單位

    設(shè)在中國軟件評測中心。誠邁科技作為信創(chuàng)技術(shù)先鋒企業(yè),受邀成為首批參與單位,與國內(nèi)頂尖高校、領(lǐng)軍企業(yè)和權(quán)威機(jī)構(gòu)攜手,共同打造具有中國特色的信息技術(shù)人才培養(yǎng)新范式,為
    的頭像 發(fā)表于 08-06 17:29 ?1746次閱讀
    “<b class='flag-5'>信息技術(shù)</b>應(yīng)用產(chǎn)學(xué)協(xié)同人才培養(yǎng)行動計劃”正式發(fā)布,誠邁科技入選首批參與單位

    佛瑞亞如何通過信息技術(shù)推動業(yè)務(wù)增長

    在數(shù)字化、信息化的浪潮下,信息技術(shù)已經(jīng)不僅是后臺工具,更成為驅(qū)動企業(yè)發(fā)展的關(guān)鍵力量。本期Women Inspiring Mobility,我們采訪了佛瑞亞中國區(qū)信息技術(shù)總監(jiān)馬瑛,了解她和團(tuán)隊如何將
    的頭像 發(fā)表于 07-29 14:00 ?1068次閱讀

    飛騰主板為信創(chuàng)產(chǎn)業(yè)發(fā)展提高硬實(shí)力

    信息技術(shù)飛速發(fā)展的當(dāng)下,信創(chuàng)產(chǎn)業(yè)已成為我國實(shí)現(xiàn)科技自立自強(qiáng)、保障國家信息安全的關(guān)鍵領(lǐng)域。信創(chuàng),即信息技
    的頭像 發(fā)表于 07-22 18:20 ?847次閱讀

    科普|信創(chuàng)是什么?一文讀懂“信息技術(shù)應(yīng)用創(chuàng)新”戰(zhàn)略

    什么是信創(chuàng)?信創(chuàng),即“信息技術(shù)應(yīng)用創(chuàng)新”,是國家推動IT系統(tǒng)自主可控、安全可控的重要戰(zhàn)略工程。它不僅是技術(shù)層面的創(chuàng)新,更承載著保障國家網(wǎng)絡(luò)安全、推動產(chǎn)業(yè)升級和
    的頭像 發(fā)表于 06-13 10:06 ?9665次閱讀
    科普|信<b class='flag-5'>創(chuàng)</b>是什么?一文讀懂“<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新”戰(zhàn)略
    手机| 黄陵县| 赣榆县| 新河县| 新郑市| 晋宁县| 乐昌市| 巍山| 平邑县| 中江县| 洛隆县| 新兴县| 中西区| 中西区| 荔波县| 克拉玛依市| 砀山县| 卢龙县| 谢通门县| 谢通门县| 咸宁市| 彩票| 湟中县| 义马市| 巴马| 交口县| 镇雄县| 车险| 珲春市| 马尔康县| 汉源县| 东辽县| 邛崃市| 兰西县| 宜都市| 洞口县| 南皮县| 郯城县| 县级市| 乾安县| 应城市|