double r1;
BOOL Ctest1Dlg::OnMscomm1()
{
VARIANT variant_inp; //定義variant變數,用于存放接收到的資料
COleSafeArray safearray_inp; //定義safeassay變數
LONG len, k;//定義長整型變數
BYTE rxdata[2048]; //設定BYTE陣列
CString strtemp; //定義字串
//CString data;
switch (m_Comm1.get_CommEvent())
{
//case 1: // comEvSend發送資料
//break;
case 2 : // comEvReceive讀取資料
// MessageBox(_T("讀取資料事件"), _T("TRACE"), MB_OK);
variant_inp = m_Comm1.get_Input(); //讀緩沖區
safearray_inp = variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len = safearray_inp.GetOneDimSize(); //得到有效資料長度
str = "\0"; // 接受資料
for (k = 0; k<len; k++) {
safearray_inp.GetElement(&k, rxdata + k); //接受到的資料轉換并放到BYTE型陣列rxdata里 111111
BYTE bt = *(char*)(rxdata + k); //字符型 111111
strtemp.Format("%c", bt); //將字符送入臨時變數strtemp存放,變為字串string型 (%c單個字符轉換為cstring)
str += strtemp;
}
r1 = atof(str.Mid(0, 6));
break;
}
UpdateData(FALSE);
}
void Ctest1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
//CDialog::UpdateWindow();
//ShowImage(TheImage, IDC_picture);
}
CDC *pDC = m_picture.GetWindowDC();
CWnd *pWnd = GetDlgItem(IDC_picture);
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->MoveTo(30, 10);
pDC->LineTo(30, 600);
pDC->LineTo(800, 600);
pDC->MoveTo(200, 300);
//pDC->LineTo(0,800);
double x,y;
x = r1 * 100+500;
y = r1 * 100+800;
//pDC->MoveTo(x, y);
pDC->LineTo(x, y);
ReleaseDC(pDC);
}
想問一下,怎么才能讓下面的Onpaint函式中的r1與上面那個函式里的r1一起改變?我把r1定義成全域變數這樣可以嗎?也就是說下面的函式怎么呼叫上面函式里的r1呀?求大神解答!
uj5u.com熱心網友回復:
不要迷信書、考題、老師、回帖;要迷信CPU、編譯器、除錯器、運行結果。
并請結合“盲人摸太陽”和“駕船出海時一定只帶一個指南針。”加以理解。
任何理論、權威、傳說、真理、標準、解釋、想象、知識……都比不上擺在眼前的事實!
uj5u.com熱心網友回復:
總的來說就是上面那個函式是串口通信,接收單片機發送過來的坐標資料。我想讓下面的繪圖函式根據上面函式里的坐標資料畫出一條曲線出來。uj5u.com熱心網友回復:
我的意思是“把r1定義成全域變數這樣可以嗎?”你實際試試不就知道答案了嗎。uj5u.com熱心網友回復:
你應該自定義一個訊息,訊息的回應函式是你onpaint里的內容,把你串口收到的資料封裝到訊息里。串口每收到一個資料發一條訊息。uj5u.com熱心網友回復:
試了,貌似不行。。。但是理論上應該是可以的呀
uj5u.com熱心網友回復:
本人mfc小白。。您能具體說說嗎?
uj5u.com熱心網友回復:
onpaint()只在對話框建立的時候執行,這時候你串口肯定還沒有收到資料。換一種方式吧,訊息可能比較難解釋。
你新定義一個函式,mypaint(int r1);
你把畫圖部分寫到這個函式里。
每次收到值,把值傳給,呼叫mypaint();
uj5u.com熱心網友回復:
聽起來好復雜。。我試試吧 謝謝您 不過還有木有更簡單的方法呀。。只是想畫個圖。。
uj5u.com熱心網友回復:
mfc的東西用訊息比較安全。uj5u.com熱心網友回復:
定義成對話框的成員變數,然后兩個成員函式中都可以訪問到,就可以修改。讀取了uj5u.com熱心網友回復:
r1 = atof(str.Mid(0, 6)); 后Invalidate()重繪
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
既然是曲線, 就應該有一系列點, 所以接收到的資料至少應該是個陣列 而非單個點; 接收資料后通知主視窗重繪顯示
繪制的話,應該按視窗大小及實際資料做一個比例映射或是比例轉換
uj5u.com熱心網友回復:
資料是單片機那頭一直發過來的,程式里的資料一直在更新,所以按理說最后畫出來的應該是一個動態曲線
uj5u.com熱心網友回復:
WM_PAINT 時, 系統提供的只是一個填充了背景色的空白DC 具體要顯示什么內容 完全取決于你繪制什么uj5u.com熱心網友回復:
定義成對話框的成員變數,然后兩個成員函式中都可以訪問到,就可以修改。讀取了
我在對話框里添加了一個成員變數。然后兩個就都可以呼叫他了嗎?
uj5u.com熱心網友回復:
將R1定義為類Ctest1Dlg的成員變數uj5u.com熱心網友回復:
將R1定義為類Ctest1Dlg的成員變數
試了,沒反應。。
uj5u.com熱心網友回復:
CDialogEx::OnPaint();//已經 pWnd->Invalidate();了}
CWnd *pWnd = GetDlgItem(IDC_picture);
pWnd->UpdateWindow(); //令 客戶區 有效
// 客戶區DC
CDC *pDC = m_picture.GetWindowDC();
uj5u.com熱心網友回復:
將R1定義為類Ctest1Dlg的成員變數
試了,沒反應。。
串口接收函式的后面加Invalidate
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/102549.html
標籤:基礎類
上一篇:vc新手求幫助
下一篇:c++ win32編程
