截至此時,接近5天,從一開始的介面1.0到介面2.0,介面風格從深沉到清新期間,遇到一些問題。
應用平台:FW,LIBUIDK,VC6.0,偶爾VS2005測試其實問題。
1:一開始做個主介面並不困難,很快1個小時就搞定。此時仍未編碼。不過存在一些BUG:
1)介面放大的時候,控制項零散分布。
2)功能表列設定不完全。
2:停止設計介面,開始嘗試鉤子調用,系統功能需要。
(這個過程有點模糊,有空補回)
3:開始設計子視窗,屬於該系統的監控部分。開始編碼。
思考如何下手過程:
1)首先想到有點類似於瀏覽器功能,但是搜遍了google所有關鍵詞都未出現有關LIBUIDK和VC6相結合
的相關函數。於是找了技術客服,要了例子,給了QQ皮膚的例子,照著做。
2)向子視窗方向發展,一開始只用了ShowWindow(SM_SHOW),結果初始化時出現DEBUG錯誤提示。 經過了和客服一番口水後,發現,視窗建立的一般流程是Register(),Create(),ShowWindow(),While().
於是乎在主介面的Create()裡面Create()多個子視窗。以為大功告成。出現如下問題,視窗只顯示一些控制項內容,未顯示全部。於是再和客服一番口水,這時候google已經難以發揮作用,因為那個死鬼軟體到現在毫無任何可靠文檔可參考。最後,又發現,原來那個控制項也運算元視窗,問題原因是控制項重疊了,客服建議我不要用Create(),直接用他封裝的那個LoadFrame()介面。使用之後發現,問題仍無法解決,於是朝UI軟體考慮
3)開始思考問題根源,UI皮膚軟體。根據客服所說的控制項重疊,那就是說父視窗有控制項和子視窗的控制項重疊,觀察一遍之後發現按鈕之類的都沒有衝突,再仔細一看發現有個IDC_STA_POS的靜態文字框罩住整個子視窗位置,於是乎,將其刪除,最後編譯運行看結果,子視窗的某個地方的標題列不見了,根據剛才的思路,往標題列那裡增加多個靜態文字框,最後結果完美無缺。(之所以,當時會價格靜態文字框,是因為看了QQ皮膚軟體才跟著做,這是教訓啊。)
4:某個時刻隊友說介面很肉酸,好,換!
5:開始設計監控子視窗裡的清單控制項。
思考過程如下:
1)先在UI裡面划出一個LIST框,然後直接在按鈕函數裡面加m_WatList.InsertColumn();最後出現3.2的DeBUG錯誤,跟著前面的經驗,直接Create()一個控制項出來,跟著LIBUIDK裡面的List執行個體,也是CREATE(),有了列表效果,就給了隊友,手工。最後,那邊反應,捲軸無效,那時候,俺已經見周公去了。第二天起來發現問題,也就是今天。
2)查看滾動無效,首先思考,是否建立的時候設定不好,google加MSDN差了CListCtrl所有函數後,把有關捲軸的函數嘗試完後,還是發現問題仍然存在。(PS:在搜尋過程發現,原來有很多關於捲軸的變化,可以介面停留在添加處,另外也有,滑鼠只對捲軸有反應,不過當時沒有太注意那些,以後碰到再去查,反正比LIBUIDK好多了,起碼google有答案。)去外面散了一下步後,忽然發現,根據以往經驗,會不會是子視窗問題,因為滑鼠點擊內容也是無效的。
3)問題指向,子視窗無法接受滑鼠響應。又G了一下,忘記過程是怎樣了,反正沒結果。再和客服水了一下,他也在尋找問題,一開始他說是IDC_STA_POS覆蓋了控制項使其沒有反應。(PS:他說道,IDC_STA_POS是定位作用,記下。)但是刪除之後,問題仍然存在。因為,如果是覆蓋問題,沒有理由按鈕有效而清單控制項無效。於是乎,再次和他水了一下,果然是他開發的,開始指向問題所在,重複建立了清單控制項。
4)問題指向,列表重複建立,把代碼裡面的所有Create全部刪除,再重新調試了一下,發現,出現了3.2的DEBUG錯誤提示。再和客服水了一下,他道,這個你可以自己調試看看。對啊,這個問題要靠自己。謝拉
5) 問題指向,InsertColumn()處,斷點,再F10,再F11,不斷F11,再最深處,看到一個地方,如下:
_AFXCMN_INLINE int CListCtrl::InsertItem(int nItem, LPCTSTR lpszItem)
{ ASSERT(::IsWindow(m_hWnd)); return InsertItem(LVIF_TEXT, nItem, lpszItem, 0, 0, 0, 0); }
停在這裡後直接去到DEBUG提示那個函數。說明這裡出了問題。仔細看了每個參數和函數,查了每個參數的意思,後,目標停在IsWindow(m_hWnd)這裡,視窗控制代碼失效,再次G了一下,發現解決方案是
如果你得TabCtrl是用資源檔定義的則
【
char chTmp[64] = { 0 };
if( NULL == ( CTabCtrl.m_hWnd = ::GetDlgItem(m_hWnd,IDC_TABCTRL)) )
{
sprintf(chTmp,"%d",GetLastError());
::MessageBox(NULL,chTmp,"Tip",MB_OK ¦MB_ICONSTOP);
goto ERROREND;//如果你會用SHE則修改為__leave;
}
首先取得控制代碼
】
當然沒有照抄,CWatList.m_hWnd=::GetDlgItem(m_hWnd,IDC_LIST_Wat);
再調試了一下,基本問題解決。再修改一下介面問題。
到此,完成大概初步。
=====================================================================
剩餘介面問題:
1,功能表列未弄好。
2,主介面其他按鈕的子視窗未弄好。
3,主介面放大後,介面分離。
4,縮小後放大,顯示無緩衝效果。
5,無返回主介面按鈕。
=====================================================================
亟待補充的很多基礎知識:
1,編碼風格。
2,軟體介面製作規則。
3,演算法,最近做了這個系統,ACM做題有點跟不上,還有英語。
4,底層技術,例如線程,進程式控制制。
代碼大全要認真讀。C++Primer,C primer.