Windows窗口的建立
-
預備知識
-
DC
-
CreateCompatibleDC()? ?
-
CreateDIBSection()
-
SelectObject()
-
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窗口的建立的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 眼眶骨裂手术风险大吗
- 下一篇: 化石多少钱啊?