1、VC开发小技巧20个VC开发小技巧20个一、打开CD-ROMmciSendString(Set cdAudio door open wait,NULL,0,NULL);二、关闭CD_ROMmciSendString(Set cdAudio door closed wait,NULL,0,NULL);三、关闭计算机OSVERSIONINFO OsVersionInfo;/包含操作系统版本信息的数据结构OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&OsVersionInfo); /获取操作系统版本信息
2、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); /装
3、入shell32.dllSHUTDOWNDLG ShutDownDialog; /指向shell32.dll库中显示关机对话框函数的指针if(hInst != NULL)/获得函数的地址并调用之ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);(*ShutDownDialog)(0);五、枚举所有字体LOGFONT lf;lf.lfCharSet = DEFAULT_CHARSET; / Initialize the LOGFONT structurestrcpy(lf.lfFaceName,);CClientDC dc
4、 (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 windowCDay7Dlg* pWnd = (CDay7Dlg*) lparam;/ ad
5、d the font name to the list boxpWnd -m_ctlFontList.AddString(lpelf -elfLogFont.lfFaceName);/ Return 1 to continue font enumerationreturn 1;其中m_ctlFontList是一个列表控件变量六、一次只运行一个程序实例,如果已运行则退出if( FindWindow(NULL,程序标题) exit(0);七、得到当前鼠标所在位置CPoint pt;GetCursorPos(&pt); /得到位置八、上下文菜单事件触发事件:OnContextMenu事件九、显示和隐
6、藏程序菜单CWnd *pWnd=AfxGetMainWnd(); if(b_m)/隐藏菜单pWnd-SetMenu(NULL);pWnd-DrawMenuBar();b_m=false;elseCMenu menu;menu.LoadMenu(IDR_MAINFRAME); /显示菜单 也可改变菜单项pWnd-SetMenu(&menu);pWnd-DrawMenuBar();b_m=true;menu.Detach();十、获取可执行文件的图标HICON hIcon=:ExtractIcon(AfxGetInstanceHandle(),_T(NotePad.exe),0);if (hIco
7、n &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), &rWorkArea, 0); CRect
8、rcWA;if(!bResult)/如果调用不成功就利用GetSystemMetrics获取屏幕面积rcWA=CRect(0,0,iSX,iSY);elsercWA=rWorkArea;int iX=lpRect-left;int iY=lpRect-top;if(iX SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);lpRect-OffsetRect(rcWA.left-iX,0);AdjustPos(lpRect);return TRUE;if(iY SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE);
9、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
10、-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;十二、给系统菜单添加一个菜单项给系统菜单
11、添加一个菜单项需要进行下述三个步骤:首先,使用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_MYSY
12、SITEMAppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem);十三、运行其它程序/1、运行EMAIL或网址char szMailAddress80; strcpy(szMailAddress,mailto:netvc);ShellExecute(NULL, open, szMailAddress, NULL, NULL, SW_SHOWNORMAL);/2、运行可执行程序WinExec(notepad.exe,SW_SHOW); /运行计事本十四、动态增加或删除菜单1、 增加菜单
13、/添加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(); /得到主菜单CStri
14、ng 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; 十五、改变应用程序的图标静
15、态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是32*32的,注意要一起修改。动态更改: 向主窗口发送WM_SETICON消息.代码如下: HICON hIcon=AfxGetApp()-LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd()-SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon); 十六、另一种改变窗口标题的方法使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowText()函数:SetWind
16、owText( *m_pCWnd,(LPCTSTR)m_WindowText);/ m_WindowText可以是一个CString类的变量。十七、剪切板上通过增强元文件拷贝图像数据下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函数中。CMetaFileDC * m_pMetaDC = new CMetaFileDC();m_pMetaDC-CreateEnhanced(GetDC(),NULL,NULL,whatever);/draw meta file/do what ever you want to do: bitmaps, lines, text./c
17、lose meta file dc and prepare for clipboard;HENHMETAFILE hMF = m_pMetaDC-CloseEnhanced();/copy to clipboardOpenClipboard();EmptyClipboard();:SetClipboardData(CF_ENHMETAFILE,hMF);CloseClipboard();/DeleteMetaFile(hMF);delete m_pMetaDC;十八、剪切板上文本数据的传送把文本放置到剪接板上:CString source; /put your text in sourceif
18、(OpenClipboard()HGLOBAL clipbuffer;char * buffer;EmptyClipboard();clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);buffer = (char*)GlobalLock(clipbuffer);strcpy(buffer, LPCSTR(source);GlobalUnlock(clipbuffer);SetClipboardData(CF_TEXT,clipbuffer);CloseClipboard();从剪接板上获取文本:char * buffer;
19、if(OpenClipboard()buffer = (char*)GetClipboardData(CF_TEXT);/do something with buffer here /before it goes out of scopeCloseClipboard(); 十九、将捕捉屏幕图像到剪切版中void CShowBmpInDlgDlg:OnCutScreen() ShowWindow(SW_HIDE);RECT r_bmp=0,0,:GetSystemMetrics(SM_CXSCREEN),:GetSystemMetrics(SM_CYSCREEN); HBITMAP hBitma
20、p;hBitmap=CopyScreenToBitmap(&r_bmp);/hWnd为程序窗口句柄 if (OpenClipboard() EmptyClipboard(); SetClipboardData(CF_BITMAP, hBitmap); CloseClipboard(); ShowWindow(SW_SHOW);HBITMAP CShowBmpInDlgDlg:CopyScreenToBitmap(LPRECT lpRect)/lpRect 代表选定区域 HDC hScrDC, hMemDC; / 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; /
21、 位图句柄 int nX, nY, nX2, nY2; / 选定区域坐标 int nWidth, nHeight; / 位图宽度和高度 int xScrn, yScrn; / 屏幕分辨率 / 确保选定区域不为空矩形 if (IsRectEmpty(lpRect) return NULL; /为屏幕创建设备描述表 hScrDC = CreateDC(DISPLAY, NULL, NULL, NULL); /为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); / 获得选定区域坐标 nX = lpRect-left; nY = lpRe
22、ct-top; nX2 = lpRect-right; nY2 = lpRect-bottom; / 获得屏幕分辨率 xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); /确保选定区域是可见的 if (nX0) nX = 0; if (nYxScrn) nX2 = xScrn; if (nY2yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; / 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateComp
23、atibleBitmap (hScrDC, nWidth, nHeight); / 把新位图选到内存设备描述表中 hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap); / 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); /得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); /清除 DeleteDC(hScrDC); DeleteDC(hMemDC); /
24、 返回位图句柄 return hBitmap; 二十、如何将位图缩放显示在Static控件中/在Staic控件内显示位图void CShowBmpInDlgDlg:ShowBmpInStaic() CBitmap hbmp;HBITMAP hbitmap;/将pStatic指向要显示的地方CStatic *pStaic;pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);/装载资源 MM.bmp是我的一个文件名,用你的替换hbitmap=(HBITMAP):LoadImage (:AfxGetInstanceHandle(),MM.bmp,IMAGE_BITMAP,0
25、,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);hbmp.Attach(hbitmap);/获取图片格式BITMAP bm;hbmp.GetBitmap(&bm);CDC dcMem;dcMem.CreateCompatibleDC(GetDC();CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);CRect lRect;pStaic-GetClientRect(&lRect);lRect.NormalizeRect();/显示位图pStaic-GetDC()-StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);dcMem.SelectObject(&poldBitmap);