通信協議之點陣的解析和showWindow問題的解決

 經過幾天的學習,終於將點陣解析出來了,在這裏總結一下,點陣的分佈是一位Head,2位Length,一位Command,1217位Pargram,和2位checkNum,因此解析的時候只需要判斷1217位Pargram是不是Length的值就行了,頭是以0XAA開頭的,我們只要建立一個足夠大的數組存這1217位Pargram,unsigned char LatData[1216];//點陣數據(半屏),注意第一個字節爲判斷上半屏或者下半屏,因此不存到這個數組裏面,但是檢驗碼的時候需要把它加進去,這裏完成後出現點陣分佈很亂的局面,也就是顯示的並不是我要的點陣,經過檢查發現是我存的這個數組沒有初始化,還有一個原因是下半屏發的點陣中在內容裏有0XAA,由於在判斷的時候沒有判斷好,導致只顯示了一半的內容,因此在判斷是不是點陣頭的時候要if(buf == 0XAA && m_index ==0),這樣點陣就解析完了。得到點陣解析的數據後將它放到一個結構體中,確定上半屏和下半屏的點陣數據都存放到這個結構體後,再將這個結構體存放到一個隊列中,接下來就要顯示點陣了,這裏我們定義一個定時器,然後讓他顯示點陣,由於點陣半屏內容有1216*8= 9728個點,利用x=i%256;得到X軸的座標,y=i/256;得到y軸的座標,然後在點爲1的地方畫::SetPixel(Latdc,x,y,RGB(0,255,255));這裏只能畫256*76個點,因此我們要放大,利用TransparentBlt函數就能達到這個效果。這樣點陣就顯示完成了。而在我們的車載上有三種狀態,Radio、CD和Aux,我們點擊這幾個按鈕,從button中發送指定的十六進制命令給Can,寫入Can後,由於之前在Can中有一個線程在不停的讀串口中的數據,並且分析和解析數據,這樣就能解析出我發送的字符了,在這裏有個問題就是我的showWindow經常會出現不可思議的問題,我讓他SW_SHOW或者SW_HIDE都沒有反應。

showWindow問題終於解決了,爲什麼經常Window顯示不出來的原因是在對窗口初始化的時候我用的是MoveWindow(0, 0, 800, 480);,而在這裏我必須要用::SetWindowPos(this->m_hWnd,HWND_TOPMOST,0,0,800,480,SWP_HIDEWINDOW);這兩個的區別是:

MoveWindow只能設置窗口的大小和位置;SetWindowPos擁有MoveWindow的全部功能之外,還可以設置窗口的層疊關係(如,把指定的窗口放在所有窗口的最上層--alwaysontop就可以用這個函數、或者把指定的窗口放在另一個窗口的下層,等等)。你完全可以不用MoveWindow,而只用SetWindowPos;但是,在只要設置窗口大小或位置的情況下,你也完全可以使用MoveWindow。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章