[轉載]VC中的一些常用方法(20條)

文章來源: www.csdn.net
作者blog: http://blog.csdn.net/oury/

VC中的一些常用方法


//一、打開CD-ROM

mciSendString("Set cdAudio door open wait",NULL,0,NULL);

//二、關閉CD_ROM

mciSendString("Set cdAudio door closed wait",NULL,0,NULL);

//三、關閉計算機

OSVERSIONINFO?OsVersionInfo;?//包含操作系統版本信息的數據結構
OsVersionInfo.dwOSVersionInfoSize?=?sizeof(OSVERSIONINFO);
GetVersionEx(
&OsVersionInfo);?//獲取操作系統版本信息
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");?//裝入shell32.dll
SHUTDOWNDLG?ShutDownDialog;?//指向shell32.dll庫中顯示關機對話框函數的指針
if(hInst?!=?NULL)
{
??
//獲得函數的地址并調用之
??ShutDownDialog?=?(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)?EnumFontFamProc,(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.lfFaceName);
??
//?Return?1?to?continue?font?enumeration
??return?1;
}


//其中m_ctlFontList是一個列表控件變量

//六、一次只運行一個程序實例,如果已運行則退出

if( FindWindow(NULL,"程序標題")) exit(0);

//七、得到當前鼠標所在位置

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

//八、上下文菜單事件觸發事件:OnContextMenu事件

//九、顯示和隱藏程序菜單

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();
??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_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?<?rcWA.left?+?DETASTEP?&&?iX!=rcWA.left)
??
{//調整左
????
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE);
????lpRect->OffsetRect(rcWA.left-iX,0);
????AdjustPos(lpRect);
????
return?TRUE;
??}

??
if(iY?<?rcWA.top?+?DETASTEP?&&?iY!=rcWA.top)
??
{//調整上
????
//pWnd->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->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->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;

//十二、給系統菜單添加一個菜單項給系統菜單添加一個菜單項需要進行下述三個步驟:
//首先,使用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_MYSYSITEM<0xF000);
??
//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);
??
//
}


//十三、運行其它程序

//1、運行EMAIL或網址

char szMailAddress[80];
strcpy(szMailAddress,"mailto:netvc@21cn.com");
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("Always on &Top")); //添加新的菜單項
? ? ? ? ? ? ? ? ? ? ? ? ? DrawMenuBar(); //重畫菜單
//2、 刪除菜單
//刪除
CMenu *mainmenu;
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->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION);
? ? break;
? }
}

//十五、改變應用程序的圖標靜態更改:

//修改圖標資源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()函數:
SetWindowText( *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...
//close meta file dc and prepare for clipboard;
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 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;
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
={0,0,::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,?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;
????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);
????
//?返回位圖句柄
????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,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);
??
//顯示位圖
??pStaic->GetDC()->StretchBlt(lRect.left?,lRect.top?,lRect.Width(),lRect.Height(),
????
&dcMem,0?,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
??dcMem.SelectObject(
&poldBitmap);
}