MFC模态与非模态对话框整理

今晚写了下,老出错误,拿出一起的总结,顺便也分享一下:
模态显示对话框:

CAboutDlg dlg;//第一个 类名 类对象
dlg.DoModal();//类对象的 模态显示方法
非模态显示对话框:

CAboutDlg *dlg= new CAboutDlg;
//定义指针,如果是对象局部变量会暂时释放内存,见不到对话框,或者声明为全局或者用指针分配内存
dlg->Create(IDD_ABOUTBOX,this);
dlg->ShowWindow(SW_SHOW);//显示对话框
/*注意用完了,需要释放指针所指向的内存*/

UDP-Server服务端代码

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib");
void main()
{
//加载套接字
DWORD wversionrequested;
WSADATA wsadata;
int err;
wversionrequested=MAKEWORD(1,1);
err=WSAStartup(wversionrequested,&wsadata);
if (err!=0)
{
return;
}
if (LOBYTE(wsadata.wVersion)!=1
||HIBYTE(wsadata.wVersion)!=1)
{
WSACleanup();
return;
}
//创建套接字
SOCKET sockesrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addsrv;
addsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addsrv.sin_family=AF_INET;
addsrv.sin_port=htons(6000);

//绑定套接字
bind(sockesrv,(SOCKADDR*)&addsrv,sizeof(SOCKADDR));
char recvbuf[100];
char sendbuf[100];
char tempbuf[200];
SOCKADDR_IN addclient;
int len=sizeof(SOCKADDR);

while (1)
{
//等待并接收数据
recvfrom(sockesrv,recvbuf,100,0,(SOCKADDR*)&addclient,&len);
if ('q'==recvbuf[0])
{
sendto(sockesrv,"q",strlen("q")+1,0,(SOCKADDR*)&addclient,len);
printf("Chat-End\n");
break;
}
sprintf(tempbuf,"%s Say: %s",inet_ntoa(addclient.sin_addr),recvbuf);
printf("%s\n",tempbuf);
printf("Please input data:\n");
gets(sendbuf);
sendto(sockesrv,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&addclient,len);
}
closesocket(sockesrv);
WSACleanup();
}

UDP-Client客户端代码

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib");
void main()
{
//加载套接字
WORD wversionrequested;
WSADATA wsadata;
int err;
wversionrequested=MAKEWORD(1,1);
err=WSAStartup(wversionrequested,&wsadata);

if (err!=0)
{
return;
}
if (LOBYTE(wsadata.wVersion)!=1
|| HIBYTE(wsadata.wVersion)!=1)
{
WSACleanup();
return;
}

//创建套接字
SOCKET addclient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addsrv;
addsrv.sin_addr.S_un.S_addr=inet_addr("0535code.com");
addsrv.sin_family=AF_INET;
addsrv.sin_port=htons(6000);

char recvbuf[100];
char sendbuf[100];
char tempbuf[100];
int len=sizeof(SOCKADDR);

while(1)
{
//发送数据
printf("Please input data:\n");
gets(sendbuf);
sendto(addclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&addsrv,len);
//等待并接收数据
recvfrom(addclient,recvbuf,100,0,(SOCKADDR*)&addsrv,&len);
if ('q'==recvbuf[0])
{
sendto(addclient,"q",strlen("q")+1,0,(SOCKADDR*)&addclient,len);
printf("Chat End!\n");
break;
}
sprintf(tempbuf,"%s Say: %s",inet_ntoa(addsrv.sin_addr),recvbuf);
printf("%s\n",tempbuf);
}
//关闭套接字
closesocket(addclient);
WSACleanup();
}

TCP-Client客户端代码

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib");
void main()
{
//加载套接字
WORD w_version_requested;
WSADATA wsadata;
int err;
w_version_requested=MAKEWORD(1,1);
err=WSAStartup(w_version_requested,&wsadata);
if (err!=0)
{
return;
}

if (LOBYTE(wsadata.wVersion)!=1
|| HIBYTE(wsadata.wVersion)!=1)
{
WSACleanup();
return;
}

//创建套接字
SOCKET sockclient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addsrv;
addsrv.sin_addr.S_un.S_addr=inet_addr("0535code.com");
addsrv.sin_family=AF_INET;
addsrv.sin_port=htons(4000);
//向服务器发出连接请求
connect(sockclient,(SOCKADDR*)&addsrv,sizeof(SOCKADDR));
//接收数据
char recvbuf[100];
recv(sockclient,recvbuf,100,0);
//MessageBox(recvbuf);
printf("%s\n",recvbuf);
send(sockclient,"HelloMM,55521",strlen("HelloMM,55521")+1,0);
//关闭套接字
closesocket(sockclient);
WSACleanup();
}

TCP-Server服务端代码

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib");
void main()
{
//加载套接字
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}

if (LOBYTE(wsaData.wVersion)!=1
|| HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//创建用于监听的套接字
SOCKET socksrv=socket(AF_INET,SOCK_STREAM,/*0*/IPPROTO_TCP);//0自动选择
SOCKADDR_IN addsrv;
addsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addsrv.sin_family=AF_INET;
addsrv.sin_port=htons(4000);//端口号

//绑定套接字
bind(socksrv,(SOCKADDR*)&addsrv,sizeof(SOCKADDR));
//将套接字设为监听模式,准备接收客户请求
listen(socksrv,5);

SOCKADDR_IN addrclient;
int len=sizeof(SOCKADDR);

while (1)
{
//等待客户端请求
SOCKET sockconn=accept(socksrv,(SOCKADDR*)&addrclient,&len);
char Sendbuf[100];
sprintf(Sendbuf,"%s HEllo MM I xiang love ni "
,inet_ntoa(addrclient.sin_addr));
//发送数据
send(sockconn,Sendbuf,strlen(Sendbuf)+1,0);
char recvbuf[100];
//接收数据
recv(sockconn,recvbuf,/*strlen(recvbuf)+1*/ 100,0);
printf("%s\n",recvbuf);
//关闭套接字
closesocket(sockconn);
}
}

遍历文件夹内txt并读取

呵呵,花了一天多的时间终于搞定这个程序了。。。下面就晒一下代码,先说一下 需求吧:
遍历文件夹内所有文件 获取文件名+文件内容,格式如下:
input 输入文件夹路径…
例:
xx 文件夹下 的 1.exe ,2.exe, 3.exe
实现程度读取
****************************************
【1.exe 】: 标题
—————————————-
内容
****************************************
【2.exe 】:标题
—————————————-
内容
****************************************
代码如下:

新建Cstring变量temp;
然后在事件中添加如下代码:

CString strUDDir;
strUDDir=InputBox("请输入路径","网痴提示","D:\Notepad",500,400,NULL,0);
//上面部分确定下输入路径,默认为:D:\Notepad

CFileFind finder;
if(strUDDir.Right(1)!="\")
strUDDir+="\";
strUDDir+="*.exe";
BOOL res=finder.FindFile(strUDDir);
while(res)
{
res=finder.FindNextFile();
// 不遍历子目录
if(!finder.IsDirectory() &amp;&amp; !finder.IsDots())//判断不是文件夹则执行
{
// 在这里写需要的代码
//读取操作
CFile file(finder.GetFilePath(),CFile::modeRead);
char *pBuf;
DWORD dwFileLen;
dwFileLen=file.GetLength();
pBuf=new char[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read(pBuf,dwFileLen);
file.Close();
//MessageBox(pBuf);测试用的
CString head("********************************************************************\r\n");
CString?? strFileName=finder.GetFileName()+"\r\n"; //获取文件名称
CString?? strFilePath=finder.GetFilePath()+"\r\n"; //获取文件内容
CString fool("--------------------------------------------------------------------\r\n");

CString strprint(head+strFileName+fool+pBuf+head);
//MessageBox(strprint,"caption",MB_OK);测试用的

//合并写入数据
temp+=strprint;
}
CFile? file("wangchi.txt",CFile::modeCreate | CFile::modeWrite);
file.Write("********************************************************************\r\n"
,strlen("********************************************************************\r\n"));

//说明文本
CString temphelp("格式说明:****内的为所写时间与标题---下面为内容\r\n");
CString lixiaoyu("这里是所写日记,呵呵,这是我每晚和平时的记事本吧,也是内心所想的所写的,呵呵。");
file.Write(temphelp,strlen(temphelp));
file.Write("----------------------------------------\r\n",strlen("----------------------------------------\r\n"));
file.Write(lixiaoyu,strlen(lixiaoyu));

//写入文件wangchi.txt
file.Write(temp,strlen(temp));
file.Close();
}
finder.Close(); // 不要忘记关闭

VC之input输入框类

/* 注意,InputBox函数是C++语法,只能用于C++,不能用于C */

/********************************************/
/* InputBox.h */
/********************************************/
BOOL _InitInputBox(HWND hParent); // 可选,不过在调用InputBox函数之前最好调用一下该函数,
// 该函数是初始化InputBox,主要就是传入一个父窗口句柄。
void _SetNumber(BOOL fIsNumber); // 可选,该函数是设置Edit只能输入数字
void _SetLowerCase(BOOL fIsLowerCase); // 可选,该函数是设置Edit只能输入小写字母
void _SetUpperCase(BOOL fIsUpperCase); // 可选,该函数是设置Edit只能输入大写字母
void _SetMaxLine(unsigned int nLineSize); // 可选,该函数是设置Edit可以输入最大字符数,默认最大是256个字符,不能超过这个数。

/*********************************************************/
/* InputBox函数 */
/* lpWndMsg ; 必选参数,用于提示用户 */
/* lpWndTitle ; 可选参数, 设置对话框默认标题 */
/* lpDefValue ; 可选参数,设置Edit默认值 */
/* xPos ; 可选参数,如果为零则居中窗口 */
/* yPos ; 可选参数,如果为零则居中窗口 */
/* lpHelpFile ; 可选参数,打开*.hlp帮助文件 */
/* nHelpIndex ; 可选参数,但如果设置了lpHelpFile参数, */
/* ; 这个参数就是Help文件的索引 */
/* 如果函数成功,返回一个char *指针,包含用户输入的内容 */
/*********************************************************/
char *_InputBox(char *lpWndMsg,
char *lpWndTitle = "工程!",
char *lpDefValue = "",
int xPos = 0,
int yPos = 0,
char *lpHelpFile = "",
int nHelpIndex = 0);

#define InputBox _InputBox
#define SetNumber _SetNumber
#define InitInputBox _InitInputBox
#define SetLowerCase _SetLowerCase
#define SetUpperCase _SetUpperCase
#define SetMaxLine _SetMaxLine


/******************************************************/
/* InputBox.cpp */
/******************************************************/
#include &lt;windows.h&gt;

int WINAPI WndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
BOOL _InitVar();
HWND _CreateWindow(HINSTANCE hInst);
int _Run(HWND hWnd);

HINSTANCE _hInstance;
char *_lpWndMsg;
char *_lpWndTitle;
char *_lpDefValue;
int _xPos;
int _yPos;
char *_lpHelpFile;
int _nHelpIndex;
HWND _hParent;
HWND _hDesktop;
HWND _hEdit, _hBtnOk, _hBtnCancel, _hBtnHelp;
HWND _hMsgText;
RECT _st_rcDesktop;
RECT _st_rcWnd;
HFONT _hWndFont;
char _szBuffer[256];
char *_lpWndFontName = "宋体";
UINT _nMaxLine = 255;
UINT _nEditStyle = WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL;

BOOL _InitInputBox(HWND hParent)
{
if (!hParent)
return FALSE;
_hParent = hParent;
if (!_hInstance)
return _InitVar();
return TRUE;
}

BOOL _InitVar()
{
_hInstance = ::GetModuleHandle(NULL);
_hDesktop = ::GetDesktopWindow();
::GetWindowRect(_hDesktop,&amp;_st_rcDesktop);
if (!_xPos)
_xPos = (_st_rcDesktop.right - 365) / 2;
if (!_yPos)
_yPos = (_st_rcDesktop.bottom - 130) / 2;
return TRUE;
}

int WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hWndDc;
WORD uBtnID;
switch(uMsg)
{
case WM_DESTROY:
if (_hWndFont)
::DeleteObject(_hWndFont);
::PostQuitMessage(0);
break;
case WM_CREATE:
_hMsgText = ::CreateWindowEx(0,
"Static",
_lpWndMsg,
WS_CHILD | WS_VISIBLE,
5,
5,
275,
70,
hWnd,
(HMENU)1000,
_hInstance,
0);
_hBtnOk = ::CreateWindowEx(0,
"Button",
"确定(&amp;K)",
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
285,
5,
65,
20,
hWnd,
(HMENU)IDOK,
_hInstance,
0);
_hBtnCancel = ::CreateWindowEx(0,
"Button",
"取消(&amp;C)",
WS_CHILD | WS_VISIBLE,
285,
30,
65,
20,
hWnd,
(HMENU)IDCANCEL,
_hInstance,
0);
_hBtnHelp = ::CreateWindowEx(0,
"Button",
"帮助(&amp;H)",
WS_CHILD | WS_VISIBLE,
285,
55,
65,
20,
hWnd,
(HMENU)IDHELP,
_hInstance,
0);
_hEdit = ::CreateWindowEx(WS_EX_CLIENTEDGE,
"Edit",
_lpDefValue,
_nEditStyle,
5,
80,
350,
20,
hWnd,
(HMENU)2000,
_hInstance,
0);
::SendMessage(_hEdit,EM_SETLIMITTEXT,_nMaxLine,0);
_hWndFont = ::CreateFont(12,
6,
0,
0,
12,
0,
0,
0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
_lpWndFontName);
if (!::lstrlen(_lpHelpFile))
ShowWindow(_hBtnHelp,SW_HIDE);
hWndDc = ::GetDC(hWnd);
::SelectObject(hWndDc,_hWndFont);
::ReleaseDC(hWnd,hWndDc);
::SendDlgItemMessage(hWnd,1000,WM_SETFONT,(WPARAM)_hWndFont,0);
::SendDlgItemMessage(hWnd,2000,WM_SETFONT,(WPARAM)_hWndFont,0);
::SendDlgItemMessage(hWnd,IDOK,WM_SETFONT,(WPARAM)_hWndFont,0);
::SendDlgItemMessage(hWnd,IDCANCEL,WM_SETFONT,(WPARAM)_hWndFont,0);
::SendDlgItemMessage(hWnd,IDHELP,WM_SETFONT,(WPARAM)_hWndFont,0);
break;
case WM_KEYDOWN:
if (wParam == VK_RETURN)
::SendMessage(hWnd,WM_COMMAND,IDOK,0);
break;
case WM_SETFOCUS:
::SetFocus(_hEdit);
break;
case WM_COMMAND:
uBtnID = LOWORD(wParam);
switch(uBtnID)
{
case IDOK:
::GetDlgItemText(hWnd,2000,_szBuffer,256);
::DestroyWindow(hWnd);
break;
case IDCANCEL:
::DestroyWindow(hWnd);
break;
case IDHELP:
::WinHelp(hWnd,_lpHelpFile,HELP_INDEX,_nHelpIndex);
break;
};
break;
default:
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return (TRUE);
}

HWND _CreateWindow(HINSTANCE hInst)
{
WNDCLASSEX st_WndClass;
HWND hWnd;
::RtlZeroMemory(&amp;st_WndClass,sizeof(st_WndClass));
st_WndClass.cbSize = sizeof(st_WndClass);
st_WndClass.hInstance = hInst;
st_WndClass.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
st_WndClass.hCursor = LoadCursor(0, IDC_ARROW);
st_WndClass.hIcon = LoadIcon(0, IDI_APPLICATION);
st_WndClass.hIconSm = st_WndClass.hIcon;
st_WndClass.lpfnWndProc = (WNDPROC)&amp;WndProc;
st_WndClass.lpszClassName = "InputBox_Class";
st_WndClass.style = CS_HREDRAW | CS_VREDRAW;
::RegisterClassEx(&amp;st_WndClass);
hWnd = ::CreateWindowEx(0,
"InputBox_Class",
_lpWndTitle,
WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE,
_xPos,
_yPos,
365,
130,
_hParent,
0,
hInst,
0);
return hWnd;
}

int _Run(HWND hWnd)
{
MSG st_Msg;
if (!hWnd)
return 0;
::ShowWindow(hWnd,SW_SHOW);
::UpdateWindow(hWnd);
while(::GetMessage(&amp;st_Msg,0,0,0))
{
if (st_Msg.message == WM_KEYDOWN)
{
if (st_Msg.wParam == VK_RETURN)
::SendMessage(hWnd,st_Msg.message,st_Msg.wParam,st_Msg.wParam);
}
::TranslateMessage (&amp;st_Msg) ;
::DispatchMessage (&amp;st_Msg) ;
}
return st_Msg.wParam;
}

char *_InputBox(char *lpWndMsg,
char *lpWndTitle,
char *lpDefValue,
int xPos,
int yPos,
char *lpHelpFile,
int nHelpIndex)
{
_lpWndMsg = lpWndMsg;
_lpWndTitle = lpWndTitle;
_lpDefValue = lpDefValue;
_xPos = xPos;
_yPos = yPos;
_lpHelpFile = lpHelpFile;
_nHelpIndex = nHelpIndex;
if (!_hInstance)
_InitVar();
_Run(_CreateWindow(_hInstance));
return _szBuffer;
}

void _SetNumber(BOOL fIsNumber)
{
if (fIsNumber)
_nEditStyle |= ES_NUMBER;
}
void _SetLowerCase(BOOL fIsLowerCase)
{
if (fIsLowerCase)
_nEditStyle |= ES_LOWERCASE;
}
void _SetUpperCase(BOOL fIsUpperCase)
{
if (fIsUpperCase)
_nEditStyle |= ES_UPPERCASE;
}
void _SetMaxLine(unsigned int nLineSize)
{
if (nLineSize)
if (nLineSize &lt; _nMaxLine)
_nMaxLine = nLineSize;
}

vc++编译到link阶段有时会出现诸如stdafx.sbr文件

错误表现形式
BSCMAKE: error BK1506 : cannot open file ‘.DebugStdAfx.sbr’: No such file or directory
遇到这种情况,通常直接将Debug整个目录删除就能解决问题
但是今天我的程序又遇到了另外一个问题,提示BSCMAKE: error BK1506 : cannot open file ‘.Debug*.sbr’: No such file or directory(*.sbr并不是stdafx.sbr文件),结果我按照上面的方法试了很多次,仍然不能解决问题。
后来我就重新到网上寻求解决方法,找到了一篇关于解决BK1506错误的文章,http://zhm2k.blog.163.com/blog/static/598150682010313592467/
Error Message
cannot open file ‘filename’ [: reason]
BSCMAKE cannot open the file.
To fix by checking the following possible causes
 
File locked by another process. If reason says Permission denied, the browser may be using the file. Close the Browse window and retry the build.
A full disk.
A hardware error.
The specified output file has the same name as an existing subdirectory.
在这一句的提示下“原来只是少了一个“}”符号,造成括弧号不对称,也会造成该问题”,我耐心的通读了一次代码,果然真是少了个“}”,添加后编译,error就没再出现了。
另外还有一次是关于单选按钮的排序以及关联变量问题。大家都知道,在一组单选按钮中,只要你选择了这一组按钮的第一个按钮的“group”选项,那么这一组按钮就具有互斥的功能。但是如果你的次序调乱了,然后还在那个选择了“group”选项的按钮上关联变量的话,编译是可以顺利通过,但是在运行的时候,会出现系统出现严重错误的对话框提示,如果你选择了忽略错误,程序仍然能够执行,但当你执行到该按钮的时候,错误会重新出现。这时候你可以通过将光标定位在“对话框编辑窗口内”然后在菜单栏选择“layout”->“tab Order”查看按钮顺序是否调乱。
调试真是很烦,很烦,不过当最后问题解决了,那种开心还是会比一下子就搞定错误的时候强烈很多.
 

网痴菜鸟学习整理C++注意笔记

1.在类中定义成员变量时,不能直接给成员变量赋初始值:
class point
{
int x=0;//错误
int y=0;
}
2.只有函数的返回类型不同是不能构成函数重载的;
3.虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
4.overload和override
虚函数总是在派生类中被改写,这种改写被称为“override”。我经常混淆“overload”和“override”这两个单词。但是随着各类C++的书越来越多,后来的程序员也许不会再犯我犯过的错误了。但是我打算澄清一下:
override是指派生类重写基类的虚函数,就象我们前面B类中重写了A类中的foo()函数。重写的函数必须有一致的参数表和返回值(C++标准允许返回值不同的情况,这个我会在“语法”部分简单介绍,但是很少编译器支持这个feature)。这个单词好象一直没有什么合适的中文词汇来对应,有人译为“覆盖”,还贴切一些。
overload约定成俗的被翻译为“重载”。是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数即可以接受整型数作为参数,也可以接受浮点数作为参数。
5.当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。
virtual ~A()=0; // 纯虚析构函数
6.一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。
7.菜单消息传递顺序:View类–Doc类–CMainFrame类–App类;

VC/MFC中使用RichEdit请注意

在mfc中使用工具栏里的RichEdit 控件时,应该在对话框构造函数中用AfxInitRichEdit()或者 AfxInitRichEdit2()。
放在OnInitDialog()中不起作用,否则的话,程序会运行不起来,也没有任何编译错误信息。
这俩函数是加载 Riched20.dll(Riched32.dll)的。
其中加载动态链接库的方法是需要在头文件stdafx.h或构造函数中用这句代码:
LoadLibrary(_T(“RICHED20.DLL”)); 或LoadLibrary(_T(“RICHED32.DLL”));
 
如果要响应Rich Edit控件的OnEnChange事件,需要在OnInitDialog()中添加
//CRichEditCtrl().SetEventMask(ENM_CHANGE);
GetDlgItem(RichEditID)->SetEventMask(ENM_CHANGE);
或者
m_CtrlRichEdit.SetEventMask(ENM_CHANGE);
其中m_CtrlRichEdit是Rich Edit关联的控件变量,非CString或其他变量。
在Edit控件OnEnChange的事件中不要随便用UpdateData(FALSE),因为当输入字符超过256个时,输入焦点会自动跳转到首行第一格。