VC开发小技巧20个.docx
- 文档编号:25767109
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:14
- 大小:19.29KB
VC开发小技巧20个.docx
《VC开发小技巧20个.docx》由会员分享,可在线阅读,更多相关《VC开发小技巧20个.docx(14页珍藏版)》请在冰豆网上搜索。
VC开发小技巧20个
VC开发小技巧20个
一、打开CD-ROM
mciSendString("SetcdAudiodooropenwait",NULL,0,NULL);
二、关闭CD_ROM
mciSendString("SetcdAudiodoorclosedwait",NULL,0,NULL);
三、关闭计算机
OSVERSIONINFOOsVersionInfo;//包含操作系统版本信息的数据结构
OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OsVersionInfo);//获取操作系统版本信息
if(OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
//Windows98,调用ExitWindowsEx()函数重新启动计算机
DWORDdwReserved;
ExitWindowsEx(EWX_REBOOT,dwReserved);//可以改变第一个参数,实现注销用户、
//关机、关闭电源等操作
//退出前的一些处理程序
}
四、重启计算机
typedefint(CALLBACK*SHUTDOWNDLG)(int);//显示关机对话框函数的指针
HINSTANCEhInst=LoadLibrary("shell32.dll");//装入shell32.dll
SHUTDOWNDLGShutDownDialog;//指向shell32.dll库中显示关机对话框函数的指针
if(hInst!
=NULL)
{
//获得函数的地址并调用之
ShutDownDialog=(SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);
(*ShutDownDialog)(0);
}
五、枚举所有字体
LOGFONTlf;
lf.lfCharSet=DEFAULT_CHARSET;//InitializetheLOGFONTstructure
strcpy(lf.lfFaceName,"");
CClientDCdc(this);
//Enumeratethefontfamilies
:
:
EnumFontFamiliesEx((HDC)dc,&lf,
(FONTENUMPROC)EnumFontFamProc,(LPARAM)this,0);
//枚举函数
intCALLBACKEnumFontFamProc(LPENUMLOGFONTlpelf,
LPNEWTEXTMETRIClpntm,DWORDnFontType,longlparam)
{
//Createapointertothedialogwindow
CDay7Dlg*pWnd=(CDay7Dlg*)lparam;
//addthefontnametothelistbox
pWnd->m_ctlFontList.AddString(lpelf->elfLogFont.lfFaceName);
//Return1tocontinuefontenumeration
return1;
}
其中m_ctlFontList是一个列表控件变量
六、一次只运行一个程序实例,如果已运行则退出
if(FindWindow(NULL,"程序标题"))exit(0);
七、得到当前鼠标所在位置
CPointpt;
GetCursorPos(&pt);//得到位置
八、上下文菜单事件触发事件:
OnContextMenu事件
九、显示和隐藏程序菜单
CWnd*pWnd=AfxGetMainWnd();
if(b_m)//隐藏菜单
{
pWnd->SetMenu(NULL);
pWnd->DrawMenuBar();
b_m=false;
}
else
{
CMenumenu;
menu.LoadMenu(IDR_MAINFRAME);////显示菜单也可改变菜单项
pWnd->SetMenu(&menu);
pWnd->DrawMenuBar();
b_m=true;
menu.Detach();
}
十、获取可执行文件的图标
HICONhIcon=:
:
ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
if(hIcon&&hIcon!
=(HICON)-1)
{
pDC->DrawIcon(10,10,hIcon);
}
DestroyIcon(hIcon);
十一、窗口自动靠边程序演示
BOOLAdjustPos(CRect*lpRect)
{//自动靠边
intiSX=GetSystemMetrics(SM_CXFULLSCREEN);
intiSY=GetSystemMetrics(SM_CYFULLSCREEN);
RECTrWorkArea;
BOOLbResult=SystemParametersInfo(SPI_GETWORKAREA,sizeof(RECT),&rWorkArea,0);
CRectrcWA;
if(!
bResult)
{//如果调用不成功就利用GetSystemMetrics获取屏幕面积
rcWA=CRect(0,0,iSX,iSY);
}
else
rcWA=rWorkArea;
intiX=lpRect->left;
intiY=lpRect->top;
if(iX =rcWA.left) {//调整左 //pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE); lpRect->OffsetRect(rcWA.left-iX,0); AdjustPos(lpRect); returnTRUE; } if(iY =rcWA.top) {//调整上 //pWnd->SetWindowPos(NULL,iX,rcWA.top,0,0,SWP_NOSIZE); lpRect->OffsetRect(0,rcWA.top-iY); AdjustPos(lpRect); returnTRUE; } 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); returnTRUE; } 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); returnTRUE; } returnFALSE; } //然后在ONMOVEING事件中使用所下过程调用 CRectr=*pRect; AdjustPos(&r); *pRect=(RECT)r; 十二、给系统菜单添加一个菜单项 给系统菜单添加一个菜单项需要进行下述三个步骤: 首先,使用ResourceSymbols对话(在View菜单中选择ResourceSymbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000; 其次,调用CWnd: : GetSystemMenu获取系统菜单的指针并调用CWnd: : Appendmenu将菜单项添加到菜单中。 下例给系统菜单添加两个新的 intCMainFrame: : OnCreate(LPCREATESTRUCTlpCreateStruct) { … //Makesuresystemmenuitemisintherightrange. ASSERT(IDM_MYSYSITEM<0xF000); //Getpointertosystemmenu. CMenu*pSysMenu=GetSystemMenu(FALSE); ASSERT_VALID(pSysMenu); //Addaseparatorandourmenuitemtosystemmenu. CStringStrMenuItem(_T("Newmenuitem")); pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_MYSYSITEM,StrMenuItem); … } 十三、运行其它程序 //1、运行EMAIL或网址 charszMailAddress[80]; strcpy(szMailAddress,"mailto: netvc@"); 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("Alwayson&Top"));//添加新的菜单项 DrawMenuBar();//重画菜单 2、删除菜单 //删除 CMenu*mainmenu; mainmenu=AfxGetMainWnd()->GetMenu();//得到主菜单 CStringstr; for(inti=(mainmenu->GetSubMenu(0))->GetMenuItemCount()-1;i>=0;i--)//取得菜单的项数。 { (mainmenu->GetSubMenu(0))->GetMenuString(i,str,MF_BYPOSITION); //将指定菜单项的标签拷贝到指定的缓冲区。 MF_BYPOSITION的解释见上。 if(str=="Alwayson&Top")//如果是刚才我们增加的菜单项,则删除。 { (mainmenu->GetSubMenu(0))->DeleteMenu(i,MF_BYPOSITION); break; } 十五、改变应用程序的图标 静态更改: 修改图标资源IDR_MAINFRAME。 它有两个图标,一个是16*16的,另一个是32*32的,注意要一起修改。 动态更改: 向主窗口发送WM_SETICON消息.代码如下: HICONhIcon=AfxGetApp()->LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon); 十六、另一种改变窗口标题的方法 使用语句CWnd*m_pCWnd=AfxGetMainWnd(),然后,再以如下形式调用SetWindowText()函数: SetWindowText(*m_pCWnd,(LPCTSTR)m_WindowText);//m_WindowText可以是一个CString类的变量。 十七、剪切板上通过增强元文件拷贝图像数据 下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函数中。 CMetaFileDC*m_pMetaDC=newCMetaFileDC(); m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever"); //drawmetafile //dowhateveryouwanttodo: bitmaps,lines,text... //closemetafiledcandprepareforclipboard; HENHMETAFILEhMF=m_pMetaDC->CloseEnhanced(); //copytoclipboard OpenClipboard(); EmptyClipboard(); : : SetClipboardData(CF_ENHMETAFILE,hMF); CloseClipboard(); //DeleteMetaFile(hMF); deletem_pMetaDC; 十八、剪切板上文本数据的传送 把文本放置到剪接板上: CStringsource; //putyourtextinsource if(OpenClipboard()) { HGLOBALclipbuffer; 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; if(OpenClipboard()) { buffer=(char*)GetClipboardData(CF_TEXT); //dosomethingwithbufferhere //beforeitgoesoutofscope } CloseClipboard(); 十九、将捕捉屏幕图像到剪切版中 voidCShowBmpInDlgDlg: : OnCutScreen() { ShowWindow(SW_HIDE); RECTr_bmp={0,0,: : GetSystemMetrics(SM_CXSCREEN), : : GetSystemMetrics(SM_CYSCREEN)}; HBITMAPhBitmap; hBitmap=CopyScreenToBitmap(&r_bmp); //hWnd为程序窗口句柄 if(OpenClipboard()) { EmptyClipboard(); SetClipboardData(CF_BITMAP,hBitmap); CloseClipboard(); } ShowWindow(SW_SHOW); } HBITMAPCShowBmpInDlgDlg: : CopyScreenToBitmap(LPRECTlpRect) { //lpRect代表选定区域 { HDChScrDC,hMemDC; //屏幕和内存设备描述表 HBITMAPhBitmap,hOldBitmap; //位图句柄 intnX,nY,nX2,nY2; //选定区域坐标 intnWidth,nHeight; //位图宽度和高度 intxScrn,yScrn; //屏幕分辨率 //确保选定区域不为空矩形 if(IsRectEmpty(lpRect)) returnNULL; //为屏幕创建设备描述表 hScrDC=CreateDC("DISPLAY",NULL,NULL,NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC=CreateCompatibleDC(hScrDC); //获得选定区域坐标 nX=lpRect->left; nY=lpRect->top; nX2=lpRect->right; nY2=lpRect->bottom; //获得屏幕分辨率 xScrn=GetDeviceCaps(hScrDC,HORZRES); yScrn=GetDeviceCaps(hScrDC,VERTRES); //确保选定区域是可见的 if(nX<0) nX=0; if(nY<0) nY=0; if(nX2>xScrn) nX2=xScrn; if(nY2>yScrn) nY2=yScrn; nWidth=nX2-nX; nHeight=nY2-nY; //创建一个与屏幕设备描述表兼容的位图 hBitmap=CreateCompatibleBitmap (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); //返回位图句柄 returnhBitmap; } } 二十、如何将位图缩放显示在Static控件中 //在Staic控件内显示位图 voidCShowBmpInDlgDlg: : ShowBmpInStaic() { CBitmaphbmp; HBITMAPhbitmap; //将pStatic指向要显示的地方 CStatic*pStaic; pStaic=(CStatic*)GetDlgItem(IDC_IMAGE); //装载资源MM.bmp是我的一个文件名,用你的替换 hbitmap=(HBITMAP): : LoadImage(: : AfxGetInstanceHandle(),"MM.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); hbmp.Attach(hbitmap); //获取图片格式 BITMAPbm; hbmp.GetBitmap(&bm); CDCdcMem; dcMem.CreateCompatibleDC(GetDC()); CBitmap*poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp); CRectlRect; 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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 开发 技巧 20