下面是win32的代码,显示一副黑白的位图
请问如何改成彩色的,比如黑变成红,白变成蓝
谢谢!
#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName [] = TEXT ("Bricks2") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("CreateBitmap Demo"), 
                          WS_OVERLAPPEDWINDOW, 
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 static BITMAP bitmap = { 0, 2, 2, 2, 1, 1 } ;
 static BYTE  bits []       = {    0x80, 0x00,        
                                  
                               0x40, 0x00  } ;     static HBITMAP hBitmap ;
     static int     cxClient, cyClient, cxSource, cySource ;
     HDC            hdc, hdcMem ;
     PAINTSTRUCT    ps ;
     
     switch (message)
     {
     case WM_CREATE:
          bitmap.bmBits = bits ;
          hBitmap = CreateBitmapIndirect (&bitmap) ;
          cxSource = bitmap.bmWidth ;
          cySource = bitmap.bmHeight ;
          return 0 ;     case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          return 0 ;     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;          hdcMem = CreateCompatibleDC (hdc) ;
          SelectObject (hdcMem, hBitmap) ;
          
  StretchBlt (hdc, 0, 0, cxClient, cyClient, 
                           hdcMem, 0, 0, cxSource, cySource, SRCCOPY) ;          DeleteDC (hdcMem) ;
          EndPaint (hwnd, &ps) ;
          return 0 ;     case WM_DESTROY:
          DeleteObject (hBitmap) ;
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

解决方案 »

  1.   

    static BITMAP bitmap = { 0, 2, 2, 2, 1, 1 } ;
    static BYTE bits [] = { 0x80, 0x00,0x40, 0x00 } ;修改下BITMAP信息,并把bitmap数据bits改下就可以了.
      

  2.   

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     static BITMAPINFOHEADER bmheader = {sizeof(BITMAPINFOHEADER), 2, 2, 1, 24, BI_RGB};
     static BYTE  bits []       = {0x00, 0x00, 0xff, 0xFF,0x00, 0x00, 0x00, 0x00,0xff, 0x00, 0x00, 0x00 , 0x00, 0xff, 0x00, 0x00 } ;
         static int     cxClient, cyClient;
    BITMAPINFO bminfo;
         PAINTSTRUCT    ps ;
        
         switch (message)
         {
         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              return 0 ;     case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
     bminfo.bmiHeader = bmheader;
     StretchDIBits(hdc,0,0,cxClient,cyClient,0,0, mheader.biWidth,bmheader.biHeight, bits,&bminfo,DIB_RGB_COLORS,SRCCOPY);           EndPaint (hwnd, &ps) ;
              return 0 ;     case WM_DESTROY:
               PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }