萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> VC開發小技巧

VC開發小技巧

  一、打開CD-ROM

  mciSendString("Set cdAudio door open wait",NULL,0,NULL);

  二、關閉CD_ROM

  mciSendString("Set cdAudio door closed wait",NULL,0,NULL);

  三、關閉計算機

  OSVERSIONINFO OsVersionInfo; //包含操作系統版本信息的數據結構

  OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

  GetVersionEx(&OsVersionInfo); //獲取操作系統版本信息

  if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)

  {

  //Windows98,調用ExitWindowsEx()函數重新啟動計算機

  DWord dwReserved;

  ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改變第一個參數,實現注銷用戶、

  //關機、關閉電源等操作

  // 退出前的一些處理程序

  }

  四、重啟計算機

  typedef int (CALLBACK *SHUTDOWNDLG)(int); //顯示關機對話框函數的指針

  HINSTANCE hInst = LoadLibrary("shell32.dll"); //裝入shell32.dll

  SHUTDOWNDLG ShutDownDialog; //指向shell32.dll庫中顯示關機對話框函數的指針

  if(hInst != NULL)

  {

  //獲得函數的地址並調用之

  ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);

  (*ShutDownDialog)(0);

  }

  五、枚舉所有字體

  LOGFONT lf;

  lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT strUCture

  strcpy(lf.lfFaceName,"");

  CClientDC dc (this);

  // Enumerate the font families

  ::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);

  //枚舉函數

  int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,

  LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam)

  {

  // Create a pointer to the dialog window

  CDay7Dlg* pWnd = (CDay7Dlg*) lparam;

  // add the font name to the list box

  pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);

  // Return 1 to continue font enumeration

  return 1;

  }

  //其中m_ctlFontList是一個列表控件變量

  六、一次只運行一個程序實例,假如已運行則退出

  if( FindWindow(NULL,"程序標題")) exit(0);

  七、得到當前鼠標所在位置

  CPoint pt;

  GetCursorPos(&pt); //得到位置

  八、上下文菜單事件觸發事件:OnContextMenu事件

  九、顯示和隱藏程序菜單

  CWnd *pWnd=AfxGetMainWnd();

  if(b_m) //隱藏菜單

  {

  pWnd->SetMenu(NULL);

  pWnd->DrawMenuBar();

  b_m=false;

  }

  else

  {

  CMenu menu;

  menu.LoadMenu(IDR_MAINFRAME); ////顯示菜單 也可改變菜單項

  pWnd->SetMenu(&menu);

  pWnd->DrawMenuBar();

  b_m=true;

  menu.Detach();

  }

  十、獲取可執行文件的圖標

  HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);

  if (hIcon &&hIcon!=(HICON)-1)

  {

  pDC->DrawIcon(10,10,hIcon);

  }

  DestroyIcon(hIcon);

  十一、窗口自動靠邊程序演示

  BOOL AdjustPos(CRect* lpRect)

  {//自動靠邊

  int iSX=GetSystemMetrics(SM_CXFULLSCREEN);

  int iSY=GetSystemMetrics(SM_CYFULLSCREEN);

  RECT rWorkArea;

  BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre

  a, 0);

  CRect rcWA;

  if(!bResult)

  {//假如調用不成功就利用GetSystemMetrics獲取屏幕面積

  rcWA=CRect(0,0,iSX,iSY);

  }

  else

  rcWA=rWorkArea;

  int iX=lpRect->left;

  int iY=lpRect->top;

  if(iX < rcWA.left + DETASTEP && iX!=rcWA.left)

  {//調整左

  //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);

  lpRect->OffsetRect(rcWA.left-iX,0);

  AdjustPos(lpRect);

  return TRUE;

  }

  if(iY < rcWA.top + DETASTEP && iY!=rcWA.top)

  {//調整上

  //pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);

  lpRect->OffsetRect(0,rcWA.top-iY);

  AdjustPos(lpRect);

  return TRUE;

  }

  if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcWA.right-lpRect->Width())

  {//調整右

  //pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE);

  lpRect->OffsetRect(rcWA.right-lpRect->right,0);

  AdjustPos(lpRect);

  return TRUE;

  }

  if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcWA.bottom-lpRect

  ->Height())

  {//調整下

  //pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE);

  lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom);

  return TRUE;

  }

  return FALSE;

  }

  //然後在ONMOVEING事件中使用所下過程調用

  CRect r=*pRect;

  AdjustPos(&r);

  *pRect=(RECT)r;

  十二、給系統菜單添加一個菜單項給系統菜單添加一個菜單項需要進行下述三個步驟: //首先,使用Resource Symbols對話(在View菜單中選擇Resource Symbols...可以顯

  //示該對話)定義菜單項ID,該ID應大於0x0F而小於0xF000;

  //其次,調用CWnd::GetSystemMenu獲取系統菜單的指針並調用CWnd:: Appendmenu將菜單

  //項添加到菜單中。 下例給系統菜單添加兩個新的int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)

  {

  //…

  //Make sure system menu item is in the right range.

  ASSERT(IDM_MYSYSITEM<0xF000);

  //Get pointer to system menu.

  CMenu* pSysMenu=GetSystemMenu(FALSE);

  ASSERT_VALID(pSysMenu);

  //Add a separator and our menu item to system menu.

  CString StrMenuItem(_T ("New menu item"));

  pSysMenu->AppendMenu(MF_SEPARATOR);

  pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem);

  //…

  }

  十三、運行其它程序

  1、運行EMAIL或網址

  char szMailAddress[80];

  strcpy(szMailAddress,"mailto:[email protected]");

  ShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL);

  2、運行可執行程序

  WinExec("notepad.exe",SW_SHOW); //運行計事本

  十四、動態增加或刪除菜單

  1、 增加菜單

  //添加

  CMenu *mainmenu;

  mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜單

  (mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符

  (mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,

  _T("Always on &Top")); //添加新的菜單項

  DrawMenuBar(); //重畫菜單

  2、 刪除菜單

  //刪除

  CMenu *mainmenu;

  mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜單

  CString str ;

  for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜單的項數。

  {

  (mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION);

  //將指定菜單項的標簽拷貝到指定的緩沖區。MF_BYPOSITION的解釋見上。

  if(str=="Always on &Top") //假如是剛才我們增加的菜單項,則刪除。

  {

  (mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION);

  break;

  }

  }

  十五、改變應用程序的圖標靜態更改:

  //修改圖標資源IDR_MAINFRAME。它有兩個圖標,一個是16*16的,另一個是32*32的,注重要一起修改。

  //動態更改: 向主窗口發送WM_SETIC

copyright © 萬盛學電腦網 all rights reserved