首先颜色的定义,这里用32位即4个字节来表示1个颜色,从左到右数,第一个字节表示透明度,第二个字节是R,第三个字节是G,第四个字节是B。例0x000000ff
表示蓝色。
定义100*100的二维数组,对角线赋值蓝色,其余为背景色黑色,即要在窗口中画一条对角线。
将二维数组按行传给DWORD *pbit32
DWORD *pbit32 = (DWORD *)malloc(100* 100 * sizeof(DWORD));
int k = 0;
for (size_t j = 0; j < 100; j++)
{
for (size_t i = 0; i < 100; i++)
{
if (i == j)
pbit32[k++] = 0x000000ff;
else
pbit32[k++] = 0x00000000;
}
}
创建100*100的位图
CBitmap bmpDraw;
bmpDraw.CreateBitmap(100, 100, 1, 32, pbit32);
将100*100的位图显示到窗口中左上角坐标(0,0),宽和高均为100的区域中
GetDC()->BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
全部代码如下:
DWORD *pbit32 = (DWORD *)malloc(100* 100 * sizeof(DWORD));
int k = 0;
for (size_t j = 0; j < 100; j++)
{
for (size_t i = 0; i < 100; i++)
{
if (i == j)
pbit32[k++] = 0x000000ff;
else
pbit32[k++] = 0x00000000;
}
}
CDC memDC;//定义一个兼容DC
memDC.CreateCompatibleDC(GetDC());//创建DC
CBitmap bmpDraw;
bmpDraw.CreateBitmap(100, 100, 1, 32, pbit32);//装入DDB
CBitmap* pbmpOld = memDC.SelectObject(&bmpDraw);
//保存原有DDB,并选入新DDB入DC
GetDC()->BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
//将源DC中(0,0,100,100)复制到目的DC(0,0,100,100)
memDC.SelectObject(pbmpOld);//选入原DDB
bmpDraw.DeleteObject();
memDC.SelectObject(pbmpOld);
memDC.DeleteDC();
free(pbit32);
注意:MFC中的RGB()
与这里的颜色表示不同,比如RGB(255,0,0)
表示红色,写成32位是0x000000ff
,在这里表示蓝色,所以写了个RGB到这里颜色的转换函数
DWORD RGB2DWORD(COLORREF colr)
{
DWORD a = 0x000000ff;
return ((colr&a) << 16) | (((colr >> 8)&a) << 8 )| ((colr >> 16)&a);
}