windows sdk编程 richedit创建,像十六进制编辑器一样显示文件

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

注意添加几个头文件   

  #include <WinBase.h>
  #include <commctrl.h>
  #include <Commdlg.h>
  #include <Richedit.h>
  #include <malloc.h>

主文件中找到: 主函数添加

        //载入RICHEDIT控件库文件
      HINSTANCE hRich;
      hRich = LoadLibrary(TEXT("riched20.dll")); // RICHED20.dll

主函数最后添加:

      //卸载Richedit控件库文件
      FreeLibrary(hRich);

在消息循环中添加一个消息:

  //注意在主文件头中定义一个richedit控件句柄变量 static HWND hRichEdit;

    WM_CREATE:            

  //创建RichEdit控件,并设置默认字体,及大小 

hRichEdit =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;

//----读取文件并显示-------------
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);
}

时间: 2024-10-06 00:53:28

windows sdk编程 richedit创建,像十六进制编辑器一样显示文件的相关文章

Windows核心编程之创建可等待定时器及其APC回调

概述 创建可等待定时器是Windows内部线程同步的方式之一,本文简单讲述如何使用这一内核对象进行线程同步. 使用方法 创建对象: //创建事件内核对象,默认未触发状态 HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL); 设置对象属性: CreateWaitableTimer创建完成后内核对象处于未触发状态,需要使用API BOOL WINAPI SetWaitableTimer( __in HANDLE hTimer, __in con

【Windows编程】系列第二篇:Windows SDK创建基本控件

在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际上MFC的下层也是通过这些API完成的. 实际上控件也是窗口,只不过是被微软预先创建好的一种窗口类,比如button就是一个类名为“BUTTON”的类.既然控件实际上是窗口,当然也是用CreateWindow或者CreateWindowEx这个函数来完成的,第二个函数除了多一个扩展风格之外,其他完全

Kinect for Windows SDK v2.0 开发笔记 (十五) 手势帧

 (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 这次终于是新的东西了,是"手势帧",不过原名是"可视化手势构建器"(Visual Gesture Builder)帧,是 SDK 2.0自带的手势解决方案,不过,如果您觉得微软写得不可靠,甚至垃圾,您可以尝试自己写个,笔者在 提供的范例中,写了个简单的样子(几十行而已,不要期

Windows界面编程-背景图片、透明特效使用

Windows界面编程第一篇 位图背景与位图画刷 可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下: The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors us

(转)Windows驱动编程基础教程

版权声明 本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括各种格式的文档)复制和转载本书.同时不限制利用此书赢利的行为(如收费注册下载,或者出售光盘或打印版本).不满足此前提的任何转载. 复制.赢利行为则是侵犯版权的行为. 发现本书的错漏之处,请联系作者.请不要修改本文中任何内容,不经过作者的同意发布修改后的版本. 作者信息 作者网名楚狂人.真名谭文.在上海从事W

粒子系统与雨的效果 (DirectX11 with Windows SDK)

前言 最近在学粒子系统,看这之前的<<3D图形编程基础 基于DirectX 11 >>是基于Direct SDK的,而DXSDK微软已经很久没有更新过了并且我学的DX11是用Windows SDK来实现. 顺手安利一波:我最近在学DX11 with WindowSDK 教程 博客地址: https://www.cnblogs.com/X-Jun/p/9028764.html 所以下面的都是基于这个教程和上面提到的那本书来写的,推荐看到教程17章和书里第15章之后再来看这篇博客,有助

体验Code::Blocks下的Windows GUI编程(32 bit and 64 bit)

0. 前言 不知道为什么,几乎所有的C++编程教程都是从命令行版(控制台应用程序)的Hello World开始的.然而,对于现在的年轻人来说,从小就用鼠标点击窗口或图标操作电脑,对于那个神秘黑色的窗口中的文字就像天书.对于我们这些从DOS时代走来的人,或许那个黑色窗口会唤起很多记忆,但是,对于当前的GUI化的时代来说,那个窗口已经没有多少意义了.除非为了显示我的知识渊博和高深莫测,通常我不会给年轻人讲述那个黑色窗口中的东西. 既然现在学习C++编程的都是年轻人,我还是讲一下怎样构建GUI版的He

[Windows]_[初级]_[创建独立子进程和读取子进程的输出]

场景: 1.  有一些外部工具命令需要通过程序调用,比如启动服务器或者使用网络命令获取输出. 2.  使用了匿名管道CreatePipe获取子进程输出. 参考: 1.  MSDN的主题<Creating a Child Process with Redirected Input and Output>. 2.  <Windows核心编程>进程章节. 代码: #include "test_shellrun.h" #include <stdlib.h>

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)