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