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

VC++ 程式設計經驗匯總:標題列隱藏、清空編輯框、檔案屬性視窗、刪除目錄、Lib/DLL 差異

     編輯:VC 教學

前言

收集五個常見 VC++ 開發實用技巧,涵蓋視窗樣式控制、訊息傳送、Shell 擴充、檔案系統操作與建置知識。

1. 顯示/隱藏視窗標題列

方法一:Win32 API


// 隱藏
LONG style = GetWindowLong(m_hWnd, GWL_STYLE);
SetWindowLong(m_hWnd, GWL_STYLE, style & ~WS_CAPTION);
SetWindowPos(m_hWnd, NULL, 0,0,0,0,
    SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);

// 顯示
SetWindowLong(m_hWnd, GWL_STYLE, style | WS_CAPTION);
SetWindowPos(m_hWnd, NULL, 0,0,0,0,
    SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);

方法二:MFC ModifyStyle(推薦)


// 隱藏
ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
// 顯示
ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);

2. 使用 SendMessage 清空編輯框


HWND hEdit = GetDlgItem(IDC_EDIT1)->GetSafeHwnd();
SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)_T(""));

3. 彈出檔案/資料夾屬性視窗


SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = _T("properties");
sei.lpFile = _T("C:\\Test.txt"); // 或資料夾路徑
sei.nShow = SW_SHOW;
ShellExecuteEx(&sei);

4. 刪除目錄及所有內容(兩種實作)

MFC 版 (CFileFind)


BOOL DeleteDirectory(LPCTSTR path)
{
    CFileFind ff; CString search = path; search.TrimRight(_T('\\')); search += _T("\\*.*");
    BOOL found = ff.FindFile(search);
    while (found) {
        found = ff.FindNextFile();
        if (ff.IsDots()) continue;
        CString full = ff.GetFilePath();
        if (ff.IsDirectory()) DeleteDirectory(full);
        else DeleteFile(full);
    }
    ff.Close();
    return RemoveDirectory(path);
}

純 Win32 版 (適合 WTL/ATL/無 MFC)


int DeleteDirectoryWin32(LPCWSTR path)
{
    if (!path || wcslen(path) > MAX_PATH - 5) return 0;
    WCHAR root[MAX_PATH], search[MAX_PATH];
    wcscpy(root, path);
    int len = wcslen(root);
    if (root[len-1] != L'\\') { root[len] = L'\\'; root[len+1] = 0; }
    wcscpy(search, root); wcscat(search, L"*.*");

    WIN32_FIND_DATA fd; HANDLE h = FindFirstFile(search, &fd);
    if (h == INVALID_HANDLE_VALUE) return 0;

    do {
        if (wcscmp(fd.cFileName, L".")==0 || wcscmp(fd.cFileName, L"..")==0) continue;
        WCHAR full[MAX_PATH]; wcscpy(full, root); wcscat(full, fd.cFileName);
        if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            DeleteDirectoryWin32(full); _wrmdir(full);
        } else DeleteFile(full);
    } while (FindNextFile(h, &fd));
    FindClose(h);
    return 1;
}

5. .lib vs .dll 差異與聯繫

特性.lib (靜態/匯入庫).dll (動態連結庫)
連結時機編譯/連結階段執行階段載入
檔案性質目標檔封存 (靜態) 或匯入符號表 (動態)獨立可執行映像 (PE)
部署靜態:無額外檔;動態:需隨程式部署 .dll必須部署 .dll
更新靜態:重新編譯;動態:替換 .dll 即可替換 .dll 即可 (版本相容)
符號解析連結器載入器
  • 動態連結仍需 .lib (匯入庫) 讓連結器解析符號;若無 .lib 可用 LoadLibrary/GetProcAddress 手動載入。
  • C++ 專案引用 C 語言 .lib 時需加 extern "C" { #include "clib.h" } 防止名稱修飾衝突。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved