MFC-BeginPaint和EndPaint

 只能用在消息处理函数WindowProc的WM_PAINT消息中

在WM_PAINT消息中必须使用BeginPaint和EndPaint,否则会不断的调用WM_PAINT,处于死循环

WM_PAINT消息用来绘制背景

LRESULT CGDIDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // TODO: 在此添加专用代码和/或调用基类

    PAINTSTRUCT ps = {0};
    HDC hdc;

    switch (message)
    {
    
    case WM_PAINT: 
        hdc = ::BeginPaint(m_hWnd, &ps);
        /*
        参数1:HWND hwnd  窗口的句柄
        参数2:LPPAINTSTRUCT lpPaint  绘制信息
        返回值:如果函数成功,返回值是指定窗口的“显示设备描述表”句柄
                如果函数失败,返回值是NULL
        注意:这个DC也叫目标DC
        */
        
        HBITMAP hbmp = (HBITMAP)::LoadImage(NULL, _T("D:\\bb\\tu\\1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_DEFAULTSIZE| LR_CREATEDIBSECTION);
        
        HDC hdcmen= ::CreateCompatibleDC(hdc);//创建内存DC
        //这个也叫源DC

        HBITMAP holdbmp= (HBITMAP)::SelectObject(hdcmen, hbmp);//把位图放到内存DC

        BITMAP bmp;
        int n = ::GetObject(hbmp, sizeof(BITMAP), &bmp);//获取位图信息
        BOOL b = BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight, hdcmen,0,0, SRCCOPY);//把源DC拷贝到目标DC
        /*这条指令一般都是原大小拷贝,不缩放
        参数1:HDC hdcDest  目标DC
        参数2:int nXDest   指定目标矩形区域左上角的X轴逻辑坐标
        参数3:int nYDest   指定目标矩形区域左上角的Y轴逻辑坐标
        参数4:int nWidth   指定源在目标矩形区域的逻辑宽度
        参数5:int nHeight  指定源在目标矩形区域的逻辑高度
        参数6:HDC hdcSrc   内存DC句柄
        参数7:int nXSrc    指定源矩形区域左上角的X轴逻辑坐标
        参数8:int nYSrc    指定源矩形区域左上角的Y轴逻辑坐标
        参数9:DWORD dwRop  指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色
                            SRCCOPY:将源矩形区域直接拷贝到目标矩形区域
                            其它看:https://baike.baidu.com/item/BitBlt/6377137?fr=aladdin 
        返回值:如果函数成功,那么返回值非零;如果函数失败,则返回值为零
        */


        ::SelectObject(hdcmen, holdbmp);
        DeleteObject(hdcmen);

        ::EndPaint(m_hWnd, &ps);
        break;

    }



    return CDialogEx::WindowProc(message, wParam, lParam);
}

 

 

 

 

 

 

 

 

posted @ 2023-04-20 20:01  天子骄龙  阅读(100)  评论(0编辑  收藏  举报