溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Windows核心編程(4)

發(fā)布時(shí)間:2020-07-05 18:31:46 來(lái)源:網(wǎng)絡(luò) 閱讀:906 作者:超級(jí)極客 欄目:編程語(yǔ)言

一、窗口非客戶(hù)區(qū)的鼠標(biāo)消息

1.WM_NCMOUSEMOVE  鼠標(biāo)移動(dòng)

鼠標(biāo)左鍵

WM_NCLBUTTONDOWN 按下

WM_NCLBUTTONUP  松開(kāi)

WM_NCLBUTTONDBLCLK 雙擊

鼠標(biāo)右鍵

WM_NCRBUTTONDOWN 按下

WM_NCRBUTTONUP  松開(kāi)

WM_NCRBUTTONDBLCLK 雙擊

鼠標(biāo)中鍵

WN_NCMBUTTONDOWN 按下

WM_NCMBUTTONUP 松開(kāi)

WM_NCMBUTTONDBLCLK 雙擊

二.WM_NCHITTEST消息

1.是操作系統(tǒng)發(fā)給鼠標(biāo)下面的窗口,以便確定鼠標(biāo)是在窗口的哪個(gè)部分

上面,所有的窗口鼠標(biāo)消息產(chǎn)生之前都是要先響應(yīng)該消息,該消息由默認(rèn)

窗口消息處理程序處理,返回值提示鼠標(biāo)所在區(qū)域

HTCAPTION 在非客戶(hù)區(qū)標(biāo)題欄上

HTCLIENT 客戶(hù)區(qū)

HTCLOSE 在關(guān)閉按鈕上

HTHELP 非客戶(hù)區(qū)幫助按鈕

HTMAXBUTTON 最大化按鈕

HTMINBUTTON 最小化按鈕

HTTRANSPARENT 鼠標(biāo)穿過(guò)窗口

...


2.滾輪消息 WM_MOUSEWHEEL

它表示鼠標(biāo)被滾動(dòng)的消息,這個(gè)消息不限于客戶(hù)區(qū),也不限于非客戶(hù)區(qū)

WPARAM參數(shù) 低16位表示哪個(gè)鍵被按下, 高16位表示滾動(dòng)的距離

正值表示向前滾動(dòng),負(fù)值向后滾動(dòng).

LPARAM參數(shù) 低16客戶(hù)區(qū)X坐標(biāo)  高16位客戶(hù)區(qū)Y坐標(biāo)



三.SetWindowPos函數(shù)

1.改變窗口的位置,大小和Z-Order.并且可以設(shè)置窗口的顯示狀態(tài)

HWND hWnd 要改變位置,大小,或Z-Order的窗口

HWND hWndInsertAfter 窗口句柄 hWnd在Z-Order上將被置于他后面

int x,int y 窗口的位置

int cx,int cy 窗口大小

UINT uFlags操作標(biāo)準(zhǔn)

成功返回TRUE 失敗返回FALSE

uFlags參數(shù)

SWP_NOSIZE    維持當(dāng)前窗口大小.就是忽略cx和cy參數(shù)

SWP_NOMOVE    維持當(dāng)前窗口的位置,也就是忽略X和Y參數(shù)

SWP_NOZORDER    不改變窗口Z-Order次序

SWP_NOOWNERZORDER 不改變Z序中所有者窗口位置

SWP_NOREDRAW    不重繪窗口

SWP_NOSENDCHANGING 不發(fā)送窗口位置改變消息

SWP_FRAMECHANGED  強(qiáng)制窗口標(biāo)題欄以及邊框重繪,即發(fā)送WM_NCPAINT消息

SWP_HIDEWINDOW   隱藏窗口

SWP_SHOWWINDOW   顯示窗口

SWP_NOACTIVATE   不激活窗口



四.多個(gè)窗口同步移動(dòng)的方法

BeginDeferWindowPos 返回用于存儲(chǔ)多窗口位置和大小信息的句柄HWND

DeferWindowPos函數(shù)把指定窗口的新位置大小信息存儲(chǔ)在句柄HDWP中

EndDeferWindowPos最好調(diào)用EndDeferWindowPos來(lái)同時(shí)更新之前存儲(chǔ)好的多窗口位置大小


HDWP BeginDeferWindowPos(

    int nNumWindos 村粗幾個(gè)窗口的位置大小信息

) 返回值為多窗口的位置跟大小信息


DeferWindowPos(

    HDWP hWinPosInfo,BeginDeferWindowPos返回的多窗口位置跟大小信息句柄

    HWND hWnd,  要改變位置或大小信息的窗口

    HWND hWndInsertAfter,

    int x,int y,    窗口位置

    int cx,int cy,窗口大小

    UINT uFlags, //跟SetWindowPos的uFlags參數(shù)一樣

)

EndDeferWindowPos(

    HDWP hWinPosInfo eginDeferWindowPos返回的多窗口位置跟大小信息句柄

)

函數(shù)返回TRUE 成功,FALSE失敗



五、菜單函數(shù)

1.HMENU WINAPI CreateMenu(VOID)

 HMENU WINAPI CreatePopupMenu(VOID)


2.這兩函數(shù)都返回了創(chuàng)建后的菜單的句柄.這兩個(gè)函數(shù)的區(qū)別:


CreateMenu是創(chuàng)建水平菜單,通常是放置在頂級(jí)窗口中,

同時(shí)也是作為頂級(jí)菜單的,就行我們經(jīng)??吹降?quot;文件"

編輯,等菜單


6CreatePopupMenu創(chuàng)建的是一個(gè)垂直的彈出菜單,

經(jīng)常被用來(lái)做另一個(gè)菜單的子菜單或者右鍵菜單


3.銷(xiāo)毀菜單的函數(shù) BOOL WINAPI DestoryMenu(HMENU hMenu)


4.添加菜單項(xiàng)

BOOL WINAPI AppendMenu(

HMENU hMenu,  //要修改的菜單

UINT uFlag,   //新菜單選項(xiàng)的狀態(tài)信息,

MF_STRING 新建一個(gè)字符串菜單選項(xiàng)

MF_BITMAP 新建一個(gè)位圖菜單選項(xiàng)

MF_POPUP 新選項(xiàng)為一個(gè)彈出式菜單

MF_CHECKED 新選項(xiàng)為一個(gè)已選中的菜單選項(xiàng),即菜單選項(xiàng)前面有一個(gè)打鉤

MF_DISABLED 新建一無(wú)法選中的菜單項(xiàng),但外觀(guān)不變灰

MF_GRAYED 新菜單選項(xiàng)無(wú)效,用戶(hù)無(wú)法選中該選項(xiàng), 且外觀(guān)變灰


UINT_PTR uIDNewItem, //新菜單選項(xiàng)的命令I(lǐng)D

LPCWSTR lpNewItem  //新菜單選項(xiàng)的內(nèi)容,

如果是MF_BITMAP 則為位圖的句柄,否則為顯示在菜單項(xiàng)上的內(nèi)容.

)


5.設(shè)置菜單項(xiàng)的前面是否要打鉤

DWORD CheckMenuItem(

HMENU hMenu,  //要設(shè)置的菜單句柄

UINT uIDCheckItem, 要設(shè)置的菜單項(xiàng)

要么是菜單的ID,要么是索引值,值類(lèi)型取決于 uCheck

UINT uCheck 

MF_BYCOMMAND 指明使用菜單項(xiàng)的ID

MF_BYPOSITION 指明菜單項(xiàng)使用索引值

MF_CHECKED: 為菜單添加打鉤標(biāo)志 
MF_UNCHECKED 去除打鉤標(biāo)志


6.禁用一個(gè)菜單項(xiàng)

BOOL EnableMenuItem

參數(shù)1 hMenu 菜單句柄

參數(shù)2 和上面一樣

參數(shù)3 

MF_BYCOMMAND 指明使用菜單項(xiàng)的ID

MF_BYPOSITION 指明菜單項(xiàng)使用索引值

MF_DISABLED 設(shè)置菜單項(xiàng)禁用 但不變灰

MF_ENABLED 設(shè)置菜單項(xiàng)啟用

MF_GRAYED 設(shè)置菜單項(xiàng)禁用,選項(xiàng)變灰



7.在指定位置顯示一個(gè)彈出菜單

BOOL TrackPopupMenu

參數(shù)1 菜單句柄

參數(shù)2 uFlags 菜單屬性

int x,int y,屏幕坐標(biāo)系,菜單的左上角坐標(biāo)

int nReserved,保留著 為0即可

HWND hWnd 此窗口接收菜單的消息

函數(shù)返回前,此窗口不接收菜單的WM_COMMAND消息

CONST RECT*prcRect 保留值 NULL即可


uFlag參數(shù)屬性:

設(shè)置菜單的水平方向的定位

TPM_CENTERALIGN: 彈出的菜單中心位置與參數(shù)x對(duì)齊

TPM_LEFTALIGN: 彈出的菜單左邊界位置與參數(shù)x對(duì)齊

TPM_RIGHTALIGN: 彈出的菜單右邊界位置與參數(shù)x對(duì)齊

設(shè)置菜單的垂直方向定位

TPM_BOTTOMALIGN: 彈出的菜單底邊界與參數(shù)y對(duì)齊

TPM_TOPALIGN: 彈出的菜單頂邊界位置與參數(shù)y對(duì)齊

TPM_VCENTERALIGN: 彈出的菜單中心位置與參數(shù)y對(duì)齊

設(shè)置菜單是否向窗口發(fā)送消息

TPM_NONOTIFY 用戶(hù)選擇菜單項(xiàng)后 不發(fā)送消息給窗口

TPM_RETURNCMD 用戶(hù)選擇菜單后,直接把菜單項(xiàng)的ID返回到返回值里

設(shè)置用戶(hù)要鼠標(biāo)的哪個(gè)鍵來(lái)選擇菜單

TPM_LEFTBUTTON 鼠標(biāo)左鍵

TPM_RIGHTBUTTON 鼠標(biāo)右鍵   



六、廣播消息

1.SendMessage 只能發(fā)送一個(gè)消息給一個(gè)窗口

如果要給多個(gè)窗口發(fā)送同一個(gè)消息的話(huà),就要用到廣播消息

2.把某個(gè)消息廣播給指定的接收者,接收者可以是一個(gè)應(yīng)用程序

網(wǎng)絡(luò)驅(qū)動(dòng)器,系統(tǒng)級(jí)設(shè)備驅(qū)動(dòng)器,應(yīng)用程序的頂級(jí)窗口

也能接收到廣播消息, 

3.廣播消息的消息值 必須是系統(tǒng)中已經(jīng)注冊(cè)的消息值

所以是不能使用自定義消息的.


4.向Windows注冊(cè)消息

UINT RegisterWindowMessage函數(shù)

注冊(cè)一個(gè)新的窗口消息.保證該消息的值在體統(tǒng)范圍內(nèi)是唯一的

參數(shù) LPCTSTR lpString  被注冊(cè)的消息的名字

返回 被注冊(cè)的消息值


5.廣播系統(tǒng)已注冊(cè)的消息

long BroadcastSystemMessage

(

DWORD flags 選項(xiàng)

BSF_QUERY 每次發(fā)送消息給一接收者,只有接收者返回TURE才發(fā)送給下一個(gè)接受者

BSF_NOHANG 把掛起的應(yīng)用程序當(dāng)成超時(shí),有一個(gè)接受者超時(shí),就停止廣播

BSF_NOTIMEOUTINFOTHUNG 只要接收者沒(méi)掛起,一直等待消息響應(yīng),不會(huì)出現(xiàn)超時(shí)

BSF_FORCEIFHUNG 繼續(xù)廣播消息,即使超時(shí)或者接受者掛起

BSF_POSTMESSAGE 寄送消息,不等待消息響應(yīng),直接返回

BSF_IGNORECURRENTTASK 不發(fā)送消息給屬于當(dāng)前任務(wù)的窗口,這樣應(yīng)用程序就不會(huì)接收自己的消息


LPDWORD lpInfo 指向接受者信息的DWORD指針 并可以為下列值組合

BSM_ALLCOMPONENTS 廣播到所有的系統(tǒng)組件

BSM_ALLDESKTOPS 廣播到所有桌面

BSM_APPLICATIONS 廣播到應(yīng)用程序


UINT Msg 消息ID

WPARAM wParam消息參數(shù)

LPARAM 消息參數(shù)

)




七、動(dòng)態(tài)的將一個(gè)窗口嵌入到一個(gè)窗口

1.首先這個(gè)窗口樣式一開(kāi)始是Popup,

當(dāng)你拖動(dòng)這個(gè)窗口到要嵌入的窗口,然后你修改樣式為WM_CHILD

2. 設(shè)置父窗口

HWND SetPaert(

參數(shù)1 hWndChild  指定的窗口新父窗口的子窗口

參數(shù)2 hWndNewParent  新父窗口

返回值 hWndChild之前的父窗口

 




向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI