VC常用操作源码总结.docx
《VC常用操作源码总结.docx》由会员分享,可在线阅读,更多相关《VC常用操作源码总结.docx(53页珍藏版)》请在冰豆网上搜索。
![VC常用操作源码总结.docx](https://file1.bdocx.com/fileroot1/2023-1/22/49afd38d-3c15-4b2f-a93f-284e1e688dae/49afd38d-3c15-4b2f-a93f-284e1e688dae1.gif)
VC常用操作源码总结
目录
CD-ROM1
关闭计算机1
重启计算机1
枚举所有字体1
只运行一个程序实例2
得到鼠标位置2
显示和隐藏程序菜单2
获取可执行文件的图标3
窗口自动靠边程序演示3
系统菜单添加菜单项5
动态增加或删除菜单6
改变应用程序的图标7
改变窗口标题的方法7
剪切板上通过增强元文件拷贝图像数据8
剪切板上文本数据的传送8
捕捉屏幕图像到剪切板中9
将位图缩放显示11
改变对话框中控件的颜色12
修改窗口外观14
获得应用程序主窗口的指针14
确定应用程序的路径14
获得其他程序的图标15
获得各种目录信息15
如何自定义消息16
改变窗口的缺省风格16
将窗口居中显示16
一启动就最大化和最小化17
限制窗口的大小17
创建一个字回绕的CEditView17
程序保持极小状态18
移动窗口18
重置窗口的大小18
单击窗口标题栏以外区域使窗口移动18
改变视窗的背景颜色19
防止主框窗口在其说明中显示活动的文档名20
获取有关窗口正在处理的当前消息的信息20
代码中获取工具条和状态条的指针21
使能和禁止工具条的工具提示21
如何创建一个不规则形状的窗口21
获取应用程序的实例句柄24
如何编程结束应用程序24
创建和使用无模式对话框24
怎样加载其他的应用程序25
使窗口始终在最前方26
在对话框中显示一个位图27
获取一个对话控件的指针27
改变控件的字体27
OLE控件中使用OLE_COLOR数据类型28
在不使用通用文件打开对话的情况下如何显示一个文件列表28
旋转按钮控件29
用位图显示下压按钮29
创建三态下压按钮30
如何动态创建控件30
限制编辑框中的准许字符30
向列表框中添加多个项时防止闪烁31
向编辑控件中添加文本32
访问预定义的GDI对象32
获取GDI对象的属性信息33
实现一个橡皮区矩形34
更新翻转背景颜色的文本35
创建一个具有特定点大小的字体36
如何计算一个串的大小36
显示旋转文本37
显示包含标签字符的串38
串太长时如何在其末尾显示一个省略号39
为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态39
在用户环境中如何确定系统显示元素的颜色40
查询和设置系统参数40
确定当前屏幕分辨率40
使用预定义Windows光标41
检索原先的TaskManager应用程序使用的任务列表41
确定Windows和Windows系统目录42
在哪儿创建临文件42
我怎样才能建立一个等待光标43
访问桌面窗口43
怎样用COLORREF44
在应用程序中循环浏览已经打开的文档、视图44
MFC在窗口标题栏45
CD-ROM
打开:
mciSendString("SetcdAudiodooropenwait",NULL,0,NULL);
关闭:
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);
或CreateMutx:
HANDLEm_hMutex=:
:
CreateMutex(NULL,true,_T("MBD"));
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
ReleaseMutex(m_hMutex);
:
:
MessageBox(NULL,_T("应用程序已经运行!
"),_T("系统提示"),MB_OK|MB_ICONSTOP);
returnFALSE;
}
也可以用CreateThread,方法同CreateMutex
得到鼠标位置
CPointpt;
GetCursorPos(&pt);//得到位置
显示和隐藏程序菜单
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),&rWorkAre
a,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->W
idth())
{//调整右
//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&0xFFF0)==IDM_MYSYSITEM)
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)
…
}
现在,选择系统菜单项时用户应进行检测。
使用ClassWizard处理WM_SYSCOMMAND消息并检测用户菜单的nID参数:
voidCMainFrame:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
//Determineifoursystemmenuitemwasselected.
if((nID&0xFFF0)==IDM_MYSYSITEM)
{
//TODO-processsystemmenuitem
}
else
CMDIFrameWnd:
:
OnSysCommand(nID,lParam)
}
最后,一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息,这可以通过增加一个包含系统菜单基ID的串表的入口来实现。
动态增加或删除菜单
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的,另一个是3
2*32的,注意要一起修改。
动态更改:
向主窗口发送WM_SETICON消息.代码如下:
HICONhIcon=AfxGetApp()->LoadIcon(IDI_ICON);
ASSERT(hIcon);
AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon);
改变窗口标题的方法
使用语句CWnd*m_pCWnd=AfxGetMainWnd(),然后,再以如下形式调用SetWindowTe
xt()函数:
SetWindowText(*m_pCWnd,(LPCTSTR)m_WindowText);//m_WindowText可以是一个CSt
ring类的变量。
如果需要经常修改窗口的标题(注:
控件也是窗口),应该考虑使用半文档化的函数AfxSetWindowText。
该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在联机帮助中找不到它,它在AFXPRIV.H中半文档化,在以后发行的MFC中将文档化。
AfxSetWindowText的实现如下:
voikAFXAPIAfxSetWindowText(HWNDhWndCtrl,LPCTSTRIpszNew)
{
itnnNewLen=Istrlen(Ipaznew)
TCHARszOld[256]
//fastchecktoseeiftextreallychanges(reduces
flashinthe
controls)
if(nNewLen>_contof(szOld)
||:
:
GetWindowText(hWndCrtl,szOld,_countof(szOld)!
=nNewLen
||Istrcmp(szOld,IpszNew)!
=0
{
//changeit
:
:
SetWindowText(hWndCtrl,IpszNew)
}
}
剪切板上通过增强元文件拷贝图像数据
下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在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;
n