VC常用20个函数

来源:互联网 发布:ubuntu编译openjdk7 编辑:程序博客网 时间:2024/06/05 17:14
 

一、打开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);

}

 

 

原创粉丝点击