1. 程式人生 > >vc++ 20個小技巧

vc++ 20個小技巧

一、開啟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:

[email protected]");
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);
}

相關推薦

vc++ 20技巧

一、開啟CD-ROM mciSendString("Set cdAudio door open wait",NULL,0,NULL); 二、關閉CD_ROM mciSendString("Set cdAudio door closed wait",NULL,0,NULL)

前端新手程式設計師不知道的 20技巧

1.作為前端開發者,使用雙顯示器能大幅提高開發效率。2.學程式設計最好的語言不是PHP,是Eng

總結自己使用shell命令行經常使用到的8技巧

技巧 span get ash lan host tab localhost 沒有 原創blog,轉載請註明出處 Shell是命令解釋器 [[email protected]/* */ ~]# cat /etc/shells 查看本系統共支持哪些shel

五十技巧提高PHP執行效率(一)

雙引號 超時 而不是 也會 per 遠程 設置 作用 我們 在項目開發過程中,經常遇到了一些PHP處理程序性能底下的情況,程序運行在centos+nginx環境,雖然這個有很多的原因如:服務器本身配置,運行環境nginx服務,php-fpm配置等等,更多有一點仍然是PHPe

作為運營新人,取標題的這10技巧你需要掌握

運營當我們一看到“ 標題黨 ” 這三個字,不用多說,心裏絕對都是壞的印象。一篇 shit 一樣的文章,靠一個好的標題,是可以獲得不錯的點擊量,但 內容運營 的最終目的是為了數據好看嗎?起一個好的標題確實是一個文章能否獲得關註和點擊率的關鍵,但如何在不成為“ 標題黨 ” 的前提下取 好標題呢?近日fansir

jquery操作復選框(checkbox)的12技巧總結

== 索引 復選框 小技巧 rst jquery操作 radio rem val 1、獲取單個checkbox選中項(三種寫法) $("input:checkbox:checked").val() 或者 $("input:[type=‘checkbox‘]:checked

NuGet的幾技巧

com packages 影響 頁面 兼容 images eight 記錄 cef 因為可視化庫程序包管理器的局限性,有很多需要的功能在界面中無法完成。 以下技巧均需要在“程序包管理器控制臺”中使用命令來完成。 一、改變項目目標框架後,更新程序包 當改變項目的目標框架後,無

HQL語句的3技巧

ret region enum hibernate 完整版 from 屬性 lan 速度 1.巧用new map 在查詢表中部分字段的值時,我們可以用map來封裝這些字段的值,可以提高查詢效率,而且查出數據也更小,傳輸到頁面的速度也更快。 如:查詢角色時,我們

高效的幾技巧

編碼格式 輸出 indent 默認 asc encode mps family 寫入 json json 序列化dumps之後,數據會變成很長的一行,如果,數據量非常大就會相當不易查看,使用indent參數來輸出便於查看的JSON。 如: { "終點站": "貴陽站", "

Unity 3D 實用的10技巧

知新樹 寧金峰Unity引擎,上手簡單易懂,但是很少有人對Unity編輯器的功能做一個全面細致的了解,一些非常實用的小功能在日常使用中很難被發現,但它們對工作效率的提升是有不小的幫助的。1)鎖定Inspector – 在inspector面板上方有一個小“鎖”圖標,點擊鎖住後可以將inspector面板鎖定在

技術好卻進不了大公司?iOS程序員面試的幾技巧你可要收好了

朋友 知識 了解 一點 今天 刪除 就會 為什麽 年輕 前言: 有很多程序員,專業技術挺好,項目經驗充足,簡歷上金碧輝煌,也面試了很多國內大廠,但就是沒有一家能成功的。處境可以說是相當尷尬。 大家都知道程序員本身就是要吃年輕飯,不僅是技術活,也是體力活。早點跳槽,早點漲薪,

第八天,scrapy的幾技巧

一次 load 動態 content btn ajax加載 select efi def 一. 微博模擬登陸 1. 百度搜微博開放平臺可滿足爬取量不大的情況 2. 微博模擬登陸和下拉鼠標應對ajax加載 from selenium import webdriver

NetLogo程式設計的幾技巧

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

乾貨:閱讀跟蹤 Java 原始碼的幾技巧

今天跟大家分享一下我平時閱讀原始碼的幾個小技巧,對於閱讀Java中介軟體如Spring、Dubbo等框架原始碼的同學有一定幫助。 本文基於Eclipse IDE,我們每天都使用的IDE其實提供了很多強大的功能,掌握它們,往往能夠事半功倍。 1、Quick Type Hierarchy 快速檢視類繼承體

PuTTY幾技巧

增加視窗儲存的輸出 執行了一個命令,輸出了好多東西,但是預設的配置下,PuTTY只儲存了最後200行的內容,滿足不了我們的需求。 我們可以在標題欄上點右鍵選擇 Change settings…,在配置視窗的左邊選擇Window,修改右邊的 Lines of scrollback,改大

Python中使用字典的幾技巧

讀取 只需要 管理 解包 領取 意思 創建 小技巧 其它 1 解包 所謂解包,就是將字典通過 ** 操作符轉為 Key=Value 的形式,這種形式可以直接傳給函數作為關鍵字參數。 說說適用的幾種情況。 1.1 搜索拼接條件 當應用中使用類似 SQLAlchemy 的 OR

5技巧讓你寫出更好的 JavaScript 條件語句

來源:掘金,譯者:Hopsken 連結:https://juejin.im/post/5bb9e3085188255c352d7326 作者:@Jecelyn Yeen 原文:https://scotch.io/tutorials/5-tips-to-write-better-conditi

php smarty模板引擎的6技巧

轉載地址:http://www.jb51.net/article/49318.htm 下面本文將以具體的例子一一分析: capture標籤 capture的中文意思是抓取,它的作用是抓取模板輸出的資料,當我們需要它的時候,呼叫它,以得到抓取資料的目的。如下例子:

Charles抓包三技巧:抓取Https、重定向某域名、限流

一、抓取Https--以Android平臺為例,其他平臺類似: 總計三步: 1.PC端charles安裝CA證書 開啟charles help-->SSL Proxying-->Install Charles Root Certificate,下圖為安好的證書:

Python的24技巧

python中相對不常見卻很實用的小竅門 空談不如來碼程式碼吧: 交換變數值 """pythonic way of value swapping""" a, b = 5, 10 print(a, b) a, b = b, a print(a, b) 給列表元素建立新