MFC_筆記

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")




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