1 調試並查看輸出信息
1) 調用TRACE函數,用法類似於printf,但要注意:
TRACE函數輸出是在output窗口的debug選項下的,
只有debug版本調試纔有輸出,在relaase版本調試或者運行程序時,將看不到輸出.
2) 使用AfxMessageBox()函數
3) 將標準輸出定向到自己創建的控制檯
4)使用OutputDebugString函數
但OutputDebugString只支持輸入一個參數,可自定義如下:
void OutputDebugPrintf(const char * strOutputString,...)
{
char strBuffer[4096]={0};
va_list vlArgs;
va_start(vlArgs,strOutputString);
_vsnprintf(strBuffer,sizeof(strBuffer)-1,strOutputString,vlArgs);
//vsprintf(strBuffer,strOutputString,vlArgs);
va_end(vlArgs);
OutputDebugString(strBuffer);
}
實例:OutputDebugPrintf("DEBUG_INFO | %d %s",600019,"tangxg");2 項目結構
創建項目後自動生成三個類:
CAboutDlg:關於對話框類
CXXXDlg:主對話框類
CXXXApp:初始化項目的APP類,對本應用程序進行實例化,創建時自動調用其構造函數CXXXApp::CXXXApp() , 這是程序創建的第一步
接下來程序會調用winmain函數
通過InitInstance()函數初始化窗口,
windows程序的事件是通過消息驅動的,每個消息觸發一個響應事件,通過DECLARE_MESSAGE_MAP()聯繫在一起.
在構造函數中賦初值,在初始化函數中初始化控件。
恢復VS初始狀態
開始 - 運行 - 輸入devenv.exe /resetuserdata
3 常用
在OnInitDialog()函數中添加窗口初始化設置
在構造函數中對變量進行初始化
_T()是一個宏,使程序支持Unicode編碼
Update(true) 刷新控件的值到對應的變量
Update(false) 拷貝變量值到控件顯示
運行一個外部程序:
ShellExecute(
hWnd: HWND; {指定父窗口句柄}
Operation: PChar; {指定動作, 譬如: open、runas、print、edit、explore、find[2] }
FileName: PChar; {指定要打開的文件或程序}
Parameters: PChar; {給要打開的程序指定參數; 如果打開的是文件這裏應該是 nil}
Directory: PChar; {缺省目錄}
ShowCmd: Integer {打開選項}
)
常用消息
WM_TIMER 定時器
WM_CLOSE 窗口關閉
WM_DESTROY 應用程序結束
WM_KEYDOWN 按鈕按下
常用虛函數
PreTranslateMessage
PreCreateWindow
按鈕常用屬性:
Cation : 文本
ID
Disable : 是否可按下
Visible : 是否可見
Multiline : 多行
固定對話框大小:將對話框的外觀選項"Boder" 改爲 "Dailog Frame”,默認是 Resizing
對於靜態文本,notifiy屬性必須設置成true,才能響應鼠標點擊事件
編輯框常用屬性:
Multiline:多行
Password:文本以密碼形式顯示
Readonly:只讀
Number:只輸入數字
Lowercase:自動轉換小寫
Uppercase:自動轉換大寫
Horizontal sroll:水平滾動條,必須Multiline爲true
Vertical croll:垂直滾動條,必須Multiline爲true
控件變量分爲兩種:control 和 value
添加control類型變量用於設置控件的各種屬性
添加value類型變量用於保存控件相關的各種變量值
單選按鈕分組的第一個按鈕的group屬性必須爲true
複選框屬性:
left text :複選框的選框和文本左右互換
push like:複選框樣式
GetCheck() :獲取複選框狀態
SetCheck() :設置複選框狀態
定時器
//設置定時器
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以通過該ID判斷是哪個定時器
UINT nElapse, // 時間間隔,單位爲毫秒
TIMERPROC lpTimerFunc // 回調函數
);
//定時器響應(響應系統定義WM_TIMER消息):
OnTimer( UINT nIDEvent );
//釋放定時器:
KillTimer( UINT nIDEvent );
//定時器回調函數
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime )
在定時器消息響應函數OnTimer中,要先判斷定時器ID
自定義消息
在類嚮導 -> 消息 -> 添加自定義消息
自己定義的消息ID必須大於WM_USER
組合框屬性
data :添加數據
sort : true系統自動排序, false按照數據輸入的順序
type: simple一般不用, drop down默認,可以輸入數據,也可以選擇數據, drop list只能選擇數據,不能輸入數據
windows API
注意:MFC調用系統函數時,必須加::
發送指定消息到一個或多個窗口
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)
//hWnd:其窗口程序將接收消息的窗口的句柄。如果此參數爲HWND_BROADCAST,則消息將被髮送到系統中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被髮送到子窗口。
//Msg:指定被髮送的消息。
//wParam:指定附加的消息特定信息。
//IParam:指定附加的消息特定信息。
//返回值:返回值指定消息處理的結果,依賴於所發送的消息。
AfxGetMainWnd()->m_hWnd :主窗口的句柄
CString <-> char* 轉換
參考文章:http://blog.csdn.net/flydream0/article/details/8543525/
Unicode編碼模式下:
Csring -> char*
CString str1 =_T("123");
int len =WideCharToMultiByte(CP_ACP,0,str1,-1,NULL,0,NULL,NULL);
char *ptxtTemp =new char[len +1];
WideCharToMultiByte(CP_ACP,0,str1,-1,ptxtTemp,len,NULL,NULL );
//...
delete[] ptxtTemp;
問題1:
在vs2003, vs2005中用sprintf 會出現warning C4996: 'sprintf' was declared deprecated
或warning C4996: 'strcpy' was declared deprecated
或warning C4996: 'strcat' was declared deprecated的警告。
這裏給出解決問題的一些方法。
方法一:調用VS2005鼓吹的那些帶“_s”後綴的非標準函數,即在其後加上"_S",如sprintf改爲sprintf_s 。
方法二:在文件最開始添加#define _CRT_SECURE_NO_DEPRECATE或#pragma warning(disable:4996) ,這是忽略警告的方法(一般比較少用)。
方法三:幹粹在工程屬性中設置(推薦)。
在工程屬性中設置的方法如下:
對於VC6:
打開Project----settings----Resources----Preprocessor definitions,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE這兩個宏。
對於VS系列的版本:
打開項目----項目屬性---配置屬性----C/C++ ----預處理器----預處理定義,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE這兩個宏。
問題2:
安裝openssl:
1)安裝perl
2)打開vs2013本機工具命令提示
3)設置安裝路徑:perl Configure VC-WIN32 --prefix=c:\some\openssl\dir
4)編譯:nmake -f ms\ntdll.mak
5)測試:nmake -f ms\ntdll.mak test
6)安裝:nmake -f ms\ntdll.mak install
在VS2013中添加openssl
1)配置屬性——VC++目錄——在include包含目錄中新增"d:\openssl_lib\include"(存放編譯後的庫文件的目錄中);
2)VC++目錄——"Library files"選擇中新增目錄"d:\openssl_lib\lib"。
3)配置屬性——鏈接器——輸入——附加依賴項——libeay32.lib 和ssleay32.lib即可
或使用#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"ssleay32.lib")