1、VC常用操作源码总结目录CD-ROM 1关闭计算机 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
2、一启动就最大化和最小化 17限制窗口的大小 17创建一个字回绕的CEditView 17程序保持极小状态 18移动窗口 18重置窗口的大小 18单击窗口标题栏以外区域使窗口移动 18改变视窗的背景颜色 19防止主框窗口在其说明中显示活动的文档名 20获取有关窗口正在处理的当前消息的信息 20代码中获取工具条和状态条的指针 21使能和禁止工具条的工具提示 21如何创建一个不规则形状的窗口 21获取应用程序的实例句柄 24如何编程结束应用程序 24创建和使用无模式对话框 24怎样加载其他的应用程序 25使窗口始终在最前方 26在对话框中显示一个位图 27获取一个对话控件的指针 27改变控件的字体
3、27OLE控件中使用OLE_COLOR数据类型 28在不使用通用文件打开对话的情况下如何显示一个文件列表 28旋转按钮控件 29用位图显示下压按钮 29创建三态下压按钮 30如何动态创建控件 30限制编辑框中的准许字符 30向列表框中添加多个项时防止闪烁 31向编辑控件中添加文本 32访问预定义的GDI对象 32获取GDI对象的属性信息 33实现一个橡皮区矩形 34更新翻转背景颜色的文本 35创建一个具有特定点大小的字体 36如何计算一个串的大小 36显示旋转文本 37显示包含标签字符的串 38串太长时如何在其末尾显示一个省略号 39为什么即使调用EnableMenuItem菜单项后,菜单项还
4、处于禁止状态 39在用户环境中如何确定系统显示元素的颜色 40查询和设置系统参数 40确定当前屏幕分辨率 40使用预定义Windows光标 41检索原先的Task Manager应用程序使用的任务列表 41确定Windows和Windows系统目录 42在哪儿创建临文件 42我怎样才能建立一个等待光标 43访问桌面窗口 43怎样用COLORREF 44在应用程序中循环浏览已经打开的文档、视图 44MFC在窗口标题栏 45CD-ROM 打开:mciSendString(Set cdAudio door open wait,NULL,0,NULL); 关闭:mciSendString(Set cd
5、Audio door closed wait,NULL,0,NULL); 关闭计算机 OSVERSIONINFO OsVersionInfo; /包含操作系统版本信息的数据结构 OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&OsVersionInfo); /获取操作系统版本信息 if(OsVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) /Windows98,调用ExitWindowsEx()函数重新启动计算机 DWORD dwRese
6、rved; ExitWindowsEx(EWX_REBOOT,dwReserved); /可以改变第一个参数,实现注销用户、 /关机、关闭电源等操作 / 退出前的一些处理程序 重启计算机 typedef int (CALLBACK *SHUTDOWNDLG)(int); /显示关机对话框函数的指针 HINSTANCE hInst = LoadLibrary(shell32.dll); /装入shell32.dll SHUTDOWNDLG ShutDownDialog; /指向shell32.dll库中显示关机对话框函数的指针 if(hInst != NULL) /获得函数的地址并调用之 Shu
7、tDownDialog = (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) EnumFontF
8、amProc,(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.lfFaceN
9、ame); / Return 1 to continue font enumeration return 1; 其中m_ctlFontList是一个列表控件变量只运行一个程序实例 if( FindWindow(NULL,程序标题) exit(0);或CreateMutx:HANDLE m_hMutex = :CreateMutex(NULL,true,_T(MBD); if(GetLastError() = ERROR_ALREADY_EXISTS) ReleaseMutex(m_hMutex); :MessageBox(NULL,_T(应用程序已经运行!),_T(系统提示),MB_OK|MB
10、_ICONSTOP); return FALSE; 也可以用CreateThread,方法同CreateMutex得到鼠标位置 CPoint pt; GetCursorPos(&pt); /得到位置 显示和隐藏程序菜单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
11、(); 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
12、_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 SetWindowPos(NULL,rcWA.left,iY,0,0
13、,SWP_NOSIZE); lpRect-OffsetRect(rcWA.left-iX,0); AdjustPos(lpRect); return TRUE; if(iY 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-W idth() /调整右 /pWnd-SetWindow
14、Pos(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-Offs
15、etRect(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: Appe
16、ndmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的int CMainFrame: OnCreate (LPCREATESTRUCT lpCreateStruct)/Make sure system menu item is in the right range.ASSERT (IDM_MYSYSITEM &0xFFF0)=IDM_MYSYSITEM)ASSERT (IDM-MYSYSITEMAppendmenu (MF_SEPARATOR)pSysMenu-AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem)现在,选择系统菜单项时用户应
17、进行检测。使用ClassWizard处理WM_SYSCOMMAND消息并检测用户菜单的nID参数:void CMainFrame: OnSysCommand (UINT nID,LPARAM lParam)/Determine if our system menu item was selected.if ( (nID & 0xFFF0)=IDM_MYSYSITEM)/TODO-process system menu itemelseCMDIFrameWnd :OnSysCommand (nID, lParam)最后,一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息,这
18、可以通过增加一个包含系统菜单基ID的串表的入口来实现。动态增加或删除菜单 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 *mainm
19、enu; 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-GetSubMen
20、u (0)-DeleteMenu(i,MF_BYPOSITION); break; 改变应用程序的图标 静态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是3 2*32的,注意要一起修改。 动态更改: 向主窗口发送WM_SETICON消息.代码如下: HICON hIcon=AfxGetApp()-LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd()-SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon); 改变窗口标题的方法 使用语句 CWnd* m_pCWnd = Afx
21、GetMainWnd( ),然后,再以如下形式调用SetWindowTe xt()函数: SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);/ m_WindowText可以是一个CSt ring类的变量。如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在联机帮助中找不到它,它在AFXPRIV.H中半文档化, 在以后发行的MFC中将文档化。AfxSetWindowText的实现如下:voik AFXAPI AfxSetWindo
22、wText (HWND hWndCtrl , LPCTSTR IpszNew )itn nNewLen= Istrlen (Ipaznew)TCHAR szOld 256/fast check to see if text really changes (reducesflash in thecontrols )if (nNewLen _contof (szOld) : : GetWindowText (hWndCrtl, szOld , _countof (szOld) !=nNewLen Istrcmp (szOld , IpszNew)! = 0/change it: : SetWind
23、owText(hWndCtrl , IpszNew )剪切板上通过增强元文件拷贝图像数据 下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在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. /close meta file dc and prepare for clipbo
24、ard; HENHMETAFILE hMF = m_pMetaDC-CloseEnhanced(); /copy to clipboard OpenClipboard(); EmptyClipboard(); :SetClipboardData(CF_ENHMETAFILE,hMF); CloseClipboard(); /DeleteMetaFile(hMF); delete m_pMetaDC; 剪切板上文本数据的传送 把文本放置到剪接板上: CString source; /put your text in source if(OpenClipboard() HGLOBAL clipbu
25、ffer; 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()
26、buffer = (char*)GetClipboardData(CF_TEXT); /do something with buffer here /before it goes out of scope CloseClipboard(); 捕捉屏幕图像到剪切板中 void CShowBmpInDlgDlg:OnCutScreen() ShowWindow(SW_HIDE); RECT r_bmp=0,0,:GetSystemMetrics(SM_CXSCREEN), :GetSystemMetrics(SM_CYSCREEN); HBITMAP hBitmap; hBitmap=CopySc
27、reenToBitmap(&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; / 位图句柄 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 = lpRect-top; n
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1