user-0 提问: win32 位图程序，MessageBox输出lpbitmap为什么会出错呢？

回复:
user: user-1
content: 仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-0
content: 引用 9 楼 WUYUAN2011WOAINI 的回复:[quote=引用 8 楼 shazhi_hi 的回复:] [quote=引用 7 楼 WUYUAN2011WOAINI 的回复:] 哪本书上好像有  是哪本书上的呀。《windows程序设计》上不提供个源码让人参考下，还有MSDN上Compression Bitmap也不给例子[/quote]bi.biCompression = BI_RGB;     #define BI_RGB        0L #define BI_RLE8       1L #define BI_RLE4       2L #define BI_BITFIELDS  3L #define BI_JPEG       4L #define BI_PNG        5L[/quote]  这个给信息头的一个字段赋值吧，档赋值为BI_RGB时，表示没有使用压缩，还有BI_RGB,BI_RLE8等等，都在WINGDI.H文件中定义为常量。这些貌似在《windows》程序设计上有介绍 俺找到一份资料，是用MFC实现的http://www.cnki.com.cn/Article/CJFDTotal-JYRJ200308027.htm 现在被迫研究学术论文了

user: user-2
content: 引用 8 楼 shazhi_hi 的回复:[quote=引用 7 楼 WUYUAN2011WOAINI 的回复:] 哪本书上好像有  是哪本书上的呀。《windows程序设计》上不提供个源码让人参考下，还有MSDN上Compression Bitmap也不给例子[/quote]bi.biCompression = BI_RGB;     #define BI_RGB        0L #define BI_RLE8       1L #define BI_RLE4       2L #define BI_BITFIELDS  3L #define BI_JPEG       4L #define BI_PNG        5L

user: user-0
content: 引用 7 楼 WUYUAN2011WOAINI 的回复:哪本书上好像有  是哪本书上的呀。《windows程序设计》上不提供个源码让人参考下，还有MSDN上Compression Bitmap也不给例子

user: user-2
content: 哪本书上好像有

user: user-0
content: 求大神能给个rle8压缩的代码，不要太难了，最好是完善下我提供的那个代码，增加压缩图片的功能

user: user-0
content: 引用 3 楼 SXJIAKE 的回复:定義成 char 類型又如何，裡面的數據還是二進制。C 裡面的指針想怎麼轉都怎麼轉，但你只要不是文本，傳給 MessageBox 一定是亂碼，或錯誤。  改为转化成二进制 是 1111111111111111111111111111111111111111111111111111111111101001 是-23。不知道是什么问题 还有就是我本意是想通过lpbitmap获得位图数据的字节信息

user: user-0
content: 我尝试了下用 char a;  itoa(lpbitmap[1],&a,16); MessageBox(NULL,&a,"",MB_OK); 输出的是一个负数，表示位图的坐标是以左上角为原点么 还是lpbitmap指向的数组的元素保存的不是一个字节数据呀 好烦啊 或者怎么样通过lpbitmap获得扫描行的数据（一次读取一个字节） 或者论坛里有哪位大神可以帮我完善下这个程序，增添压缩图片的功能么 SOS

user: user-3
content: 定義成 char 類型又如何，裡面的數據還是二進制。C 裡面的指針想怎麼轉都怎麼轉，但你只要不是文本，傳給 MessageBox 一定是亂碼，或錯誤。

user: user-0
content: 引用 1 楼 user-4 的回复:不是字符串类型的指针，传入MessageBox，出错是正常的。注意:在c/c++中并不是把一个地址强制转化为char*就认为它是个字符串了。建议楼主再看看c/c++中字符串的相关概念。  lpbitmap定义的时候char *类型的啊 我想写一个截图程序，最后将截取的图片，用RLE8编码压缩，需要读取扫描行，现在的程序实现到可以截图和保存位图，图片压缩功能没有实现。下面是程序（没有封装函数，把功能的实现都放在WM_CREATE里面了，大概是我没有养成好的习惯吧） #include <windows.h>  HBITMAP GetBitmap();    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;  int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                     PSTR szCmdLine, int iCmdShow) {      static TCHAR szAppName [] = TEXT ("BitBlt") ;      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_INFORMATION) ;      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 ("BitBlt 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 HDC         hdcClient, hdcWindow ; 	 static BITMAP bmpScreen; 	 static HDC hdcMem; 	 int count; 	 HBITMAP hBitmap;      PAINTSTRUCT ps ;            switch (message)      {      case WM_CREATE: 		 {hdcClient=GetDC(hwnd);   //获得应用程序客户区窗口句柄 	      hdcWindow = GetWindowDC (NULL) ;  //GetWindowDC可以获得整个应用程序窗口句柄（客户区和非客户区） 											//当参数传值为NULL的时候，得到系统窗口的句柄 		  hBitmap=CreateCompatibleBitmap(hdcClient,100,100);   //创建与设备兼容的位图，宽100像素，高100像素 		  hdcMem=CreateCompatibleDC(hdcClient);                //创建内存设备环境句柄 		  SelectObject(hdcMem,hBitmap);                        //将位图选进内存设备环境           BitBlt (hdcMem, 0, 0, 100,100,  hdcWindow, 0, 0, SRCCOPY) ;   //将系统窗口左上角100*100的图像像素复制到内存设备环境  			 		  /* 																	   		  OpenClipboard( hwnd ) ;   //打开粘贴板 		  EmptyClipboard() ;        //清空粘贴板   		  SetClipboardData( CF_BITMAP, hBitmap ) ;   //设置粘贴板数据，即将位图设置进粘贴板 													 //之前有将新建的位图选进内存设备环境，后来将系统窗口100*100像素图像复制移动到内存 													 //设备环境。我的理解是，将位图选进内存设备环境之后，针对内存设备环境的操作，改变了 													 //位图的内容，而不需要再将内存设备环境选进位图了 		  CloseClipboard() ;       //关闭粘贴板 		  */  		  //Get the BITMAP from the HBITMAP 		  		  GetObject(hBitmap,sizeof(BITMAP),&bmpScreen);  		  //设置位图信息，《windows程序设计15章节的内容》  		  BITMAPFILEHEADER   bmfHeader;   //位图文件头  		  static BITMAPINFOHEADER   bi;          //信息头       		  bi.biSize = sizeof(BITMAPINFOHEADER);     		  bi.biWidth = bmpScreen.bmWidth;     		  bi.biHeight = bmpScreen.bmHeight;   		  bi.biPlanes = 1;     		  bi.biBitCount = 32;     		  bi.biCompression = BI_RGB;     		  bi.biSizeImage = 0;   		  bi.biXPelsPerMeter = 0;     		  bi.biYPelsPerMeter = 0;     		  bi.biClrUsed = 0;     		  bi.biClrImportant = 0; 		  //bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4是每一行所用的字节数 		    	      DWORD dwBmpSize= ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight; 		  count=dwBmpSize;   		  HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize);  //分配内存并锁定 		  char *lpbitmap; 		  lpbitmap = (char *)GlobalLock(hDIB);   		    		  //// Gets the "bits" from the bitmap and copies them into a buffer  		  // which is pointed to by lpbitmap. 		  GetDIBits(hdcWindow, hBitmap, 0, 					(UINT)bmpScreen.bmHeight, 					lpbitmap, 					(BITMAPINFO *)&bi, DIB_RGB_COLORS); 		  //MessageBox(NULL,lpbitmap,"",MB_OK);             // A file is created, this is where we will save the screen capture. 		  HANDLE hFile = CreateFile("captureqwsx.bmp", 								  GENERIC_WRITE, 								  0, 								  NULL, 								  CREATE_ALWAYS, 								  FILE_ATTRIBUTE_NORMAL,  								  NULL);     		  HANDLE hFile1 = CreateFile("captureqwsx.txt", 								  GENERIC_WRITE, 								  0, 								  NULL, 								  CREATE_ALWAYS, 								  FILE_ATTRIBUTE_NORMAL,  								  NULL);          		  // Add the size of the headers to the size of the bitmap to get the total file size 		  DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);   		  //Offset to where the actual bitmap bits start. 		  bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);       		  //Size of the file 		  bmfHeader.bfSize = dwSizeofDIB;       		  //bfType must always be BM for Bitmaps 		  bmfHeader.bfType = 0x4D42; //BM      		  DWORD dwBytesWritten = 0; 		  //将位图文件头，信息头，由GetDIBits获得的保存在lpbitmap指向的内存的bit写入文件中 		  WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL); 		  WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL); 		  WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL); 		   		                  //Unlock and Free the DIB from the heap           GlobalUnlock(hDIB);               GlobalFree(hDIB);            //Close the handle for the file that was created           CloseHandle(hFile);            ReleaseDC (hwnd, hdcWindow) ; 			return 0 ; 		 }       case WM_SIZE:           return 0 ;       case WM_PAINT: 		 {hdcClient=BeginPaint (hwnd, &ps) ;   		  		  BitBlt (hdcClient, 0, 0, 100,100,  hdcMem, 0, 0, SRCCOPY) ;  //这里我们做一个小测试，将截取的图片显示在客户区 																	   //这样需要将hdcClient和hdcMem定义成static的           EndPaint (hwnd, &ps) ;           return 0 ;}       case WM_DESTROY:           PostQuitMessage (0) ;           return 0 ;      }      return DefWindowProc (hwnd, message, wParam, lParam) ; }

user: user-4
content: 不是字符串类型的指针，传入MessageBox，出错是正常的。注意:在c/c++中并不是把一个地址强制转化为char*就认为它是个字符串了。建议楼主再看看c/c++中字符串的相关概念。