日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Windows窗口的建立

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows窗口的建立 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows窗口的建立
  • 預備知識

  1. DC

  2. CreateCompatibleDC()? ?

  3. CreateDIBSection()

  4. SelectObject()

  5. BitBlt()

  • CODE

設備上下文  

  (簡稱為「DC」)實際上是GDI內部保存的資料結構。設備上下文(與特定的顯示設備(如視訊顯示器或印表機)相關。對於視訊顯示器,設備上下文(總是與顯示器上的特定視窗相關。裝置內容中的有些值是圖形「屬性」,這些屬性定義了GDI繪圖函式工作的細節。

CreateCompatibleDC  

  創建內存DC。假如你要對屏幕進行比較多的GDI(圖形設備接口(Graphics Device Interface))函數操作,如果每一步操作 都直接對屏幕DC進行操作,那出現的大多數可能性都是屏幕的閃爍。一個很好的解決方法就是使用內存DC,將這些操作全部先在內存DC上操作,然后依次性在屏幕上進行操作。HDC定義的變量指向一塊內存,這塊內存用來描述一個設備的相關的內容。

CreateDIBSection 

HBITMAP CreateDIBSection(HDC hdc,CONST BITMAPINFO *pbmi,UINT iUsage,VOID** ppvBits,HANDLE hSection,DWORD dwOffset);

  該函數提供一個指針,該指針指向位圖位數據值的地方。可以給文件映射對象提供句柄,函數使用文件映射對象來創建位圖,或者讓系統為位圖分配內存。

  如果函數執行成功,那么返回值是一個指向剛剛創建的與設備無關位圖(DIB)的句柄,并且*ppvBits指向該位圖的位數據值。

? ? DIB DDB

  Device-indepentent bitmap  Device-dependent bitmap  

  CreateDIBitmap創建的是設備相關位圖句柄 - HBITMAP。

  CreateDIBSection創建的是設備無關位圖句柄 - HBITMAP。 

SelectObject?

把一個對象(位圖、畫筆、畫刷等)選入指定的設備描述表。新的對象代替同一類型的老對象。

HGDIOBJ SelectObject(HDC hdc,         // handle to DCHGDIOBJ hgdiobj  // handle to object);

MSDN中的解釋:

Selects an object into the device context(選擇一個對象到設備上下文中去).

BitBlt

該函數對指定的源設備環境區域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環境。

原型:??

BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc,int nXSrc, int nYSrc,DWORD dwRop);

參數:???

hdcDest:指向目標設備環境的句柄。

nXDest、nYDest:指定目標矩形區域左上角的X軸和Y軸邏輯坐標

nWidth、nHeight:指定源和目標矩形區域的邏輯寬度和邏輯高度。

hdcSrc:指向源設備環境的句柄。

nXSrc、nYSrc:指定源矩形區域左上角的X軸和Y軸邏輯坐標。

dwRop:指定光柵操作代碼。這些代碼將定義源矩形區域的顏色數據,如何與目標矩形區域的顏色數據組合以完成最后的顏色。下面列出了一些常見的光柵操作代碼:

描述

BLACKNESS

表示使用與物理調色板的索引0相關的色彩來填充目標矩形區域,(對缺省的物理調色板而言,該顏色為黑色)。

DSTINVERT

表示使目標矩形區域顏色取反。

MERGECOPY?

表示使用布爾型AND(與)操作符將源矩形區域的顏色與特定模式組合一起。

MERGEPAINT

通過使用布爾型OR(或)操作符將源矩形區域的顏色取反后與目標矩形區域的顏色合并。

NOTSRCCOPY

將源矩形區域顏色取反,拷貝到目標矩形區域。

NOTSRCERASE

使用布爾類型的OR(或)操作符組合源和目標矩形區域的顏色值,然后將合成的顏色取反。

PATCOPY

將特定的模式拷貝到目標位圖上。

PATINVERT

通過使用布爾型XOR(異或)操作符將源和目標矩形區域內的顏色合并。

PATPAINT

通過使用布爾型OR(或)操作符將源矩形區域取反后的顏色值與特定模式的顏色合并。然后使用OR(或)操作符將該操作的結果與目標矩形區域內的顏色合并。

SRCAND

通過使用布爾型AND(與)操作符來將源和目標矩形區域內的顏色合并。

SRCCOPY

將源矩形區域直接拷貝到目標矩形區域。

SRCERASE

通過使用布爾型AND(與)操作符將目標矩形區域顏色取反后與源矩形區域的顏色值合并。

SRCINVERT

通過使用布爾型XOR(異或)操作符將源和目標矩形區域的顏色合并。

SRCPAINT

通過使用布爾型OR(或)操作符將源和目標矩形區域的顏色合并。

WHITENESS

使用與物理調色板中索引1有關的顏色填充目標矩形區域。(對于缺省物理調色板來說,這個顏色就是白色)。

?Code:

#include <windows.h>
#include <tchar.h>LRESULT CALLBACK    windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch(msg){case WM_SIZE:break;case WM_CLOSE:case WM_DESTROY:PostQuitMessage(0);break;default:break;}return  DefWindowProc( hWnd, msg, wParam, lParam );
}int     WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{//  1   注冊窗口類::WNDCLASSEXA winClass;winClass.lpszClassName  =   "Raster";winClass.cbSize         =   sizeof(::WNDCLASSEX);winClass.style          =   CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;winClass.lpfnWndProc    =   windowProc;winClass.hInstance      =   hInstance;winClass.hIcon	        =   0;winClass.hIconSm	    =   0;winClass.hCursor        =   LoadCursor(NULL, IDC_ARROW);winClass.hbrBackground  =   (HBRUSH)(BLACK_BRUSH);winClass.lpszMenuName   =   NULL;winClass.cbClsExtra     =   0;winClass.cbWndExtra     =   0;RegisterClassExA(&winClass);//  2 創建窗口HWND    hWnd   =   CreateWindowExA(NULL,"Raster","Raster",WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,0,0,480,320, 0, 0,hInstance, 0);UpdateWindow( hWnd );ShowWindow(hWnd,SW_SHOW);RECT    rt      =   {0};GetClientRect(hWnd,&rt);//窗口坐標原點位于窗口左上角。RECT上下左右依然是普遍理解的位置int     width   =   rt.right - rt.left;int     height  =   rt.bottom - rt.top;void*   buffer  =   0;
//得到當前窗口DCHDC     hDC     =   GetDC(hWnd);HDC     hMem    =   ::CreateCompatibleDC(hDC);BITMAPINFO	bmpInfor;bmpInfor.bmiHeader.biSize			=	sizeof(BITMAPINFOHEADER);bmpInfor.bmiHeader.biWidth			=	width;bmpInfor.bmiHeader.biHeight			=	height;bmpInfor.bmiHeader.biPlanes			=	1;bmpInfor.bmiHeader.biBitCount		=	32;//一個像素占32個bit位4x8bmpInfor.bmiHeader.biCompression	=	BI_RGB;bmpInfor.bmiHeader.biSizeImage		=	0;bmpInfor.bmiHeader.biXPelsPerMeter	=	0;bmpInfor.bmiHeader.biYPelsPerMeter	=	0;bmpInfor.bmiHeader.biClrUsed		=	0;bmpInfor.bmiHeader.biClrImportant	=	0;HBITMAP	hBmp    =	CreateDIBSection(hDC,&bmpInfor,DIB_RGB_COLORS,(void**)&buffer,0,0);//buffer是指向圖片數組的指針SelectObject(hMem,hBmp);//將內存DC和位圖關聯,DC相當于畫板,Bmp相當于紙memset(buffer,0,width * height * 4);MSG     msg =   {0};while(true)//此循環一直在刷新,占用cpu比較高,4核cpu占用率約為25%{if (msg.message == WM_DESTROY  ||msg.message == WM_CLOSE||msg.message == WM_QUIT){break;}if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){ TranslateMessage( &msg );DispatchMessage( &msg );}memset(buffer,0,width * height * 4);//! 修改其中一部分unsigned char*  rgba    =   (unsigned char*)buffer;int             pitch   =   width * 4;//窗口一行像素占的字節數,(一個像素的rgba是4byte)memset(rgba + pitch * 10,255, pitch);//將第10行每個像素的rgba都改為255,即為一條白線BitBlt(hDC,0,0,width,height,hMem,0,0,SRCCOPY);}return  0;
}

  

posted on 2018-11-22 20:47?GavinTin 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/gavintin/p/10003810.html

總結

以上是生活随笔為你收集整理的Windows窗口的建立的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。