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

純 Win32 SDK 實作支援檔案拖放的視窗程式範例

     編輯:關於C++

不依賴 MFC、VCL 等框架,直接使用 Win32 API 建立可接收檔案拖放(Drag & Drop)的視窗。核心在於 WM_CREATE 註冊 DragAcceptFiles、處理 WM_DROPFILES 訊息、以 DragQueryFile/DragQueryPoint 取得檔案清單與滑鼠座標、最後 DragFinish 釋放資源。

完整程式架構

// 視窗類別註冊
WNDCLASS wc = {0};
wc.lpfnWndProc = MainWndProc;
wc.lpszClassName = "DropFileClass";
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
RegisterClass(&wc);

// 建立視窗
HWND hWnd = CreateWindowEx(0, "DropFileClass", "DropFile Demo", WS_OVERLAPPEDWINDOW, ...);

// 訊息迴圈
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }

關鍵訊息處理

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_CREATE:
        DragAcceptFiles(hWnd, TRUE);  // 啟用拖放
        break;
    case WM_DROPFILES: {
        HDROP hDrop = (HDROP)wParam;
        HDC hDC = GetDC(hWnd);
        ShowFileInfo(hWnd, hDC, hDrop); // 自訂顯示函數
        DragFinish(hDrop);              // 必須呼叫釋放
        ReleaseDC(hWnd, hDC);
        break;
    }
    case WM_DESTROY:
        DragAcceptFiles(hWnd, FALSE);
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

顯示檔案資訊 ShowFileInfo

  • DragQueryPoint 取得放下位置。
  • DragQueryFile(hDrop, 0xFFFFFFFF, ...) 取得檔案總數。
  • 單檔時:DragQueryFile(hDrop, 0, path, ...) 取得路徑,配合 SHGetFileInfo 取得顯示名稱、類型名稱、圖示(ExtractIcon),在視窗客戶區繪製(TextOut/DrawIcon)。
  • 多檔時:僅顯示檔案數量。

此範例展示最基礎的 Shell 拖放介面用法,可作為檔案接收工具、上傳元件、安裝程式拖放安裝等功能的起點。

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