VC++2010 で線形の描画についてですが・・
VC++2010 で線形の描画についてまた質問なんですが、以下のように記述すると線ができなく、
点だけが動くプログラムになりました。解決方法がわからないのでよろしくお願いします。
今回のプロジェクトの目的はある機器からデータを取ってきて(1msごとに)それを1msごとに
直線として出力するプロジェクトです
電圧
↑ ________
↑ | |________→→
ーーーーーーーー
→→時間
↑↑↑
このような線を出力しなければならないです。
以下がソースになっています。
使用環境VC++2010 MFC test10000Dlg.cpp
ちなみにm_lineXとm_lineYはメンバー変数です(double型)
ボタンがクリックされたときのイベント
SetTimer(0, 1, NULL);
void Ctest10000Dlg::OnTimer(UINT_PTR nIDEvent)
{
UpdateData();
after_datay = sam_data;
m_xvEditX = m_lineX;
m_xvEditSamd = m_lineY;
m_xvEditSami = sam_i++;
if(sam_i%200==0) {
m_lineY -= 5;
sam_i = 0;
}
m_lineX++;
UpdateWindow();
Invalidate(FALSE);
}
void Ctest10000Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 描画のデバイス コンテキスト
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// クライアントの四角形領域内の中央
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
{
//******************************************************************************************************
CRect rect_dlg;
GetClientRect(&rect_dlg);
CBrush br_black(RGB(0,0,0));
//各色ペン
CPen pen_black(PS_SOLID,1,RGB(0,0,0));
CPen pen_gray(PS_DOT,1,RGB(128,128,128));
CPen pen_blue(PS_SOLID,1,RGB(0,0,255));
CPen pen_white(PS_SOLID,1,RGB(255,255,255));
int max_y=1;
if(int(m_sin+m_cos+1.0)>max_y) max_y=int(m_sin+m_cos)+1;
CDC* pDC=m_pict.GetDC();
//PictureControlの大きさ取得
CRect rect;
m_pict.GetClientRect(&rect);
//元のブラシをoldbrに保持
CBrush* oldbr=pDC->SelectObject(&br_black);
//元のペンをoldpenに保持
CPen* oldpen=pDC->SelectObject(&pen_black);
//(1)背景描画(ブラシ白、ペン黒)
pDC->Rectangle(&rect);
//(2)中心線(黒、実線)
pDC->SelectObject(&pen_blue);
pDC->MoveTo(10,rect.Height()-10);
pDC->LineTo(10,10);
pDC->MoveTo(10,rect.Height()-10);
pDC->LineTo(rect.Width()-10,rect.Height()-10);
pDC->SelectObject(&pen_white);
pDC->MoveTo(m_lineX,m_lineY_after);
pDC->LineTo(m_lineX+1,m_lineY);
pDC->SelectObject(oldbr);
pDC->SelectObject(oldpen);
m_lineY_after = m_lineY;
UpdateData(FALSE);
CDialog::OnPaint();
}
}
ではよろしくお願いします
お礼
早々のご返事有難うございます。 アルファブレンディングキーワードを元にやり方を探してみたところ、CDCのメンバにAlphaBlend()という関数があり、その中の_BLENDFUNCTION構造体にSourceConstantAlphaという透過度を設定するメンバ変数がありました。 早速、試してみたところ無事、透過させることに成功致しました。 有難うございました。