VC编程小技巧

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;  

版权声明:

posted on 2015-03-14 18:34  moffis  阅读(170)  评论(0编辑  收藏  举报

导航