首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 常用系統操作 20 例精選

     編輯:VC++

精選 20 項實用 VC++ 系統操作技巧

1. 開啟光碟機

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

2. 關閉光碟機

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

3. 關機/重開機/登出

OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) };
GetVersionEx(&osvi);

if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) // Win9x
{
    ExitWindowsEx(EWX_REBOOT, 0); // 參數可改:EWX_LOGOFF, EWX_SHUTDOWN, EWX_POWEROFF
}
else // NT 系列需調整權限
{
    // 需啟用 SE_SHUTDOWN_NAME 權限後呼叫 InitiateSystemShutdown
}

4. 顯示系統關機對話框

typedef int (CALLBACK* SHUTDOWNDLG)(int);
HINSTANCE hInst = LoadLibrary(_T("shell32.dll"));
if (hInst)
{
    SHUTDOWNDLG pFn = (SHUTDOWNDLG)GetProcAddress(hInst, (LPSTR)60);
    if (pFn) pFn(0);
    FreeLibrary(hInst);
}

5. 列舉系統所有字型

LOGFONT lf = {0};
lf.lfCharSet = DEFAULT_CHARSET;
CClientDC dc(this);
::EnumFontFamiliesEx(dc.m_hDC, &lf, 
    (FONTENUMPROC)[](LPENUMLOGFONT lpelf, LPNEWTEXTMETRIC, DWORD, LPARAM lParam) -> int
    {
        CListBox* pList = (CListBox*)lParam;
        pList->AddString(lpelf->elfLogFont.lfFaceName);
        return 1;
    }, (LPARAM)&m_fontList, 0);

6. 單一執行個體檢查

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

7. 取得滑鼠游標位置

CPoint pt; GetCursorPos(&pt);

8. 右鍵選單事件

處理 WM_CONTEXTMENU 訊息。

9. 顯示/隱藏主選單

CWnd* pWnd = AfxGetMainWnd();
if (bHide) { pWnd->SetMenu(NULL); pWnd->DrawMenuBar(); bHide = FALSE; }
else { CMenu menu; menu.LoadMenu(IDR_MAINFRAME); pWnd->SetMenu(&menu); pWnd->DrawMenuBar(); bHide = TRUE; menu.Detach(); }

10. 取得執行檔圖示

HICON hIcon = ExtractIcon(AfxGetInstanceHandle(), _T("Notepad.exe"), 0);
if (hIcon && hIcon != (HICON)-1) { pDC->DrawIcon(10, 10, hIcon); DestroyIcon(hIcon); }

11. 視窗自動吸附螢幕邊緣

BOOL AdjustPos(CRect* pRect)
{
    CRect rcWork;
    SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
    const int DETA = 5;
    BOOL bMoved = FALSE;
    
    if (pRect->left < rcWork.left + DETA && pRect->left != rcWork.left)
        { pRect->OffsetRect(rcWork.left - pRect->left, 0); bMoved = TRUE; }
    if (pRect->top < rcWork.top + DETA && pRect->top != rcWork.top)
        { pRect->OffsetRect(0, rcWork.top - pRect->top); bMoved = TRUE; }
    if (pRect->right > rcWork.right - DETA && pRect->right != rcWork.right)
        { pRect->OffsetRect(rcWork.right - pRect->right, 0); bMoved = TRUE; }
    if (pRect->bottom > rcWork.bottom - DETA && pRect->bottom != rcWork.bottom)
        { pRect->OffsetRect(0, rcWork.bottom - pRect->bottom); bMoved = TRUE; }
    return bMoved;
}

// 在 OnMoving 中呼叫
void CMyWnd::OnMoving(UINT, LPRECT pRect) { CRect r(*pRect); if (AdjustPos(&r)) *pRect = r; }

12. 系統選單加入自訂項目

// OnCreate 中
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_MYITEM, _T("我的選單項"));
// 需在資源符號定義 IDM_MYITEM (0x10 ~ 0xEFFF)

13. 執行外部程式/開啟網頁/郵件

// 開啟郵件
ShellExecute(NULL, _T("open"), _T("mailto:test@example.com"), NULL, NULL, SW_SHOWNORMAL);
// 執行程式
WinExec(_T("notepad.exe"), SW_SHOW);

14. 動態新增/移除選單項目

// 新增
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
pMenu->GetSubMenu(0)->AppendMenu(MF_SEPARATOR);
pMenu->GetSubMenu(0)->AppendMenu(MF_STRING, ID_NEW_ITEM, _T("新項目"));
DrawMenuBar();

// 移除
for (int i = pMenu->GetSubMenu(0)->GetMenuItemCount()-1; i >= 0; i--)
{
    CString str; pMenu->GetSubMenu(0)->GetMenuString(i, str, MF_BYPOSITION);
    if (str == _T("新項目")) { pMenu->GetSubMenu(0)->DeleteMenu(i, MF_BYPOSITION); break; }
}
DrawMenuBar();

15. 變更程式圖示

靜態:修改資源 IDR_MAINFRAME 的 16×16 與 32×32 圖示。
動態:AfxGetMainWnd()->SendMessage(WM_SETICON, TRUE, (LPARAM)AfxGetApp()->LoadIcon(IDI_MYICON));

16. 另一種設定視窗標題法

CWnd* pWnd = AfxGetMainWnd();
pWnd->SetWindowText(_T("新標題"));

17. 以增強中繼檔複製圖片到剪貼簿

CMetaFileDC* pMetaDC = new CMetaFileDC();
pMetaDC->CreateEnhanced(GetDC(), NULL, NULL, _T("desc"));
// 繪圖操作...
HENHMETAFILE hMF = pMetaDC->CloseEnhanced();
OpenClipboard(); EmptyClipboard();
SetClipboardData(CF_ENHMETAFILE, hMF);
CloseClipboard();
delete pMetaDC;

18. 剪貼簿文字存取

// 寫入
CString text = _T("Hello");
if (OpenClipboard())
{
    HGLOBAL hMem = GlobalAlloc(GMEM_DDESHARE, (text.GetLength()+1)*sizeof(TCHAR));
    LPTSTR pBuf = (LPTSTR)GlobalLock(hMem);
    _tcscpy(pBuf, text);
    GlobalUnlock(hMem);
    EmptyClipboard(); SetClipboardData(CF_UNICODETEXT, hMem);
    CloseClipboard();
}

// 讀取
if (OpenClipboard())
{
    HGLOBAL hMem = GetClipboardData(CF_UNICODETEXT);
    if (hMem) { LPTSTR pBuf = (LPTSTR)GlobalLock(hMem); /* 使用 pBuf */ GlobalUnlock(hMem); }
    CloseClipboard();
}

19. 螢幕擷圖存入剪貼簿

void OnCaptureScreen()
{
    ShowWindow(SW_HIDE);
    RECT rc = {0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)};
    HBITMAP hBmp = CopyScreenToBitmap(&rc);
    if (OpenClipboard()) { EmptyClipboard(); SetClipboardData(CF_BITMAP, hBmp); CloseClipboard(); }
    ShowWindow(SW_SHOW);
}

HBITMAP CopyScreenToBitmap(LPRECT lpRect)
{
    HDC hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
    HDC hMemDC = CreateCompatibleDC(hScrDC);
    int w = lpRect->right - lpRect->left, h = lpRect->bottom - lpRect->top;
    HBITMAP hBmp = CreateCompatibleBitmap(hScrDC, w, h);
    HBITMAP hOld = (HBITMAP)SelectObject(hMemDC, hBmp);
    BitBlt(hMemDC, 0, 0, w, h, hScrDC, lpRect->left, lpRect->top, SRCCOPY);
    SelectObject(hMemDC, hOld);
    DeleteDC(hScrDC); DeleteDC(hMemDC);
    return hBmp;
}

20. 位圖縮放顯示於 Static 控制項

void ShowBmpInStatic()
{
    CStatic* pStatic = (CStatic*)GetDlgItem(IDC_IMAGE);
    HBITMAP hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), _T("MM.bmp"), 
        IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    
    CBitmap bmp; bmp.Attach(hBmp);
    BITMAP bm; bmp.GetBitmap(&bm);
    
    CDC dcMem; dcMem.CreateCompatibleDC(GetDC());
    CBitmap* pOld = dcMem.SelectObject(&bmp);
    
    CRect rc; pStatic->GetClientRect(&rc);
    pStatic->GetDC()->StretchBlt(0, 0, rc.Width(), rc.Height(), 
        &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
    dcMem.SelectObject(pOld);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved