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学吧

 

 

 

 

 

 

posted @ 2013-08-16 13:36  宝贝,我永远都在  阅读(317)  评论(0)    收藏  举报