编译环境 :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);
}