1.rich edit控件使用时需要初始化
用vc新建dialog.添加rich edit 后编译可以通过,运行后自动退出,原因即是没有初始化的后果。
解决方法:
AfxInitRichEdit();
CWinApp::InitInstance();
必须在CWinApp::InitInstance();
之前。
2.socket编程对socket需要初始化
在你重载的CWinApp::InitInstance函数中调用这个函数以初始化WindowsSockets。
在调用 AfxSocketInit() 之前,需要包含 afxsock.h 头文件。
例子:
if ( !AfxSocketInit() )
{
AfxMessageBox( _T("Failed to Initialize Sockets"), MB_OK | MB_ICONSTOP);
return FALSE;
}
解释:WASAtarup()是应用程序调用的windows sockets dll的第一个函数,在调用任何winsock api之前,必须调用wsastartup()进行初始化,最后调用WSACleanup()做清理工作.
MFC中的函数AfxSocketInit()包装了函数WSAStartup(),在支持WinSock的应用程序的初始化函数IninInstance()中调用AfxSocketInit()进行初始化,程序则不必调用WSACleanUp().
3.获得edit控件的内容或者赋值
为控件关联一个control类型的变量,例如CEdit m_edit,
用m_edit.SetWindowText("");就可以清空内容。用m_edit.GetWindowText(str);就可以得到内容。
如果关联的是CString变量可以把那个变量赋值为"",然后UpdateData()。
4.获得窗口句柄
HWND hWnd = ::FindWindowEx(this->GetParent()->m_hWnd, NULL, NULL, WINDOW_TEXT);
其中,m_hWnd为名为WINDOW_TEXT的子窗口的父窗口的句柄,WINDOW_TEXT为子窗口的标题,得到的hWnd为子窗口的句柄,this指代子窗口。
hWnd1=::FindWindowEx(FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd, NULL, NULL, WINDOW_TEXT);
第二句中hWnd为IDC_TAB1的父窗口,m_hWnd即IDC_TAB1
5.突破静态成员函数不能非静态成员的限制
解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。
例如:
class A
{
public:
static void f(A a);
private:
int x;
};
void A::f(A a)
{
cout<<a.x;
}
6.判断socket连接是否断开
bool IsSocketClosed(SOCKET clientSocket)
{
bool ret = false;
HANDLE closeEvent = WSACreateEvent();
WSAEventSelect(clientSocket, closeEvent, FD_CLOSE);
DWORD dwRet = WaitForSingleObject(closeEvent, 0);
if(dwRet == WSA_WAIT_EVENT_0)
ret = true;
else if(dwRet == WSA_WAIT_TIMEOUT)
ret = false;
WSACloseEvent(closeEvent);
return ret;
}