程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 建立磁性窗體

建立磁性窗體

編輯:vc教程

一些著名的共享軟件不但功能卓著,而且在程序界面的設計技巧上往往領導了一種時尚,WinAmp就是其中的一個代表。WinAmp有兩個絕活,一是可以更換窗體的外觀,也就是現在俗稱的給軟件換“皮膚”;另一個即是磁性窗體技巧。

磁性窗體即若干窗體靠近到一定距離以內時會互相粘在一起,或者說相互吸附在一起,然後在拖動主窗體時,粘在其上的其它窗體也一起跟著移動,好像變成了一個窗體。國內的MP3播放器新秀CDOK也實現了這種技巧,而且更絕,把幾個窗體粘在一起後,窗體沒有主從之分,拖動其中任意一個窗體都會使其它的窗體一起移動。在CSDN上有關怎樣設計磁性窗體的帖子非常多,說明這個技巧深得廣大程序員的青睐。

本文先把幾位網友的方法略加分析,然後給出我認為比較可行的實現方法和源代碼。

實現磁性窗體基本上分為兩步,第一步是實現當兩個窗體靠近到一定距離以內時實現窗體間的粘貼操作,第二步是移動窗體時,同時移動與它粘在一起的其它窗體。

實現窗體的粘貼

實現粘貼的難點在於什麼時候進行這個操作,假設有兩個窗體Form1和Form2,移動Form2向Form1靠近,當Form2與Form1的最近距離小於distance時粘貼在一起。顯然,應該在移動Form2的過程中進行判斷,問題是在程序的什麼位置插入判斷代碼呢?

CSDN上有人認為可以使用定時器,每隔一定的時間檢查各個窗體的位置。這種方法有著明顯的弊病,不說定時器要無謂地浪費系統資源,單單它的即時性就難以保證。如果縮短計時值,浪費的CPU資源就更多了,所以我也就不多說了。

合理的方法是利用系統產生的消息,但是利用什麼消息呢?窗體在移動時會產生WM_WINDOWPOSCHANGING和WM_MOVING消息,移動結束後會產生WM_WINDOWPOSCHANGED和WM_MOVE消息。WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息的參數lParam是結構WINDOWPOS的指針,WINDOWPOS定義如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved