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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值