编译环境 :windows 7 64位 vs2010,工程创建选择"win32项目"

注意添加几个头文件   

 

在工程文件的主函数文件中定义一个RichEdit控件句柄全局变量:

static HWND hWinRich;             //注意是静态变量,我以前不用静态的变量,

                //好像无法显示RichEdit;

 

在主函数中加入RichEdit控件库文件装入函数:

HINSTANCE       hRich;

hRich = LoadLibrary(TEXT("RICHED20.dll"));    //注意:放在主函数最前面 ,并且注意大小写;

 

在主函数结尾处释放库文件:

FreeLibrary(hRich);

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

在主过程文件中加入以下消息:

case WM_CREATE:

    //RichEdit控件的创建; 
    hWinRich = CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("RichEdit20A"),NULL,
                 WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |

      ES_MULTILINE | ES_NOHIDESEL,
                 0,0,0,0,hWnd,0,hInst,NULL);

         stCf.cbSize = sizeof(stCf);
         stCf.yHeight = 10 * 20;
         stCf.dwMask = CFM_FACE | CFM_SIZE | CFM_BOLD;
         wcscpy(stCf.szFaceName,_T("宋体"));

         SendMessage(hRichEdit,EM_SETCHARFORMAT,0,(LPARAM)&stCf);
         SendMessage(hRichEdit,EM_EXLIMITTEXT,0,-1);
         break;

 

    break;

//此消息不要疏忽,有几次我搞了好几次都无法显示,

//如果在CreateWindowEx()参数中指定了位置大小,

//不加此消息也可以

case WM_SIZE:

    GetClientRect(hWnd,&stRect);   
    MoveWindow(hWinRich,0,0,stRect.right,stRect.bottom,TRUE);  
    break;


//----读取文件并显示-------------
void DoReadFile(HWND hRichEdit,const wchar_t strFileName[MAX_PATH])
{
  //******打开文件***********
  if((hFile = CreateFile(strFileName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL)) == INVALID_HANDLE_VALUE)
  {
 
    return;
  }
  //******获取文件长度*******
  if(!(iFileLen = GetFileSize(hFile,NULL)))
  {  
    MessageBox(NULL,_T("提示"),_T("文件长度为零"),NULL);
    return;
  }


  //以下函数建立内存映射文件;
  hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
  if(!hFileMap)
  {
 
  return;
  }
//建立映射视图,并用pBuffer指向内存映射文件的第一个字节。
  pBuffer = PBYTE(MapViewOfFile(hFileMap,FILE_MAP_READ |                 FILE_MAP_WRITE,0,0,0));
  if(!pBuffer)
   {
    
    return;
   }

  wchar_t sz[4],szR[512];

  CHARRANGE stcf; //定义结构,EM_EXSETSEL消息需要此消息,
  memset(&stcf,0,sizeof(stcf)); //并且将成员变量设置为 -1 是将光标置文本尾部
  stcf.cpMax = -1;
  stcf.cpMin = -1;
  int count;

//以下处理字节流并在控件中以十六进制显示

for(int j = 0;j<iFileLen/16;j++)
{
  memset(sz,0,sizeof(sz));
  memset(szR,0,sizeof(szR));
  count = 0;
for(int i = 0;i<16;i++)
{
  wsprintf(sz,_T(" %02X"),pBuffer[i]);
  wcscat(szR,sz);
  count++;
}
  pBuffer += count;
  wcscat(szR,_T("\r\n")); //文本加入换行转义字符,实现 在下行输出;

  SendMessage(hRichEdit,EM_EXSETSEL,0,(LPARAM)&stcf); 
  SendMessage(hRichEdit,EM_REPLACESEL,0,(LPARAM)szR);
}

//关闭文件句柄,内存映射文件句柄和释放内存;
UnmapViewOfFile(pBuffer);
CloseHandle(hFileMap);
CloseHandle(hFile);
}

 

posted on 2015-07-28 15:36  ipv10  阅读(862)  评论(0编辑  收藏  举报