摘要:同時,由于鎖定導致了我們在拖拽時對窗口的繪制無法生效的問題亦可解決。免費領取驗證碼內容安全短信發送直播點播體驗包及云服務器等套餐更多網易技術產品運營經驗分享請訪問網易云社區。文章來源網易云社區
本文由作者鄒啟文授權網易云社區發布。
在郵箱大師PC版中,我們需要實現一個功能:賬號和郵件夾拖拽排序。
準備
封裝win32 API。我們使用到的API有,
ImageList_Create、ImageList_Destroy、
ImageList_Add、ImageList_AddMasked、ImageList_Remove、
ImageList_BeginDrag、ImageList_DragEnter、ImageList_EndDrag、ImageList_DragLeave、
ImageList_DragMove、ImageList_SetDragCursorImage、ImageList_DragShowNoLock。
For more information,see Using Image Lists
Drag開始
攔截鼠標的LButtonDown消息,判斷point所在的控件是否符合拖拽要求,如果符合,記住狀態(這里使用bool will_drag_和MailFolderNode drag_from_標識可以拖拽,使用bool is_draging_標識正在拖拽中,使用MailFolderNode drag_to_標識接受控件)
Drag進行中
攔截鼠標的MouseMove消息,判斷will_drag_,如果是,那么需要做如下操作:
->ImageList_Create創建ImageList對象
->ImageList_AddMasked加入拖拽時將要顯示的圖像
->ImageList_BeginDrag即將開始拖拽,并設置鼠標在拖拽圖像中的位置
->ImageList_DragEnter進入拖拽,并設置拖拽圖像的位置
->修改will_drag_為false,is_draging_為true,保證上面幾步只做一次
->判斷point是否在拖拽接受范圍內,以及point對應控件是否接受拖拽(及時更新drag_to_)
->如果是,那么執行ImageList_DragMove、ImageList_DragShowNoLock(TRUE)、SetCursor(LoadCursor(NULL, IDC_ARROW));
->如果不是,那么執行ImageList_DragShowNoLock(FALSE)、SetCursor(LoadCursor(NULL, IDC_NO));
Drag結束
攔截鼠標的LButtonUp消息,如果is_draging_,那么執行ImageList_EndDrag、ImageList_DragLeave、ImageList_Destroy,然后根據drag_from_和drag_to_處理本次拖拽操作。
問題
Ⅰ、如何使拖拽圖像背景透明?
使用CreateCompatibleBitmap創建位圖,調用FillRect將位圖背景刷成白色RGB(255,255,255);
在ImageList_Create時指定ILC_COLOR32 | ILC_MASK;
調用ImageList_AddMasked(bitmap, RGB(255,255,255));
至此,拖拽圖像中的白色會與mask"中和"
Ⅱ、在拖拽時出現窗口繪制被"破壞",并且殘留痕跡?
這是由于在調用ImageList_DragEnter時鎖定了窗口導致,我們使用NULL代替HWND即可解決此問題。同時,由于鎖定導致了我們在拖拽時對窗口的繪制無法生效的問題亦可解決。另,記得在拖拽結束時ImageList_DragLeave(NULL);
Ⅲ、ImageList_BeginDrag和ImageList_DragEnter中的位置是何含義?
在ImageList_BeginDrag中,此處位置為鼠標圖標相對于拖拽圖像的位置。
在mageList_DragEnter中,此處位置為鼠標相對于HWND的位置,如果HWND為NULL,那么便是相對于屏幕的位置。
Ⅳ、ImageList_DragShowNoLock含義是什么?
參數BOOL表示是否顯示拖拽圖像。當拖拽move在可接受控件時,顯示拖拽鼠標,更改鼠標樣式(或使用ImageList_SetDragCursorImage設置自定義鼠標樣式,注意此時需隱藏ShowCursor(FALSE));否則,不顯示拖拽圖像,并顯示IDC_NO不可操作樣式。
Ⅴ、will_drag_的標識是否多余?
為何要等到MouseMove再去真正開始drag?因為正常的單擊操作,我們不希望看到拖拽圖像,因此設置此標記。實際應用中發現,有時候單擊時發生"抖動",此時也出現拖拽圖像,因此我們加入了延時,在按下100ms后才將will_drag_設置成true,可在一定程度上減小抖動出現拖拽圖像的情況。
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及云服務器等套餐
更多網易技術、產品、運營經驗分享請訪問網易云社區。
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25341.html
摘要:壓縮圖片桌面應用基于制作一個壓縮圖片的桌面應用下載地址項目源碼準備工作我們來整理一下我們需要做什么壓縮圖片模塊獲取文件路徑桌面應用生成壓縮圖片我們需要使用這個庫來壓縮圖片,這里我們把這個庫封裝成壓縮模塊。 壓縮圖片桌面應用imagemin-electron 基于electron制作一個node壓縮圖片的桌面應用 下載地址:https://github.com/zenoslin/imag...
摘要:博客原文地址實踐一鍵安裝前言很久以前我簡單的寫過關于的使用但是我在更換博客的時候丟棄了,我在下面的文章把它引用一遍。 博客原文地址node-webkit實踐-一鍵安裝 前言 很久以前我簡單的寫過關于node-webkit的使用,但是我在更換博客的時候丟棄了,我在下面的文章把它引用一遍。 node-webkit其實在很多地方用處很大,請自行發散。 本文的相關代碼:點擊查...
摘要:讀取文件路徑寫入配置文件調用服務調用服務部分,主要用到的子進程。最后,上一張初步完成之后的運行圖博客原文 背景 部門的項目每次開發都需要手動開啟三個服務:server、webpack、grunt,每個服務都要輸入一些東西(端口號,項目命,項目類型,啟動器名)。而且,在推送調試的時候,這三項服務非常容易被終止掉,然后又得一個個開起來,總之每天都要來上那么10幾遍吧。看圖:showImg(...
摘要:上篇文章我許了一個愿,就是想讓大家多多關注我,然后我的粉絲就蹭蹭的漲了好幾百,謝謝大家的厚愛。可是我發現粉絲是漲了,三連變少了,謝謝大家這次給我三連,我一定再接再厲。地址的尋找陽光總值,種植一個豌豆需要,非常不夠用。 目錄 前言 游戲的安裝 思路 ? ? ? 一句話總結 ? ? ? 大概的思...
閱讀 1338·2023-04-25 15:21
閱讀 2670·2021-11-24 10:23
閱讀 3397·2021-10-11 10:59
閱讀 3242·2021-09-03 10:28
閱讀 1731·2019-08-26 13:45
閱讀 2319·2019-08-26 12:11
閱讀 921·2019-08-26 12:00
閱讀 1705·2019-08-26 10:44