1. 程式人生 > >Sendmessage改變控制元件大小

Sendmessage改變控制元件大小

===============================

這個是在編寫動態控制元件中用到的,作者不知道是誰了

===============================

在VB中,BorderStyle屬性為0的窗體沒有邊框,並且也沒有與邊框相關的元素。這種窗體具有簡潔、佔用空間少等優點,用它可以設計出某些富有個性的窗體。但是,由於它沒有標題欄,窗體不能移動,同時也不能改變大小,在某些情況下會給使用者造成一定的麻煩。本文介紹在VB中如何用API函式操作無邊框窗體。
移動窗體
新建一標準工程,設定Form1的BorderStyle屬性為0。此時執行程式後,無法移動窗體。為能移動窗體,在Form1的程式碼視窗宣告下列函式和常數:
Option Explicit
Private Declare Function ReleaseCapture Lib “user32” () As Long
Private Declare Function SendMessage Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const WM_SYSCOMMAND = &H112
Const SC_MOVE = &HF012
在Form_MouseDown事件中輸入以下程式碼:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
`按下滑鼠左鍵
If Button = vbLeftButton Then 
`為當前的應用程式釋放滑鼠捕獲
ReleaseCapture 
`移動窗體
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0 
End If
End Sub
注意:此時窗體上不能放置除Shape控制元件以外的任何控制元件,否則,在被控制元件遮住的地方點按滑鼠還是無法移動窗體。要使點按控制元件也能移動窗體,需再新增一個該控制元件的MouseDown事件過程,程式碼與上述過程程式碼相似。
改變窗體的大小
為了改變窗體的大小,需要新增一個Timer控制元件,以定時捕獲滑鼠在窗體中的位置。當滑鼠位於窗體邊緣時,改變滑鼠的形狀,以通知使用者可以進行改變大小的操作。為此,將Timer控制元件的Interval屬性設為100(即每過100毫秒檢測一下滑鼠位置),其他取預設值。
在Form1的程式碼視窗中再新增下列兩個函式,並定義兩個自定義變數和一個字串變數:
`取得窗體位置的函式
Private Declare Function GetWindowRect Lib “user32” (ByVal hwnd As Long, lpRect As RECT) As Long 
`取得滑鼠位置的函式
Private Declare Function GetCursorPos Lib “user32” (lpPoint As POINTAPI) As Long 
`滑鼠位置變數
Private Type POINTAPI 
x As Long
y As Long
End Type
`窗體位置變數
Private Type RECT 
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
`所要執行的動作變數,是移動還是改變大小及從哪個方向改變大小
Dim Action As String 
在Timer1控制元件的Timer事件過程中新增以下程式碼:
Private Sub Timer1_Timer()
Dim MyRect As RECT
Dim MyPoint As POINTAPI
` MyRect返回當前視窗位置
Call GetWindowRect(Me.hwnd, MyRect)
` MyPoint返回當前滑鼠位置 
Call GetCursorPos(MyPoint) 
Select Case True
`滑鼠位於窗體左上方
Case MyPoint.x < MyRect.Left + 5 And MyPoint.y < MyRect.Top + 5 
Screen.MousePointer = vbSizeNWSE 
Action = “LeftUp”
`滑鼠位於窗體右下方
Case MyPoint.x > MyRect.Right - 5 And MyPoint.y > MyRect.Bottom - 5 
Screen.MousePointer = vbSizeNWSE 
Action = “RightDown”
`滑鼠位於窗體右上方
Case MyPoint.x > MyRect.Right - 5 And MyPoint.y < MyRect.Top + 5
’45度雙向滑鼠指標 
Screen.MousePointer = vbSizeNESW 
Action = “RightUp”
`滑鼠位於窗體左下方
Case MyPoint.x < MyRect.Left + 5 And MyPoint.y > MyRect.Bottom - 5 
Screen.MousePointer = vbSizeNESW 
Action = “LeftDown”
`滑鼠位於窗體左邊
Case MyPoint.x < MyRect.Left + 5 
`水平雙向滑鼠指標
Screen.MousePointer = vbSizeWE 
Action = “Left”
`滑鼠位於窗體右邊
Case MyPoint.x > MyRect.Right - 5 
Screen.MousePointer = vbSizeWE 
Action = “Right”
`滑鼠位於窗體上方
Case MyPoint.y < MyRect.Top + 5 
`垂直雙向滑鼠指標
Screen.MousePointer = vbSizeNS 
Action = “Up”
`滑鼠位於窗體下方
Case MyPoint.y > MyRect.Bottom - 5 
Screen.MousePointer = vbSizeNS 
Action = “Down”
`滑鼠位於窗體其他位置
Case Else 
`預設滑鼠指標
Screen.MousePointer = 0 
Action = “Move”
End Select
End Sub
當利用SendMessage函式由系統向視窗傳送改變大小的資訊時,只要將上面移動窗體的語句“SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0”中的第3個引數改為相應的常數即可。
VB中&HF001~&HF008分別是從左、右、上、左上、右上、下、左下、右下8個方向改變窗體大小的常數。結合移動窗體的程式碼,將上述Form_MouseDown事件的程式碼綜合如下(也可以把這8個常數宣告為自定義常數):
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
`按下滑鼠左鍵
If Button = vbLeftButton Then 
`為當前的應用程式釋放滑鼠捕獲
ReleaseCapture 
Select Case Action
Case “Left”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF001, 0
Case “Right”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF002, 0
Case “Up”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF003, 0
Case “LeftUp”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF004, 0
Case “RightUp”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF005, 0
Case “Down”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF006, 0
Case “LeftDown”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF007, 0
Case “RightDown”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF008, 0
Case “Move”
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Select
End If
End Sub

相關推薦

Sendmessage改變控制元件大小

=============================== 這個是在編寫動態控制元件中用到的,作者不知道是誰了 =============================== 在VB中,BorderStyle屬性為0的窗體沒有邊框,並且也沒有與邊框相關的元素。這種窗體具

三種隨著對話方塊的大小更新改變控制元件大小

.h檔案中新增程式碼 private:     POINT Old;     CRect m_rect; public:     afx_msg void OnSize(UINT nType, int cx, int cy);     //void ReSize(); }

C++ MFC 改變控制元件大小和位置

用CWnd類的函式MoveWindow()或SetWindowPos()可以改變控制元件的大小和位置。 void MoveWindow(int x,int y,int nWidth,int nHeight); void MoveWindow(LPCRECT lpRect);

MFC 控制元件大小隨窗體改變改變大小-OnSize

轉載:https://blog.csdn.net/zhoxier/article/details/7776128 一個基於對話方塊的MFC介面,怎麼樣才能讓對話方塊裡的控制元件能和對話方塊同比例變小變大?今天我一直想解決這個問題,這是師姐留給我的任務。經過在網上的大量搜

VC中自動改變控制元件位置和大小的對話方塊類

lxDialog.h檔案: ///////////////////////////////////////////////////////////////////////////////////// // 自動改變控制元件位置和大小的對話方塊類 // 檔名:lxDialog.h //

C# Winform 一個可以用滑鼠改變控制元件位置和大小的類,直接呼叫即可.....(程式碼收藏)

using System;   using System.Collections.Generic;   using System.Text;   using System.ComponentModel;   using System.Data;   using System.

Android中動態改變控制元件大小的一種方法

    在Android中有時候我們需要動態改變控制元件的大小。有幾種辦法可以實現  一是在onMeasure中修改尺寸,二是在onLayout中修改位置和尺寸。這個是可以進行位置修改的,onMeasure不行。 還有一種是用LayoutParams來進行修改。前兩種方法都

android 動態改變控制元件位置和大小

動態改變控制元件位置的方法: setPadding()的方法更改佈局位置。 如我要把Imageview下移200px:             ImageView.setPadding( ImageView.getPaddingLeft(),  ImageView.get

GTK進階學習:改變控制元件字型大小

改變控制元件字型大小: #include <gtk/gtk.h> /* 功能: 設定控制元件字型大小 * widget: 需要改變字型的控制元件 * size:

C#當窗體大小改變時,窗體中的控制元件大小也隨之改變

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.For

VS2013 MFC 對話方塊控制元件大小隨視窗大小改變改變

視窗大小改變後控制元件大小也隨之改變 在對話方塊標頭檔案中定義 標頭檔案名稱:專案名稱Dlg.h POINT Old;//存放對話方塊的寬和高。 對話方塊cpp中初始化 cpp檔名稱:專案名稱Dlg.cpp 在OnInitDialog()函

C#視窗控制元件大小隨視窗大小改變

自己寫了個類,可以實現視窗大小發生改變時,視窗內的控制元件大小也隨之改變(等比例), 不過呼叫要有點小技巧,後面再說,類的程式碼如 /// <summary> /// 視窗控制元件大小變化隨視窗等比變化 /// </summary&g

C#控制元件大小隨窗體大小等比例變化

C#控制元件大小隨窗體大小等比例變化 轉載自:http://www.knowsky.com/898409.html 相信很多博友在開發初次接觸學習C# winForm時,當窗體大小變化時,窗體內的控制元件並沒有隨著窗體的變化而變化,最近因為一個專案工程的原因,也需要解

js--彈出對話方塊、改變控制元件內容、驗證輸入郵箱的合法性

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript">

C#窗體設計:自動調整控制元件大小

新建一個C#應用程式,應用程式命名為Change 窗體介面設計如下 雙擊窗體新增Load()函式,函式中新增一下程式碼: private void Form1_Load(object sender, EventArgs e)      

使用TypedArray設定控制元件大小注意問題

在編寫自定義控制元件的時候,由於我的控制元件全部採用的是程式碼編寫介面,在通過TypeArray獲取文字大小的時候,介面顯示的與設定的明顯不一樣,具體的圖片演示我就不貼圖可以檢視http://blog.

viewPager+photoView實現圖片輪播和手勢縮放功能 支援手勢縮放的imageView 如何實現相簿左右滑動和手勢縮放 如何讓圖片自適應控制元件大小 photoView如何使用(上)

import uk.co.senab.photoview.IPhotoView; import uk.co.senab.photoview.PhotoViewAttacher; import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedList

自定義RatingBar控制元件,實現可自定義星星(或專案所需圖片)的寬高,告別使用warp_content導致控制元件大小不可控

之前做過的一款app中涉及到RatingBar控制元件,基本上來說都會要求用圖片來替代, 即使同樣是星星(可能是覺得系統自帶的比較醜吧,不過我覺得還好啊)。 當時就覺得很難去做適配,UI給的圖片沒法去控制寬高,只能使用warp_content來做, 可是這樣會導

Qt控制元件大小跟隨視窗調整

來自QQ群 Linux && 技術分享 311078264 開啟連結加入QQ群:https://jq.qq.com/?_wv=1027&k=5Gr3bAxUI介面 控制元件隨視窗自適應變化大小 通過Qt Creator的設計模式實現,無需增加程式碼

android 動態設定控制元件大小

ImageView view = new ImageView(context);view.setLayoutParams(new LinearLayout.LayoutParams(30, 30)); view.setpadding(0,0,0,0); LayoutP