MFC_笔记

来源:互联网 发布:linux安装jdk1.7 编辑:程序博客网 时间:2024/05/18 00:02

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()联系在一起.


在构造函数中赋初值,在初始化函数中初始化控件。


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




0 0
原创粉丝点击