VC技巧集合

博客介绍了让程序只运行一个实例的方法,通过创建同步对象判断是否已有实例。还给出单文档多视图的切换函数,可切换不同视图。此外,包含在指定区域显示图片的函数、调用netsend指令发送消息的方法,以及获取系统中MainFrame的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.让程序只运行一个实例的方法

//首先在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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值