win32窗口程序-------3、位图及去除背景色

一、加载位图步骤:

1、创建目标DC

BegainPaint() 
或者GetDc()//窗口的DC   已经包含一张位图
//贴图片需要两个DC,一个为目标DC,一个为源DC

2、创建源DC

HdcMem=CreateCompatibleDC(hDC); //创建的兼容的DC是没有位图的,需要选入一张位图

3、加载位图

HBITMAP  hBitmap = LoadBitmap(GhInstance,MAKEINTRESOURCE(IDB_BITMAP1) ) ;     

4、选入位图

SelectObject(HdcMem,hBitmap); // 选这个位图到,源DC;Bitmap对象只能被缓存DC选中

5、拷贝传输

BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCCOPY);//函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境

6、删除

DeleteObject(hBitmap);//删除位图
          DeleteDC(HdcMem); //删除源DC
          ReleaseDC(hWnd,hDC);//释放目标DC

二、加载位图去处背景色

需要位图有一个白色背景,和一个黑色背景,通过如下的方式可以实现对图片`case WM_PAINT:
{
//目标DC
hDC=GetDC(hWnd);
//源DC
HdcMem=CreateCompatibleDC(hDC);
//加载位图
HBITMAP hBitmap1=LoadBitmap(GhInstance,MAKEINTRESOURCE( IDB_BITMAP1) ) ;
HBITMAP hBitmap2=LoadBitmap(GhInstance,MAKEINTRESOURCE( IDB_BITMAP2 ) ) ;
//(第一次)选入位图、拷贝传输
SelectObject(HdcMem,hBitmap1);
BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCCOPY);//白色的背景
//SRCAND通过使用布尔型AND(与)操作符来将源和目标矩形区域内的颜色合并。
//(第二次)选入位图、拷贝传输
SelectObject(HdcMem,hBitmap2);
BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCPAINT);//黑色的背景
//RCPAINT通过使用布尔型OR(或)操作符将源和目标矩形区域的颜色合并。

DeleteObject(hBitmap);//删除位图
DeleteDC(HdcMem);//删除源DC
ReleaseDC(hWnd,hDC);//释放目标DC
}三、程序及结果

#include <windows.h>
#include "resource.h"


HINSTANCE GhInstance;
//  窗口消息 处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    HDC HdcMem;
    switch(uMsg)
    {
    case WM_CLOSE:   //  点X  窗口关闭的消息
        ::PostQuitMessage(0);    //  发送退出的消息
        break;
    case WM_PAINT:
        {   //1、目标DC 
            hDC=GetDC(hWnd);
            //2、源DC
          HdcMem=CreateCompatibleDC(hDC);
          //3、加载位图
   HBITMAP  hBitmap=LoadBitmap(GhInstance,MAKEINTRESOURCE(IDB_BITMAP1) ) ;  
        // HBITMAP  hBitmap = (HBITMAP)LoadImage(NULL, "20070620224120407.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        //4、选入位图            
    SelectObject(HdcMem,hBitmap); // Bitmap 对象只能被缓存DC选中
    //5、拷贝传输
          BitBlt(hDC,0,0,500,500,HdcMem,0,0,SRCCOPY);

          DeleteObject(hBitmap);//删除位图
          DeleteDC(HdcMem); //删除源DC
          ReleaseDC(hWnd,hDC);//释放目标DC
        }
        break;

    }
    return ::DefWindowProc( hWnd,  uMsg,  wParam,  lParam);
}


int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance, LPSTR pCmdLine,int nCmdShow)
{      GhInstance=hInstance;
    HBRUSH hBrush = ::CreateSolidBrush(RGB(0,0,255));//创建蓝色的画刷


    //  1.  设计
    WNDCLASSEX wndclass;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;   //  是否要分配额外的空间
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.hbrBackground =hBrush;   //  背景颜色,选择蓝色
    wndclass.hCursor = NULL; //  光标
    wndclass.hIcon =NULL;
    wndclass.hIconSm=NULL;  //  窗口左上小图标
    wndclass.hInstance = hInstance;    //  当前实例的句柄
    wndclass.lpfnWndProc = WndProc;    //  消息处理函数
    wndclass.lpszClassName = "123";   //  注册窗口类的名
    wndclass.lpszMenuName = NULL;       //  菜单名
    wndclass.style = CS_HREDRAW|CS_VREDRAW;   //  窗口类的样式


    //  2.  注册
    if(::RegisterClassEx(&wndclass) == FALSE)
    {
        ::MessageBox(NULL,"注册失败","提示",MB_OK);
        return 0;
    }



    //  3.  创建
    HWND hWnd = ::CreateWindow(wndclass.lpszClassName,"~O(∩_∩)O~",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hInstance,NULL);
    if(hWnd == NULL)
    {
        ::MessageBox(NULL,"创建失败","提示",MB_OK);
        return 0;
    }


    //  4.   显示
    ::ShowWindow(hWnd,SW_SHOW);



    //  5.   消息循环
    MSG msg;
    while(::GetMessage(&msg,0,0,0))
    {
        //  翻译
        ::TranslateMessage(&msg);
        //  分发
        ::DispatchMessage(&msg);
    }

    //  删除画刷
    ::DeleteObject(hBrush);
    return 0;
}

结果如下:
这里写图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值