MFC学习点滴

1.弹出消息框AfxMessageBox(_T("hello world"));或MessageBox(_T("hello world"));

2.Afx开头的都是全局函数,也就是说AfxMessageBox可以用于任何程序;而MessageBox只能用在CWnd及其派生类中。

3.有三个API函数可以运行可执行文件WinExecShellExecuteCreateProcess。CreateProcess复杂较少用

4.VS2010双击按钮不能跳转到代码处,反而提示:重载函数已存在

      原因:CPP文件中重载函数已经删除,但是对应的.h 文件中该函数的声明还在,VS检测到后就给处提示

      解决方法:删除对应.h文件中该函数的声明

5.固定对话框大小:资源里的对话框将border属性改成Dialog Frame;对于动态创建的对话框在PreCreateWindows中进行修改

6.Edit控件如何换行

     一、通过回车换行:

这里要有两个设置
<1>.将控件的属性设置为Mutilines->true;<2>.将控件的另一个属性设置为Want return->true.
    二、通过UpdateData更新控件窗口内容中的换行
<1>.将控件的属性设置为Mutilines->true;<2>.输出字符串换行符是 "\r\n" 而不是"\n".

7.MFC 无法导入bitmap位图原因:可能是文件的后缀名是bmp,但是实际格式并不是位图,可以通过一定转换,转化成真正的位图文件方可正常导入

8.HINSTANCE是应用程序实例句柄,HWND是窗口对象句柄,HANDLE是任意对象的句柄,CWnd是MFC中的窗口类。

9.MSDN字符串之间转换http://msdn.microsoft.com/zh-cn/library/ms235631(VS.80).aspx

10.MFC中调用控制台窗口方法:

1、实例工程名为Demo,在CDemoDlg.cpp中加入头文件 #include "conio.h" 

  2、在CDemoDlg::OnInitDialog() {...}函数中加入AllocConsole();

  3、在需要输出调试信息的地方,调用 cprintf() (在VS2005后应该用 _cprintf 代替,下文有说明)函数输出信息,用法同 printf() 函数类似;

  4、若需要关闭控制台输出,调用 FreeConsole();

11.原来可以编译过的工程,现在提示 IntelliSense: 应输入声明;而且很多行都有:IntelliSense: 应输入“;” \resource.h

解决方法:工具-〉选项-〉文本编辑器-〉c/c++->高级-〉禁用自动更新改为:TRUE

12.Socket在文件传输时,并不是缓冲区设置大了好,这样会把一些无关数据保存在文件里,造成文件损坏,而且会出现丢包

13.VS报错运行时的错误问题:程序运行很快,VS不能很好捕捉到错误所在,可能会引起误报,解决方案是单步调试,搞清问题究竟出在哪里

14.CPaintDC与CClientDC的区别:CPaintDC负责整个窗口重绘,CClientDC负责客户区图形绘制

15.不可在线程里打开一个新的对话框

16.无论是全局变量还是全局对象,程序运行时,在加载main函数之前,就已经为全局变量或或全局对象分配了内存空间

17.win32 SDK编程是通过 WinMain函数的实例句柄来唯一标示应用程序,而MFC程序则是通过产生一个应用程序类的对象来唯一标示应用程序实例

18.win32发消息有两种:SendMessage,PostMessage,其中SendMessage为阻塞消息,须等消息函数返回主程序方可继续执行,PostMessage为非阻塞消息,不等消息处              理函数返回即可继续执行;所以SendMessage发送的是非进队消息,PostMessage发送的是进队消息

19.需要很长时间才能出现的错误很可能就是多线程带来的问题

20.windows四种进程通信方式:剪切板(公共内存区域)、匿名管道( 单向,本地进程通信)、命名管道(本地+网络进程 间通信)、邮箱(单向、无连接传输)

21.WM_USER是MFC 系统消息的最后一个,所以自定义消息要定义成WM_USER+x

22.L表示UNICODE串,比如wchar_t* str = L"yangsongx"; 
_T在ANSI编译模式下表示ANSI串,在UNICODE下表示UNICODE串

23.获取含标题的对话框句柄:HWND hconnect=::FindWindow(NULL,_T("HELLO"));

24:桌面绘图:

HDC  hDC = ::GetWindowDC(::GetDesktopWindow());
::MoveToEx(hDC, 0, 0, NULL);
::LineTo(hDC, 1000, 600);

25.透明窗体:SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

26.创建非模态对话框,默认父对话框是创建创建该对话框的对话框,可以修改父对话框为桌面如下例子,可以保证主对话框隐藏,子对话框依然可以        显示,就像QQ一样

CImageDisplayDlg *dlg=new CImageDisplayDlg;
dlg->Create(IDD_DIALOGPIC,GetDesktopWindow());
dlg->ShowWindow(SW_SHOW);

27.MFC 在网络边城中如何获取有效的网卡信息:

//显示IP地址
void CMonitorServerDlg::DisplayIpInBox()
{
    //相关变量设置
IP_ADAPTER_INFO * pAdapterInfo;
ULONG ulOutBuflen;
DWORD dwRetVal;
PIP_ADAPTER_INFO pAdapter;

//为IP_ADAPTER_INFO分配空间 
pAdapterInfo=(IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
ulOutBuflen=sizeof(IP_ADAPTER_INFO);


//返回结果大小保存在ulOutBuflen中
if(GetAdaptersInfo(pAdapterInfo,&ulOutBuflen)!=ERROR_SUCCESS)
{
free(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO *)malloc(ulOutBuflen);
}
//将网络信息保存在结构体pAdapterInfo中
if((dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBuflen))!=ERROR_SUCCESS)
{
AfxMessageBox(_T("获取网卡信息失败!"));
}
pAdapter=pAdapterInfo;
while(pAdapter)
{
char *str=pAdapter->IpAddressList.IpAddress.String;
CString cstring(str);
if(cstring.Compare(_T("0.0.0.0"))!=0)//获得非0.0.0.0  IP 就跳出,多网卡在局域网下非0.0.0.0就有效
{
GetDlgItem(IDC_EDITIP)->SetWindowText(cstring);
if(pAdapterInfo)//内存释放
free(pAdapterInfo);
return ;
}
else//查询下一个地址
{
pAdapter=pAdapter->Next;//查询下一个网络适配器(网卡)
}
}
//在不联网的情形下,如果没有为电脑设置静态IP则会出现没IP的情况(0.0.0.0),给处提示
GetDlgItem(IDC_EDITIP)->SetWindowText(_T("请设置IP"));
}

27.为程序设置图盘图标:

        NOTIFYICONDATA tnd;//系统托盘信息结构体

tnd.cbSize = sizeof(NOTIFYICONDATA);//结构的大小  
tnd.hWnd = GetSafeHwnd();//接收图标通知的窗口  
tnd.uID = IDR_MAINFRAME;//任务栏通知区域图标的标识  
tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//指定其他哪些参数有效
tnd.uCallbackMessage = WM_TRAYICON_SERVER;
tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//图标句柄  
wcscpy_s(tnd.szTip,_countof(tnd.szTip),L"教师助手服务端");//提示字符串  
ShowWindow(SW_HIDE);//窗口隐藏
Shell_NotifyIcon(NIM_ADD,&tnd);

28.在为程序设置好托盘图标的情形下,可以弹出信息提示框:

tnd.uTimeout=500;//提示延迟时间,毫秒
tnd.dwInfoFlags=NIIF_INFO;//提示信息类型
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_INFO;
lstrcpy(tnd.szInfoTitle,_T("教师助手服务端文件下载提示"));//提示标题
lstrcpy(tnd.szInfo,RestName+_T("下载成功"));//提示内容
Shell_NotifyIcon(NIM_MODIFY,&tnd);

29.异步与同步、阻塞与非阻塞

同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。 
而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

30.单文档程序与多文档程序

单文档程序就是打开多少个文件,就会打开多少个进程,例如记事本,在任务管理器中可以看到多个进程

多文档程序就是打开对少个文件,还是只有一个进程,例如WPS,在任务管理器中看到的是多文档中当前活动的文档

你可能感兴趣的:(mfc,C/C++)