windows_GDI实例讲解
GDI是啥? 就理解为画界面的就行了,
下面的代码是我在ONPAINT消息函数里面写的,
系统什么时候会给窗体发送ONPAINT消息呢?那么就是当窗口无效的时候,什么时候窗口无效呢?那么就是被遮蔽或者还原的时候:
看代码:
LRESULT QMainFrame::OnPaint(WPARAM wParam, LPARAM lParam) { //RECT rcClient; //GetClientRect(&rcClient); //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps); //assert(hDC); //{ // // 输出位图 // HDC hMemDC = ::CreateCompatibleDC(hDC); // assert(hMemDC); // { // HBITMAP hBitmap = (HBITMAP)::LoadBitmap((HINSTANCE)GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1)); // assert(hBitmap); // BITMAP bm; // GetObject((HGDIOBJ)hBitmap, sizeof(BITMAP), &bm); // { // HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap); // { // for(int i=0; i<100; i++) // { // for(int j=0; j<100; j++) // { // ::BitBlt(hDC, rcClient.left+bm.bmWidth*i, rcClient.top+bm.bmHeight*j, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, // hMemDC, 0, 0, SRCCOPY); // } // } // // //::StretchBlt(hDC, rcClient.left, rcClient.top, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); // } // ::SelectObject(hMemDC, hOldBitmap); // } // ::DeleteObject((HGDIOBJ)hBitmap); // } // ::DeleteDC(hMemDC); /* // 双缓冲绘图模式 HDC hMemDC = ::CreateCompatibleDC(hDC); assert(hMemDC); { HBITMAP hCompatibleBitmap = ::CreateCompatibleBitmap(hDC, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top); assert(hCompatibleBitmap); { HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hCompatibleBitmap); { HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0)); HPEN hOldPen = (HPEN)::SelectObject(hMemDC, (HGDIOBJ)hPen); { HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); HBRUSH hOldBrush = (HBRUSH)::SelectObject(hMemDC, (HGDIOBJ)hBrush); { for(int i=0; i<1280; i++) { for(int j=0; j<800; j++) { SetPixel(hMemDC, i, j, RGB(0,0,255)); } } //::Rectangle(hMemDC, 0, 0, 100, 50); //::Ellipse(hDC, 0, 0, 100, 50); } ::SelectObject(hMemDC, (HGDIOBJ)hOldBrush); DeleteObject((HGDIOBJ)hOldBrush); } ::SelectObject(hMemDC, (HGDIOBJ)hOldPen); ::DeleteObject((HGDIOBJ)hPen); ::BitBlt(hDC, rcClient.left, rcClient.top, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMemDC, 0, 0, SRCCOPY); } ::SelectObject(hMemDC, hOldBitmap); } ::DeleteObject((HGDIOBJ)hCompatibleBitmap); } ::DeleteDC(hMemDC); */ /* //HPEN hPen = (HPEN)::GetStockObject(NULL_PEN); HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0)); HPEN hOldPen = (HPEN)::SelectObject(hDC, (HGDIOBJ)hPen); { HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); HBRUSH hOldBrush = (HBRUSH)::SelectObject(hDC, (HGDIOBJ)hBrush); { ::Rectangle(hDC, 0, 0, 100, 50); //::Ellipse(hDC, 0, 0, 100, 50); } ::SelectObject(hDC, (HGDIOBJ)hOldBrush); DeleteObject((HGDIOBJ)hOldBrush); } ::SelectObject(hDC, (HGDIOBJ)hOldPen); ::DeleteObject((HGDIOBJ)hPen); */ /* HPEN hPen = CreatePen(PS_DASHDOT, 1, RGB(255,0,0)); HPEN hOldPen = (HPEN)::SelectObject(hDC, (HGDIOBJ)hPen); { MoveToEx(hDC, 0, 0, NULL); LineTo(hDC, rcClient.right, rcClient.bottom); } ::SelectObject(hDC, (HGDIOBJ)hOldPen); DeleteObject((HGDIOBJ)hPen); */ /* //输出点 for(int i=0; i<100; i++) { for(int j=0; j<100; j++) { SetPixel(hDC, i, j, RGB(0,0,255)); } } */ /* //DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient, DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS | DT_SINGLELINE); //DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient, DT_LEFT|DT_TOP| DT_WORD_ELLIPSIS | DT_SINGLELINE); COLORREF clrOldTextColor = SetTextColor(hDC, RGB(255,0,0)); COLORREF clrBackColor = SetBkColor(hDC, RGB(0,255,0)); HFONT hFont = CreateFont( 200 // nHeight , 0 // nWidth , 0 // nEscapement , 0 // nOrientation , 500 // nWeight , FALSE // nItalic , FALSE // nUnderline , 0 // cStrikeOut , ANSI_CHARSET // nTCHARSet , OUT_DEFAULT_PRECIS // nOutPrecision , CLIP_DEFAULT_PRECIS // nClipPrecision , DEFAULT_QUALITY // nQuality , DEFAULT_PITCH|FF_SWISS// nPitchAndFamily , _T("arial") ); // lpszFacename HFONT hOldFont = (HFONT)::SelectObject(hDC, (HGDIOBJ)hFont); { DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient, DT_LEFT|DT_TOP | DT_SINGLELINE); //TextOut(hDC, 0, 0,_T("www.itxueba.org"), _tcslen(_T("www.itxueba.org"))); } ::SelectObject(hDC, (HGDIOBJ)hOldFont); DeleteObject((HGDIOBJ)hFont); SetBkColor(hDC, clrBackColor); SetTextColor(hDC, clrOldTextColor); */ // } // ::EndPaint(m_hWnd, &ps); //*******************BeginPaint(画文字)************************************************ //RECT rcClient; //GetClientRect(&rcClient);//得到客户端的一个矩形区域 //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps);//得到一个画家,第二个参数表示绘制信息 ////DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient, DT_LEFT|DT_TOP | DT_SINGLELINE); // //画家,字符串 字符串长度 区域 样式 // //TextOut(hDC, 10, 0,_T("www.itxueba.org"), _tcslen(_T("www.itxueba.org"))); // //left,top //::EndPaint(m_hWnd, &ps);//释放一个画家 //************************************************************************************* //*******************BeginPaint(画文字)************************************************ //************************************************************************************* //*******************BeginPaint(创建笔)************************************************ // //RECT rcClient; //GetClientRect(&rcClient);//得到客户端的一个矩形区域 //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps);//得到一个画家,第二个参数表示绘制信息 // //COLORREF clrOldTextColor = SetTextColor(hDC, RGB(255,0,0));//设置文字的颜色 //COLORREF clrBackColor = SetBkColor(hDC, RGB(0,255,0));//设置背景的颜色 // //HFONT hFont = CreateFont( // 200 // nHeight // , 0 // nWidth // , 0 // nEscapement // , 0 // nOrientation // , 500 // nWeight // , FALSE // nItalic // , FALSE // nUnderline // , 0 // cStrikeOut // , ANSI_CHARSET // nTCHARSet // , OUT_DEFAULT_PRECIS // nOutPrecision // , CLIP_DEFAULT_PRECIS // nClipPrecision // , DEFAULT_QUALITY // nQuality // , DEFAULT_PITCH|FF_SWISS// nPitchAndFamily // , _T("arial") ); // lpszFacename // HFONT hOldFont = (HFONT)::SelectObject(hDC, (HGDIOBJ)hFont);//把这只笔给这个画家 // { // DrawText(hDC, _T("www.itxueba.org"), _tcslen(_T("www.itxueba.org")), &rcClient, DT_LEFT|DT_TOP | DT_SINGLELINE); // //TextOut(hDC, 0, 0,_T("www.itxueba.org"), _tcslen(_T("www.itxueba.org"))); // }//{}号表示变量作用区域 // ::SelectObject(hDC, (HGDIOBJ)hOldFont);//恢复这个画家的笔的字体 // DeleteObject((HGDIOBJ)hFont);//释放这只笔 // // SetBkColor(hDC, clrBackColor);//恢复背景颜色 // SetTextColor(hDC, clrOldTextColor);//恢复字体颜色 // //::EndPaint(m_hWnd, &ps);//释放一个画家 //************************************************************************************* //*******************BeginPaint(画点)************************************************ //RECT rcClient; //GetClientRect(&rcClient);//得到客户端的一个矩形区域 //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps);//得到一个画家,第二个参数表示绘制信息 //for(int i=0; i<100; i++) // { // for(int j=0; j<100; j++) // { // SetPixel(hDC, i, j, RGB(0,0,255)); // } // } //::EndPaint(m_hWnd, &ps);//释放一个画家 //************************************************************************************* // ////*******************BeginPaint(画线)************************************************ // //RECT rcClient; //GetClientRect(&rcClient);//得到客户端的一个矩形区域 //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps);//得到一个画家,第二个参数表示绘制信息 //HPEN hPen = CreatePen(PS_DASHDOT, 1, RGB(255,0,0)); // HPEN hOldPen = (HPEN)::SelectObject(hDC, (HGDIOBJ)hPen); // { // MoveToEx(hDC, 0, 0, NULL); // LineTo(hDC, rcClient.right, rcClient.bottom); // } // ::SelectObject(hDC, (HGDIOBJ)hOldPen); // DeleteObject((HGDIOBJ)hPen); // // //::EndPaint(m_hWnd, &ps);//释放一个画家 // ////************************************************************************************* //*******************BeginPaint(画矩形和圆形)************************************************ // //RECT rcClient; //GetClientRect(&rcClient);//得到客户端的一个矩形区域 //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps);//得到一个画家,第二个参数表示绘制信息 //HPEN hPen = CreatePen(PS_DASHDOT, 1, RGB(255,0,0)); // HPEN hOldPen = (HPEN)::SelectObject(hDC, (HGDIOBJ)hPen); // { // ::Rectangle(hDC, 0, 0, 100, 50); // //::Ellipse(hDC, 0, 0, 100, 50); // } // ::SelectObject(hDC, (HGDIOBJ)hOldPen); // DeleteObject((HGDIOBJ)hPen); // // //::EndPaint(m_hWnd, &ps);//释放一个画家 //************************************************************************************* //*******************BeginPaint(双缓冲绘图模式)************************************************ // //RECT rcClient; //GetClientRect(&rcClient);//得到客户端的一个矩形区域 //PAINTSTRUCT ps; //HDC hDC = ::BeginPaint(m_hWnd, &ps);//得到一个画家,第二个参数表示绘制信息 // // // // // //// 双缓冲绘图模式 // HDC hMemDC = ::CreateCompatibleDC(hDC);//创建一个内存的画家 // assert(hMemDC); // { // HBITMAP hCompatibleBitmap = ::CreateCompatibleBitmap(hDC, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);//创建一个画布 // assert(hCompatibleBitmap); // { // HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hCompatibleBitmap);//把这个画布给画家 // { // HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0));//创建一支笔 // HPEN hOldPen = (HPEN)::SelectObject(hMemDC, (HGDIOBJ)hPen);//保存旧的笔 // { // HBRUSH hBrush = CreateSolidBrush(RGB(0,0,255)); // HBRUSH hOldBrush = (HBRUSH)::SelectObject(hMemDC, (HGDIOBJ)hBrush);//画刷的颜色 // { // for(int i=0; i<50; i++) // { // for(int j=0; j<50; j++) // { // SetPixel(hMemDC, i, j, RGB(0,0,255)); // } // } // //::Rectangle(hMemDC, 0, 0, 100, 50); // //::Ellipse(hDC, 0, 0, 100, 50); // } // ::SelectObject(hMemDC, (HGDIOBJ)hOldBrush); // DeleteObject((HGDIOBJ)hOldBrush); // } // ::SelectObject(hMemDC, (HGDIOBJ)hOldPen); // ::DeleteObject((HGDIOBJ)hPen); // //::BitBlt(hDC, rcClient.left, rcClient.top, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, // hMemDC, 0, 0, SRCCOPY);//把hMemDC画的画交给hdc // } // ::SelectObject(hMemDC, hOldBitmap);//还原画布 // } // ::DeleteObject((HGDIOBJ)hCompatibleBitmap);//删除画布 // } // ::DeleteDC(hMemDC);//删除内存画家 // // //::EndPaint(m_hWnd, &ps);//释放一个画家 //************************************************************************************* //*******************BeginPaint(画位图)************************************************ RECT rcClient; GetClientRect(&rcClient); PAINTSTRUCT ps; HDC hDC = ::BeginPaint(m_hWnd, &ps); assert(hDC); { // 输出位图 HDC hMemDC = ::CreateCompatibleDC(hDC);//创建一个内存画家 assert(hMemDC); { HBITMAP hBitmap = (HBITMAP)::LoadBitmap((HINSTANCE)GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));//导入位图资源 assert(hBitmap); BITMAP bm; GetObject((HGDIOBJ)hBitmap, sizeof(BITMAP), &bm);//得到位图资源到变量中 { HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap);//把这个位图画布交给这个内存画家 { for(int i=0; i<100; i++) { for(int j=0; j<100; j++) { ::BitBlt(hDC, rcClient.left+bm.bmWidth*i, rcClient.top+bm.bmHeight*j, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMemDC, 0, 0, SRCCOPY);//把这个内存画家画的图画交给另一个画家 } } //::StretchBlt(hDC, rcClient.left, rcClient.top, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); } ::SelectObject(hMemDC, hOldBitmap);//还原画家的画布 } ::DeleteObject((HGDIOBJ)hBitmap); } ::DeleteDC(hMemDC); } ::EndPaint(m_hWnd, &ps);//释放一个画家 //************************************************************************************* return true; }
感谢IT学吧

浙公网安备 33010602011771号