一.让程序只运行一个实例的方法
//首先在InitInstance()函数中创建一个同步对象,如果(GetLastError()返回ERROR_ALREADY_EXISTS表明存在
//一个应用实例了,返回false取消
// 创建同步对象
hMutexOneInstantance=CreateMutex(NULL,TRUE,_T("PreventSecondInstance"));
if(GetLastError()==ERROR_ALREADY_EXISTS)
bFound=TRUE;
if(hMutexOneInstantance)
ReleaseMutex(hMutexOneInstantance);
if (bFound==TRUE)
{ ::AfxMessageBox("You have Run one");
return false;
}
二. 单文档多视图的切换函数
void CMainFrame::ChangeToForm(int nFormID)
{
CView* pOld = this->GetActiveView();
CView* pNew = (CView*)GetDlgItem(nFormID);
if(pNew==NULL)
{
switch(nFormID)
{
case IDD_RMS_FORM:
pNew =(CView*) new CRMSView(); break;
case IDD_PARAM_FORM:
pNew =(CView*) new CPParamEditView(); break;
case IDD_OTHERPARAM_FORM:
pNew =(CView*) new CPOtherParamEditView(); break;
case IDD_USERMANAGE:
pNew = (CView*) new CPUserView(); break;
case IDD_DEVICE_EDIT:
pNew = (CView*) new CPDeviceEdit(); break;
case IDD_DEVICE_DELETE:
pNew = (CView*) new CPDeviceDeleteView(); break;
case IDD_CHANNEL_ADD:
pNew = (CView*) new CPChannelAddView(); break;
case IDD_CHANNEL_EDIT:
pNew = (CView*) new CPChannelEditView(); break;
case IDD_SHOW_CHANNEL:
pNew = (CView*) new CChannelShowView(); break;
case IDD_SHOW_DEVICE:
pNew = (CView*) new CDeviceShowView(); break;
case IDD_LOG_VIEW:
pNew = (CView*) new CPLogView(); break;
//以后继续添加
}
CCreateContext context;
context.m_pCurrentDoc = pOld->GetDocument();
pNew->Create(NULL,
NULL,
0L,
CFrameWnd::rectDefault,
this,
nFormID,
&context);
pNew->OnInitialUpdate();
}
this->SetActiveView(pNew);
pNew->ShowWindow(SW_SHOW);
pOld->ShowWindow(SW_HIDE);
int ID;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CRMSView))
ID = IDD_RMS_FORM;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPParamEditView))
ID = IDD_PARAM_FORM;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPParamEditView))
ID = IDD_OTHERPARAM_FORM;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPUserView))
ID = IDD_USERMANAGE;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPDeviceEdit))
ID = IDD_DEVICE_EDIT;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPDeviceDeleteView))
ID = IDD_DEVICE_DELETE;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPChannelAddView))
ID = IDD_CHANNEL_ADD;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPChannelEditView))
ID = IDD_CHANNEL_EDIT;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CDeviceShowView))
ID = IDD_SHOW_DEVICE;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CChannelShowView))
ID = IDD_SHOW_CHANNEL;
if(pOld->GetRuntimeClass()==RUNTIME_CLASS(CPLogView))
ID = IDD_LOG_VIEW;
// 以后继续添加
pOld->SetDlgCtrlID(ID);
pNew->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
delete pOld;
this->RecalcLayout();
}
三. 在指定区域显示图片的函数
// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸
HRESULT ShowPic(char *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight)
{
HDC hDC_Temp=GetDC(hWnd);
IPicture *pPic;
IStream *pStm;
BOOL bResult;
HANDLE hFile=NULL;
DWORD dwFileSize,dwByteRead;
//打开硬盘中的图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (!FAILED(hFile))
{
dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数
if (dwFileSize==0xFFFFFFFF)
return E_FAIL;
}
else
{
return E_FAIL;
}
//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL)
return E_FAIL;
if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult))
return E_FAIL;
OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
CloseHandle(hFile);//关闭打开的文件
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
};
四. 调用netsend指令发送消息
Header: Declared in shellapi.h.
Import Library: shell32.lib.
void NetSend(CString DestIP,CString Msg)
{
char cWindowDirectory[1024]; //定义路径名
GetWindowsDirectory(cWindowDirectory,1024); //得到windows系统目录
CString directory;
directory=CString(cWindowDirectory)+"//system32"+"//net"; //得到net程序的命令
Msg.Insert(0," "); //在消息前面插入一个空格
CString param= "send "+DestIP+Msg; //构造命令参数
SHELLEXECUTEINFO ShExecInfo = {0}; //声明
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = directory; //路径
ShExecInfo.lpParameters = param; //参数
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo); //执行
}
五.得到系统中的MainFrame
CMainFrame* main = (CMainFrame*)AfxGetApp()->GetMainWnd();