"

德甲体育-欢迎您_YABO网页登陆-官网-欢迎您拥有全球最顶尖的原生APP,每天为您提供千场精彩体育赛事,德甲体育-欢迎您_YABO网页登陆-官网-欢迎您更有真人、彩票、电子老虎机、真人电子竞技游戏等多种娱乐方式选择,德甲体育-欢迎您_YABO网页登陆-官网-欢迎您让您尽享娱乐、赛事投注等,且无后顾之忧!

"
首頁 > Windows界面編程第三篇 異形窗體 普通版

Windows界面編程第三篇 異形窗體 普通版

互聯網 2021-04-17 12:37:40
???????????????

??? 上一篇《Windows界面編程第二篇 半透明窗體》介紹了先使用SetWindowLong為窗體加上WS_EX_LAYERED屬性,再使用SetLayeredWindowAttributes調整窗體的透明度。本篇將使用這二個函數來完成另一個實用的功能——異形窗口(異形窗體)。

異形窗口的原理很簡單,首先加載一張位圖畫刷作窗口背景,然后設置透明色就可以使得窗口由矩形變成任意形狀。這樣使得窗口的顯示更加美觀。

?

??? 下面先簡單介紹下Win32 SDK方式創建窗口的流程(按《Windows程序設計》中的大體流程):

1.設置WNDCLASS類型的變量,這個變量將描述窗口的風格、窗口消息處理函數、程序圖標、光標、窗口背景畫刷等待。

2.使用RegisterClass將WNDCLASS類型的變量注冊下。

3.使用CreateWindow或CreateWindowEx創建窗口,這里可以設置窗口的初始位置、初始大小、擴展屬性等等。

4.通過ShowWindow和UpdateWindow將窗口顯示出來。

5.窗口顯示完成后,在WinMain()函數中添加消息處理:???

?????? MSG msg;

?????? while (GetMessage(&msg, NULL, 0, 0))

?????? {

????????????? TranslateMessage(&msg);

????????????? DispatchMessage(&msg);

?????? }

通過這五步就完成了一個窗口的創建了。

對于窗口消息函數,一般只要在WM_DESTROY消息中調用下PostQuitMessage(0);其它的消息都可以使用默認消息處理函數DefWindowProc。

?

對于異形窗口,可以在WM_CREATE即窗口初始化時設置好透明色就完成了窗口形狀的改變,不過為了支持鼠標對窗口的拖曳,還要在WM_LBUTTONDOWN消息中加入:

PostMessage(hwnd, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);

這樣,異形窗口就可以在屏幕上像普通窗口一樣的移動了。

?

完整的源代碼如下所示(下載地址:http://download.csdn.net/download/morewindows/4966815):

//?? 異形窗口1? 窗口背景使用位圖畫刷再指定透明色//By MoreWindows-(http://blog.csdn.net/MoreWindows)#include const char szAppName[] = "異形窗口1 MoreWindows-(http://blog.csdn.net/MoreWindows)";/*?* 函數名稱: GetWindowSize?* 函數功能: 得到窗口的寬高?* hwnd????? 窗口句柄?* pnWidth?? 窗口寬?* pnHeight? 窗口高*/void GetWindowSize(HWND hwnd, int *pnWidth, int *pnHeight);/*?* 函數名稱: InitBitmapWindow?* 函數功能: 位圖窗口初始化?* hinstance 進程實例?* hBitmap?? 位圖句柄?* nCmdshow? 顯示方式-與ShowWindow函數的第二個參數相同*/BOOL InitBitmapWindow(HINSTANCE hinstance, HBITMAP hBitmap, int nCmdshow);// 位圖窗口消息處理函數LRESULT CALLBACK BitmapWindowWndPrco(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParm);int APIENTRY WinMain(HINSTANCE hInstance,???????????????????? HINSTANCE hPrevInstance,???????????????????? LPSTR???? lpCmdLine,???????????????????? int?????? nCmdShow){??? //設置窗口背景畫刷為圖片畫刷,再指定透明顏色即可以創建透明區域。?HBITMAP? hBitmap;?hBitmap = (HBITMAP)LoadImage(NULL, "Kitty.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);?if (hBitmap == NULL)?{??MessageBox(NULL, "位圖加載失敗", "Error", MB_ICONERROR);??return 0;?}?if (!InitBitmapWindow(hInstance, hBitmap, nCmdShow))??return 0;?MSG msg;?while (GetMessage(&msg, NULL, 0, 0))?{??TranslateMessage(&msg);??DispatchMessage(&msg);?}?DeleteObject(hBitmap);?return msg.wParam;}BOOL InitBitmapWindow(HINSTANCE hinstance, HBITMAP hBitmap, int nCmdshow){?HWND hwnd;?WNDCLASS wndclass;??wndclass.style?????? = CS_VREDRAW | CS_HREDRAW;?wndclass.lpfnWndProc = BitmapWindowWndPrco;??wndclass.cbClsExtra? = 0;?wndclass.cbWndExtra? = 0;?wndclass.hInstance?? = hinstance;??wndclass.hIcon?????? = LoadIcon(NULL, IDI_APPLICATION);?wndclass.hCursor???? = LoadCursor(NULL, IDC_ARROW);?wndclass.hbrBackground = CreatePatternBrush(hBitmap);//位圖畫刷?wndclass.lpszMenuName? = NULL;?wndclass.lpszClassName = szAppName;??if (!RegisterClass(&wndclass))?{??MessageBox(NULL, "Program Need Windows NT!", "Error", MB_ICONERROR);??return FALSE;?}?BITMAP bm;?GetObject(hBitmap, sizeof(bm), &bm);?hwnd = CreateWindowEx(WS_EX_TOPMOST,??????szAppName,??????szAppName, ??????WS_POPUP,??????CW_USEDEFAULT, ??????CW_USEDEFAULT, ??????bm.bmWidth, ??????bm.bmHeight,??????NULL,??????NULL,??????hinstance,??????NULL);?if (hwnd == NULL)??return FALSE;??ShowWindow(hwnd, nCmdshow);?UpdateWindow(hwnd);??return TRUE;}LRESULT CALLBACK BitmapWindowWndPrco(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParm){?static HDC s_hdcMem;?static HBRUSH s_hBackBrush;??switch (message)?{?case WM_CREATE:??{???// 設置分層屬性????SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);???// 設置透明色???COLORREF clTransparent = RGB(0, 0, 0);????SetLayeredWindowAttributes(hwnd, clTransparent, 0, LWA_COLORKEY);??}??return 0;???case WM_KEYDOWN: ??switch (wParam)??{??case VK_ESCAPE: //按下Esc鍵時退出???SendMessage(hwnd, WM_DESTROY, 0, 0);???return 0;??}??break;??case WM_LBUTTONDOWN: //當鼠標左鍵點擊時可以拖曳窗口??PostMessage(hwnd, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0); ??return 0;?case WM_DESTROY:??PostQuitMessage(0);??return 0;?}?return DefWindowProc(hwnd, message, wParam, lParm);}void GetWindowSize(HWND hwnd, int *pnWidth, int *pnHeight){?RECT rc;?GetWindowRect(hwnd, &rc);?*pnWidth = rc.right - rc.left;?*pnHeight = rc.bottom - rc.top;}

運行結果如下:

?

?

現在總結下異形窗口的創建,先通過創建位圖畫刷來做窗口的背景畫刷,再通過SetWindowLong為窗體加上WS_EX_LAYERED屬性,然后使用SetLayeredWindowAttributes指定窗口的透明色來完成窗口形狀的調整。為了支持鼠標的拖曳,在WM_LBUTTONDOWN消息中作了特殊處理,使得異形窗口可以像普通窗口一樣在屏幕上移動。

?

本篇程序中的異形窗口的大小是無法設置的,只能和位圖一樣。下一篇《Windows界面編程第四篇 異形窗體 高富帥版》將介紹窗口大小可以指定的異形窗口。歡迎繼續瀏覽。

本文配套程序下載地址為:http://download.csdn.net/download/morewindows/4966815

轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/8451633

歡迎關注微博:http://weibo.com/MoreWindows

?

???????????
免責聲明:非本網注明原創的信息,皆為程序自動獲取互聯網,目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,并提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件12小時內刪除。
德甲体育-欢迎您_YABO网页登陆-官网-欢迎您 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>