電腦只知道0~255的背景色,儀器知道這樣的背景色是多少ntis(亮度單位),我們可以指定我們要多少量nits的亮度,讓電腦調整背景色,並且同時量測,就可以做到自動調整。
在此追縱亮度量測的規格,會制定兩種
- 接近該亮度,未滿該亮度
- 接近該亮度,超過該亮度
- 就是19.9、19.8、19.7...的量測最大值
- 就是20.1、20.2、20.3...的量測最小值
BkNits.h
#ifndef BKNITS_H
#define BKNITS_H
#include "BkMaker.h"
class BkNits : public BkMaker
{
//m_pCA210
void n2cPos(ColorRef&);
void n2cNeg(ColorRef&);
public:
BkNits(const NitsDirect&);
BkNits(const BkNits& bkN);
void NT_SetWnd(CWnd* cWnd){ m_pdlgcWnd = cWnd; };
void NT_SetCa(Ca210* pCa){ m_pCa210 = pCa; };
void NT_colorReviseByNits(ColorRef&);
void NT_SetNitsLv(const int&);
const int NT_GetNitsLv()const;
};
#endif
BkNits.cpp
如何自動追縱亮度的實作?
在此若不設計自動追縱,而是靠手動追縱的話,還是一次使用兩個IO設備,不是Probe+Mouse就是Probe+Keyboard,不管哪一種組合都會降低人類操作的愉悅程度 以及增加手忙腳亂的程度。(我曾經是苦主)所以,設計了自動追縱,但是,在程式碼的介面設計上,也是有用心著墨。
- 可設定目標nits值,要追縱到什麼ntis就寫入什麼值。
- 初始化時,立即設定要指定值以上,還是以下。
追縱的兩個函數,內容不一樣,初始化的背景值是hard coding每次都一樣。
要注意的是,兩個迴圈的累加計數不一樣。
BkNits::BkNits(const NitsDirect& nt)
BkNits::BkNits(const NitsDirect& nt)
{
BkMaker::BkMaker();
m_NitsDirect = nt;
};
void BkNits::NT_SetNitsLv(const int& _N)
{ m_NitsLv = _N*100; };
inline void BkNits::NT_colorReviseByNits(ColorRef& Bkclr)
{
switch(m_NitsDirect)
{
case ND_Pos: n2cPos(Bkclr); break;
case ND_Neg: n2cNeg(Bkclr); break;
default: ASSERT(0);
}
};
void BkNits::n2cPos(ColorRef& Bkclr)
{
int _gl= 60;
int fLv = 100*100;
while(fLv > m_NitsLv) //若亮度還沒有到xx以下,就減少
{
_gl -= 2;
Bkclr.iGray(_gl);
m_pdlgcWnd->Invalidate();
m_pdlgcWnd->UpdateWindow();
//量測抓值
if (m_pCa210->Measure() == CA_ZeroCalMode)
AfxMessageBox("警告:Probe請轉到MEAS");
fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
}
while(fLv < m_NitsLv) //若亮度還在xx以下,就...變亮
{
++_gl;
Bkclr.iGray(_gl);
m_pdlgcWnd->Invalidate();
m_pdlgcWnd->UpdateWindow();
Sleep(60);
//抓值
m_pCa210->Measure();
fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
}
_SetBkColor(Bkclr);
}
void BkNits::n2cNeg(ColorRef& Bkclr)
{
int fLv = 0;
int _gl = 55;
while(fLv < m_NitsLv) //若亮度還沒有到xx以下,就減少
{
_gl += 2;
Bkclr.iGray(_gl);
m_pdlgcWnd->Invalidate();
m_pdlgcWnd->UpdateWindow();
//抓值
if (m_pCa210->Measure() == CA_ZeroCalMode)
AfxMessageBox("警告:Probe請轉到MEAS");
fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
}
while(fLv > m_NitsLv) //若亮度還在xx以下,就...變亮
{
--_gl;
Bkclr.iGray(_gl);
m_pdlgcWnd->Invalidate();
m_pdlgcWnd->UpdateWindow();
Sleep(60);
//量測抓值
m_pCa210->Measure();
fLv = (int)((m_pCa210->GetMsrData().oFlt(VluK_Lv))*100);
}
_SetBkColor(Bkclr);
}
沒有留言:
張貼留言