悲劇啊~~~剛才剛寫好的博文,發布的時候,內容居然莫名其妙的沒了~~難道是用chrome的問題???啊啊啊啊啊~~~我用火狐在寫一遍好了
3月18日
離上次更新過了兩天了,今天稍微做了一點。大體上完成了,設備信息顯示那一部分。
先看看成果
主要遇到了幾個問題。
1.如何動態改變對話框的caption屬性
解決方式:使用setwindowtext
我的代碼
- BOOL CDevStatus::OnInitDialog(void)
- {
- CDialog::OnInitDialog();
- this->SetWindowTextA(LPCTSTR(CPublic::DevName));
- //下面的省略
對右側的那個彈出窗口創建了一個類,重寫了CDialog中的OnInitDialog方法,使用this指針和一個全局變量CPublic::DevName改變了caption
2.全局變量的問題。由於兩個對話框之間要共享一些變量,怎麼辦呢?最容易想到的就是使用全局變量進行傳遞,但是在MFC中怎麼定義全局變量呢?查了一些資料,發現了一種方法,定義一個PUBLIC類,專門用來放置全局變量,使用的時候,用作用域來引用,其實這中間的一些問題,我還沒解決,而且我覺得用全局變量這個方式不是太好,現在的處理只是權宜之計吧~~
附代碼:
- #pragma once
- #include "pcap.h"
- // CPublic 用於全局變量/函數的定義
- class CPublic : public CWnd
- {
- DECLARE_DYNAMIC(CPublic)
- public:
- CPublic();
- virtual ~CPublic();
- static CString DevName; //保存選中的設備名
- protected:
- DECLARE_MESSAGE_MAP()
- };
3.關於LPTCSTR強制轉換的問題。下面這段代碼中d->description是char*,DevName為CString,本來想轉換成一樣的進行比較,不過發現,轉換後,那個if語句就始終是假,造成最後報空指針
- for(d = alldevs; d != NULL ;d = d->next) {
- if(d->description == CPublic::DevName) //為什麼這裡加上LPCTSTR進行強制轉化DevName後反而會出問題??
- break;
- }
不進行強制轉換反而沒有問題,查了一些資料,還是沒明白....待解決中
4.關於在其他電腦上運行程序的問題。
因為這畢業設計總要有答辯的一天,也許到時候,沒有辦法拿自己的電腦去,那麼在不同情況下的運行問題,也要解決。我准備了一台純淨的xp虛擬機,專門用來測試。之前的控制台程序,將編譯選項改為/MT就可以了。不過MFC似乎不能這樣做,只有用靜態庫編譯了。
不過這樣程序大了好多啊~~
5.關於一些函數,在使用setwindowsText之類的函數的時候,我發現一個問題,在VS2008中,代碼提示出來的,總是諸如setwindowtextw或者setwindowtexta之類的函數,那麼這幾者之間有什麼區別呢???
我在網上搜到了這麼段話
“以前在網上看到過一個說法,VC++裡面的函數有兩套代碼,一套是ANSI下的,一套是UNICODE下的,ANSI下的函數以A結尾,UNICODE下的函數以W結尾,同時,去掉結尾字符後的函數名可以同時指代兩個函數,編譯器解釋時具體翻譯成哪一個就看你的工程是否定義在UNICODE下了”
後來更改字符集試了試,好像確實是這樣。
由於之前寫好的博文丟失的問題...我很郁悶...再寫一遍,就不那麼認真了...大家見諒.
其實今天有很多問題沒有解決的,在趕後面的進度的同時,還是得再把這些東西搞明白
畢業設計簡易網絡協議分析器)編寫歷程三)完
本文出自 “學習是一種樂趣” 博客,請務必保留此出處http://eaglexhh.blog.51cto.com/1345400/519049