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

VC++ 實用代碼片段庫:光碟控制、關機重啟、字體枚舉、單例執行、滑鼠座標、系統選單、圖示提取、視窗吸附、資源檔操作

     編輯:關於C語言

一、 光碟機控制 (MCI)

// 彈出
mciSendString(_T("Set CDAudio Door Open Wait"), NULL, 0, NULL);
// 關閉
mciSendString(_T("Set CDAudio Door Closed Wait"), NULL, 0, NULL);

二、 關機 / 重啟 / 登出

// 關機/重啟 (Win9x/NT 通用)
OSVERSIONINFO osvi = { sizeof(osvi) };
GetVersionEx(&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
    // NT 系列需提權 SE_SHUTDOWN_NAME,建議用 ExitWindowsEx + 權限調整
    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0); // 或 EWX_REBOOT
} else {
    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0); // Win9x
}

// 顯示系統關機對話框 (shell32.dll #60)
typedef int (CALLBACK *SHUTDOWNDLG)(int);
HINSTANCE h = LoadLibrary(_T("shell32.dll"));
if (h) {
    SHUTDOWNDLG fn = (SHUTDOWNDLG)GetProcAddress(h, (LPCSTR)60);
    if (fn) fn(0);
    FreeLibrary(h);
}

三、 字體枚舉

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

四、 單例執行 (防止多開)

// 檢查視窗標題/類別名
if (FindWindow(NULL, _T("MyAppTitle")) || FindWindow(_T("MyWndClass"), NULL)) {
    return FALSE; // 已有實例運行,直接退出
}

五、 取得滑鼠螢幕座標

CPoint pt; GetCursorPos(&pt); // pt.x, pt.y 為螢幕絕對座標

六、 右鍵選單 (WM_CONTEXTMENU)

void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint pt) {
    CMenu menu; menu.LoadMenu(IDR_MY_POPUP);
    CMenu* pPopup = menu.GetSubMenu(0);
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
}

七、 顯示/隱藏主選單

CWnd* pMain = AfxGetMainWnd();
if (bHide) {
    pMain->SetMenu(NULL); pMain->DrawMenuBar(); bHide = FALSE;
} else {
    CMenu menu; menu.LoadMenu(IDR_MAINFRAME);
    pMain->SetMenu(&menu); pMain->DrawMenuBar(); bHide = TRUE;
    menu.Detach(); // 避免析構銷毀 HMENU
}

八、 提取可執行檔圖示

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

九、 視窗邊緣吸附 (自動靠邊)

BOOL AdjustPos(CRect* pRect) {
    CRect wa; SystemParametersInfo(SPI_GETWORKAREA, 0, &wa, 0);
    const int EDGE = 10; // 吸附閾值
    BOOL moved = FALSE;
    if (pRect->left < wa.left + EDGE && pRect->left != wa.left) {
        pRect->OffsetRect(wa.left - pRect->left, 0); moved = TRUE;
    }
    if (pRect->top < wa.top + EDGE && pRect->top != wa.top) {
        pRect->OffsetRect(0, wa.top - pRect->top); moved = TRUE;
    }
    if (pRect->right > wa.right - EDGE && pRect->right != wa.right) {
        pRect->OffsetRect(wa.right - pRect->right, 0); moved = TRUE;
    }
    if (pRect->bottom > wa.bottom - EDGE && pRect->bottom != wa.bottom) {
        pRect->OffsetRect(0, wa.bottom - pRect->bottom); moved = TRUE;
    }
    return moved;
}

// OnMoving
void CMyDlg::OnMoving(UINT fwSide, LPRECT pRect) {
    CRect r(pRect); if (AdjustPos(&r)) *pRect = r;
    CDialog::OnMoving(fwSide, pRect);
}

十、 系統選單新增項目

  1. 資源符號定義 ID (0x10 ~ 0xEFFF)。
  2. CMenu* pSys = GetSystemMenu(FALSE);
  3. pSys->AppendMenu(MF_STRING, ID_MY_ITEM, _T("我的項目"));
  4. 在 OnSysCommand 處理 ID_MY_ITEM。

總結

涵蓋 VC++ 桌面開發高頻實用片段:MCI 多媒體、ExitWindowsEx/Shell 關機、EnumFontFamiliesEx 字體、FindWindow 單例、GetCursorPos 座標、TrackPopupMenu 右鍵選單、SetMenu 切換、ExtractIcon 圖示、SPI_GETWORKAREA 吸附、GetSystemMenu 系統選單擴展。代碼均為最小可用單元,可直接整合專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved