其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

介绍Visual C++中的二十个常用方法


发布日期:2022年09月11日
 
介绍Visual C++中的二十个常用方法

打开CDROM
            mciSendString(Set cdAudio door open waitNULLNULL);      

关闭CD_ROM

          mciSendString(Set cdAudio door closed waitNULLNULL);      

关闭计算机

          OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构

OsVersionInfodwOSVersionInfoSize = sizeof(OSVERSIONINFO);

GetVersionEx(&OsVersionInfo); //获取操作系统版本信息

if(OsVersionInfodwPlatformId == VER_PLATFORM_WIN_WINDOWS)

{

//Windows调用ExitWindowsEx()函数重新启动计算机

DWORD dwReserved;

ExitWindowsEx(EWX_REBOOTdwReserved); //可以改变第一个参数实现注销用户

//关机关闭电源等操作

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

}      

重启计算机

          typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针

HINSTANCE hInst = LoadLibrary(shelldll); //装入shelldll

SHUTDOWNDLG ShutDownDialog; //指向shelldll库中显示关机对话框函数的指针

if(hInst != NULL)

{

//获得函数的地址并调用之

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

(*ShutDownDialog)();

}      

枚举所有字体

          LOGFONT lf;

lflfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure

strcpy(lflfFaceName);

CClientDC dc (this);

// Enumerate the font families

::EnumFontFamiliesEx((HDC) dc&lf                              

(FONTENUMPROC) EnumFontFamProc(LPARAM) this);

//枚举函数

int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf

LPNEWTEXTMETRIC lpntmDWORD nFontTypelong lparam)

{

// Create a pointer to the dialog window

CDayDlg* pWnd = (CDayDlg*) lparam;

// add the font name to the list box

pWnd >m_ctlFontListAddString(lpelf >elfLogFontlfFaceName);

// Return to continue font enumeration

return ;

}      

其中m_ctlFontList是一个列表控件变量

一次只运行一个程序实例如果已运行则退出

          if( FindWindow(NULL程序标题)) exit();      

得到当前鼠标所在位置

          CPoint pt;

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

上下文菜单事件触发事件OnContextMenu事件

显示和隐藏程序菜单


          CWnd *pWnd=AfxGetMainWnd();

if(b_m) //隐藏菜单

{

pWnd>SetMenu(NULL);

pWnd>DrawMenuBar();

b_m=false;

}

else

{

CMenu menu;

menuLoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项

pWnd>SetMenu(&menu);

pWnd>DrawMenuBar();

b_m=true;

menuDetach();

}      

获取可执行文件的图标

               

HICON hIcon=::ExtractIcon(AfxGetInstanceHandle()_T(NotePadexe));

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

{

pDC>DrawIcon(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 );

CRect rcWA;

if(!bResult)

{//如果调用不成功就利用GetSystemMetrics获取屏幕面积

rcWA=CRect(iSXiSY);

}

else

rcWA=rWorkArea;

int iX=lpRect>left;

int iY=lpRect>top;

if(iX < rcWAleft + DETASTEP && iX!=rcWAleft)

{//调整左

//pWnd>SetWindowPos(NULLrcWAleftiYSWP_NOSIZE);

lpRect>OffsetRect(rcWAleftiX);

AdjustPos(lpRect);

return TRUE;

}

if(iY < rcWAtop + DETASTEP && iY!=rcWAtop)

{//调整上

//pWnd>SetWindowPos(NULL iXrcWAtopSWP_NOSIZE);

lpRect>OffsetRect(rcWAtopiY);

AdjustPos(lpRect);

return TRUE;

}

if(iX + lpRect>Width() > rcWAright DETASTEP && iX !=rcWArightlpRect>Width())

{//调整右

//pWnd>SetWindowPos(NULL rcWArightrcWWidth()iYSWP_NOSIZE);

lpRect>OffsetRect(rcWArightlpRect>right);

AdjustPos(lpRect);

return TRUE;

}

if(iY + lpRect>Height() > rcWAbottom DETASTEP && iY !=rcWAbottomlpRect>Height())

{//调整下

//pWnd>SetWindowPos(NULL iXrcWAbottomrcWHeight()SWP_NOSIZE);

lpRect>OffsetRect(rcWAbottomlpRect>bottom);

return TRUE;

}

return FALSE;

}

//然后在ONMOVEING事件中使用所下过程调用

CRect r=*pRect;

AdjustPos(&r);

*pRect=(RECT)r;      

十二给系统菜单添加一个菜单项

给系统菜单添加一个菜单项需要进行下述三个步骤

首先使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID该ID应大于xF而小于xF

其次调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中下例给系统菜单添加两个新的

          int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)

{

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

ASSERT(IDM_MYSYSITEM<xF);

//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);

}      

十三运行其它程序

          //运行EMAIL或网址

char szMailAddress[];

strcpy(szMailAddressmailto:);

ShellExecute(NULL open szMailAddress NULL NULL SW_SHOWNORMAL);

//运行可执行程序

WinExec(notepadexeSW_SHOW); //运行计事本      

十四动态增加或删除菜单

增加菜单


          //添加

CMenu *mainmenu;

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

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

(mainmenu>GetSubMenu ())>AppendMenu(MF_STRINGID_APP_ABOUT_T(Always on

&Top)); //添加新的菜单项

DrawMenuBar(); //重画菜单      

删除菜单

          //删除

CMenu *mainmenu;

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

CString str ;

for(int i=(mainmenu>GetSubMenu ())>GetMenuItemCount();i>=;i) //取得菜

单的项数

{

(mainmenu>GetSubMenu ())>GetMenuString(istrMF_BYPOSITION);

//将指定菜单项的标签拷贝到指定的缓沖区MF_BYPOSITION的解释见上

if(str==Always on &Top) //如果是刚才我们增加的菜单项则删除

{

(mainmenu>GetSubMenu ())>DeleteMenu(iMF_BYPOSITION);

break;

}      

十五改变应用程序的图标

静态更改 修改图标资源IDR_MAINFRAME它有两个图标一个是*另一个是*注意要一起修改

动态更改 向主窗口发送WM_SETICON消息代码如下

          HICON hIcon=AfxGetApp()>LoadIcon(IDI_ICON);

ASSERT(hIcon);

AfxGetMainWnd()>SendMessage(WM_SETICONTRUE(LPARAM)hIcon);      

十六另一种改变窗口标题的方法

使用语句 CWnd* m_pCWnd = AfxGetMainWnd( )然后再以如下形式调用SetWindowText()函数

SetWindowText( *m_pCWnd(LPCTSTR)m_WindowText)// m_WindowText可以是一个CSt ring类的变量

十七剪切板上通过增强元文件拷贝图像数据

下面代码拷贝通过元文件拷贝图像数据到任何应用程序其可以放置在CView派生类的函数中

          CMetaFileDC * m_pMetaDC = new CMetaFileDC();

m_pMetaDC>CreateEnhanced(GetDC()NULLNULLwhatever);

//draw meta file

//do what ever you want to do: bitmaps lines text

//close meta file dc and prepare for clipboard;

HENHMETAFILE hMF = m_pMetaDC>CloseEnhanced();

//copy to clipboard

OpenClipboard();

EmptyClipboard();

::SetClipboardData(CF_ENHMETAFILEhMF);                           

CloseClipboard();

//DeleteMetaFile(hMF);

delete m_pMetaDC;      

十八剪切板上文本数据的传送

把文本放置到剪接板上

          CString source;

//put your text in source

if(OpenClipboard())

{

HGLOBAL clipbuffer;

char * buffer;

EmptyClipboard();

clipbuffer = GlobalAlloc(GMEM_DDESHARE sourceGetLength()+);

buffer = (char*)GlobalLock(clipbuffer);

strcpy(buffer LPCSTR(source));

GlobalUnlock(clipbuffer);

SetClipboardData(CF_TEXTclipbuffer);

CloseClipboard();

}      

从剪接板上获取文本

          char * buffer;

if(OpenClipboard())

{

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={::GetSystemMetrics(SM_CXSCREEN)

::GetSystemMetrics(SM_CYSCREEN)};                              

HBITMAP hBitmap;

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;

// 位图句柄

int nX nY nX nY;

// 选定区域坐标

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;

nX = lpRect>right;

nY = lpRect>bottom;

// 获得屏幕分辨率

xScrn = GetDeviceCaps(hScrDC HORZRES);

yScrn = GetDeviceCaps(hScrDC VERTRES);

//确保选定区域是可见的

if (nX<)

nX = ;

if (nY<)

nY = ;

if (nX>xScrn)

nX = xScrn;

if (nY>yScrn)

nY = yScrn;

nWidth = nX nX;

nHeight = nY nY;

// 创建一个与屏幕设备描述表兼容的位图

hBitmap = CreateCompatibleBitmap

(hScrDC nWidth nHeight);

// 把新位图选到内存设备描述表中

hOldBitmap =(HBITMAP)SelectObject(hMemDC hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中

BitBlt(hMemDC nWidth nHeight

hScrDC nX nY SRCCOPY);

//得到屏幕位图的句柄

hBitmap = (HBITMAP)SelectObject(hMemDC hOldBitmap);

//清除

DeleteDC(hScrDC);

DeleteDC(hMemDC);

// 返回位图句柄

return hBitmap;

}

}      

二十如何将位图缩放显示在Static控件中

          //在Staic控件内显示位图

void CShowBmpInDlgDlg::ShowBmpInStaic()

{

CBitmap hbmp;

HBITMAP hbitmap;

//将pStatic指向要显示的地方

CStatic *pStaic;

pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);

//装载资源 MMbmp是我的一个文件名用你的替换

hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle()MMbmp

IMAGE_BITMAPLR_LOADFROMFILE|LR_CREATEDIBSECTION);

hbmpAttach(hbitmap);

//获取图片格式

BITMAP bm;

hbmpGetBitmap(&bm);

CDC dcMem;

dcMemCreateCompatibleDC(GetDC());

CBitmap *poldBitmap=(CBitmap*)dcMemSelectObject(hbmp);

CRect lRect;

pStaic>GetClientRect(&lRect);

//显示位图

pStaic>GetDC()>StretchBlt(lRectleft lRecttop lRectWidth()lRectHeight()

&dcMem bmbmWidthbmbmHeightSRCCOPY);

dcMemSelectObject(&poldBitmap);

}      

               

上一篇:下一代C++:C++/CLI语言的属性探索

下一篇:经验分享:学好VC++的良好习惯