创意作家的文字处理器

Part I: How I Scraped Merriam-Webster's Dictionary

第一部分:我如何报废Merriam-Webster的字典

Part II: Merriam-Webster's Dictionary : Converting HTML to RTF

第二部分: Merriam-Webster词典:将HTML转换为RTF

Zipped Dictionary Files

压缩字典文件

介绍 (Introduction)

update : 2019/11/15 - found and fixed a few bugs - updated source code

更新:2019 /11 /15-发现并修复了一些错误-更新了源代码

update : 2019/11/16 - added more search feedback & fixed some bugs - updated source code

更新:2019 /11 /16-添加了更多搜索反馈并修复了一些错误-更新了源代码

update : 2020/01/23 - added new GUI FileDialog - fixed some DictionarySelection bugs - updated source code

更新:2020 /01 /23-添加了新的GUI FileDialog-修复了一些DictionarySelection错误-更新了源代码

I'm a writer. I write. Most of the time, I write software but every so often I need to change speed and write a story, or even a novel. Anyone can use commercially available word-processors and do very well. I'm willing to guess that not many authors, aside from the independently-destitute like myself, build & test their own word-processors. Few spend weeks and months typing dictionaries into databases to incorporate them into their writing tools and none post articles about how they scraped Merriam-Webster's website to complement their hacking skills with a bit of prose.

我是作家 我写。 大多数时候,我都写软件,但是我经常需要改变速度,写故事,甚至是小说。 任何人都可以使用市售的文字处理器,并且做得很好。 我愿意猜测,除了像我这样的独立专家之外,没有多少作家能够构建和测试自己的文字处理器。 很少有人花数周和数月的时间在数据库中输入字典以将其整合到他们的书写工具中,也没有人发布关于他们如何刮掉Merriam-Webster网站的文章以用一些散文来补充其黑客技巧。

What you're reading here today is the result of all that.

您今天在这里阅读的内容就是所有这些的结果。

背景 (Background)

Back when WiFi was not freely available in soup kitchens, internet cafés charged good coin to let you see the marvels of the information super-highway and librarians shushed you along after only one hour of working at a dusty old CRT screen chugging along their slow and overcrowded pipe, so scraping non-existing online dictionaries was a thing of fantasy. Word processors could spell check but getting a definition required leafing through a heavy book at frightening peril of getting a paper-cut. So, if you wanted a word-processor to include a dictionary, you either packed your CD-ROM with what you could afford and wobbled from one app to the other while trying not to crash your 30MHz 386, or you just looked it up in grandpa's big-word book. Unless you were hardcore enough to borrow a dictionary from the library and renewed it every three weeks while you typed each word entry into your PC then saved them on your crowded harddrive. Yes, yes, I think the word hardcore is appropriate, otherwise I'd have to resort to self-abusive language unsuitable for the non-TOR tip of the internet.

过去,在汤厨房里无法免费使用WiFi时,网吧收取了很多钱,让您看到信息高速公路的奇妙之处,而图书管理员在一个尘土飞扬的旧CRT屏幕上工作了一个小时,却缓慢地slow绕着他们,使您无法自拔过度拥挤的管道,因此刮除不存在的在线词典是一种幻想。 文字处理器可以拼写检查,但要获得定义,则需要翻阅一本笨拙的书,以致害怕获得剪纸的危险。 因此,如果您想让文字处理器包括字典,则可以用您可以负担的价格包装CD-ROM,并在不使30MHz 386崩溃的情况下从一个应用程序摇摆到另一个应用程序,或者您只是在其中查找爷爷的大字本。 除非您有足够的顽固性,可以从图书馆借用字典并每三周更新一次,而您在PC中键入每个词项然后将其保存在拥挤的硬盘中。 是的,是的,我认为“ 硬核 ”一词是适当的,否则我将不得不诉诸于不适合互联网非TOR技巧的自虐语言。

So, if you've read my previous article, Spell Weller but Grammar's Up to You then you're probably aware of my affinity for spending 100s of hours, typing dictionary after dictionary, day-in & day-out, into my computer. It took me only six weeks to type the mediocre volume: Webster's New Explorer Dictionary and six months to type the Larousse Dictionnaire du Français d'aujourd'hui French Dictionary (for which I made an app that conjugates, "bien sur"). A dozen dictionaries and hundreds of typos later, I give them all to you, dear reader, for free. Just go to the web-link above to access them off my GoogleDrive.

因此,如果您读过我的前一篇文章,《 咒语威勒》但“语法由您决定”,那么您可能知道我愿意花100个小时的时间,每天在字典中输入字典,日复一日地进入计算机。 我只花了六周的时间就录下了平庸的书籍: 韦伯斯特的《新探险家词典》 ,花了六个月的时间输入了《法语法语词典》(我制作了一个与“ bien sur”结合使用的应用程序)。 十几本词典和数百种错别字,亲爱的读者,我免费将它们全部提供给您。 只需转到上面的网络链接,即可从我的GoogleDrive访问它们。

As of this writing, no dip-sh!t has logged on it and changed the password. If (when) that happens, leave me a message below and I'll see what I can do. If I can't repair that tiresome little prank, I'll upload it all again to another email address, or ... we'll see.

在撰写本文时,尚无dip-sh!t登录并更改密码。 如果(何时)发生这种情况,请在下面给我留言,我将拭目以待。 如果我无法修复那令人讨厌的小恶作剧,请将其再次上传到另一个电子邮件地址,或者...我们会看到的。

Since the app auto-detects the dictionary files and directories, you have to put them where it expects to find them. Right now, it's hard-coded to search for the C:\Words_Dictionaries\ directory on your C: drive, then detect all the sub-directories that end in the four-letters "Dict". This distinction is no longer necessary and can be removed so long as you don't put other sub-directories in with the Dictionaries you just downloaded. Create the C:\Words_Dictionaries\ directory. Download all the zipped files stored on the third-party email address listed above and expand the zipped files into c:\Words_Dictionaries\ so that when you're done, it should look something like this:

由于该应用会自动检测字典文件和目录,因此您必须将其放置在希望找到它们的位置。 现在,已经对其进行了硬编码,以搜索C:驱动器上的C:\ Words_Dictionaries \目录,然后检测以四个字母“ Dict ”结尾的所有子目录。 只要您不将其他子目录与刚刚下载的“词典”一起放入,这种区别就不再必要,可以删除。 创建C:\ Words_Dictionaries \目录。 下载存储在上面列出的第三方电子邮件地址上的所有压缩文件,然后将压缩文件扩展到c:\ Words_Dictionaries \,以便完成后,它应类似于以下内容:

Image 1

给新手的注意 (Note to the Newbie)

For those of you who wandered in here without a clue how to run a C# application, don't worry. It's a simple matter.

对于那些不知道如何运行C#应用程序的人来说,请不要担心。 这很简单。

  1. Download the source code at the top of this page and expand it somewhere you'll know where to find it

    在此页面的顶部下载源代码,并将其扩展到可以在哪里找到的地方
  2. Download Visual Studio 2019 from Microsoft and follow the instructions to install it

    从Microsoft下载Visual Studio 2019并按照说明进行安装

  3. Double click the fancy new icon that appears on your desktop

    双击出现在桌面上的新奇图标
  4. Select the 'open solution' button when prompted

    出现提示时选择“打开解决方案”按钮
  5. Find the source-code you downloaded

    查找您下载的源代码
  6. Select the words.sln file and press ok

    选择words.sln文件,然后按确定

    • run the app in debugger-mode (slightly slower than the executable) by pressing F5

      F5以调试器模式运行该应用程序(比可执行文件慢一点)

    • or, compile the application by pressing the Ctrl-Shift-B key-combination and then find the executable in the source-code's subdirectory c:/WhereverYouPutIt/Bin/Debug/words.exe

      或者,通过按Ctrl-Shift-B组合键编译应用程序,然后在源代码的子目录c:/WhereverYouPutIt/Bin/Debug/words.exe中找到可执行文件。

The source code on offer here today for the low-low price of zip-nothing is the word-processor I wrote ten years ago that I used to write my fourth novel Cleats of the Counter-Revolution. I've worked on this app considerably since then and it's looking pretty good. It makes use of EXTENDED Version of Extended Rich Text Box (which helped it a lot), as well as a search engine for multiple dictionaries you can combine at will and an intuitive notes form to help you organize the tangled underbrush beneath your creative muse.

今天这里提供的低价低价的源代码是我十年前写的文字处理器,我曾经写过我的第四本小说《反革命的折磨》 。 从那时起,我就一直在开发此应用程序,而且看起来还不错。 它利用了扩展富文本框EXTENDED版本 (对它有很大帮助),以及可以随意组合的多个词典的搜索引擎和直观的便笺形式,可以帮助您在创意缪斯之下组织纠结的笔刷。

The only new source-code widget that might interest you is a classMultiButtonPic that inherits a PictureBox and can paint hundreds of interactive buttons using a sweep-and-prune algorithm to map them all. I've improved it since my previous article so if you already have a copy, you'll want the newer one.

您可能唯一感兴趣的新的源代码小部件是classMultiButtonPicclassMultiButtonPic继承了PictureBox并且可以使用扫描和修剪算法绘制所有交互式按钮以绘制所有按钮。 自从上一篇文章以来,我已经对其进行了改进,因此,如果您已经有了副本,那么您将需要更新的副本。

使用代码 (Using the Code)

This is a functioning app on its own but we might as well have a look at that famous classMultiButtonPic mentioned above. It's essentially a picture box with rectangles mapped out onto it that your user can interact with using the mouse cursor.

这是一个功能正常的应用程序,但我们不妨看看上面提到的著名的classMultiButtonPic 。 本质上,它是一个带有矩形的图片框,您的用户可以使用鼠标光标进行交互。

Image 2

Everything beneath the 'add' & 'hide' buttons (except the textbox with the 'W') are buttons drawn on a common picture box. The Ctrl 'button' is the only one that doesn't interact. The rows of four '¤' set the selected search style for each dictionary. There are also three buttons at the bottom 'Use Clip Board', 'Pop Up Reference' & 'Delete'. The response time is great. Each button can be set to toggle independently from the others and the widget's internal mouse events can be overwritten in order to use these buttons like they were radio-buttons on a common panel.

添加 ”和“ 隐藏 ”按钮下方的所有内容(带有“ W ”的文本框除外)都是在普通图片框上绘制的按钮。 Ctrl“按钮”是唯一不交互的按钮。 四行“ ¤ ”为每个词典设置选定的搜索样式。 底部的“ 使用剪贴板 ”,“ 弹出参考 ”和“ 删除 ”还有三个按钮。 响应时间很棒。 可以将每个按钮设置为独立于其他按钮进行切换,并且可以覆盖小部件的内部鼠标事件,以便像使用普通面板上的单选按钮一样使用这些按钮。

Here's the Mouse-click event inside the multi-button:

这是多按钮内的Mouse-click事件:

//

MouseEventHandler _eventHandler_MouseClick;
public MouseEventHandler eventHandler_MouseClick
{
  get { return _eventHandler_MouseClick; }
  set
  {
    if (_eventHandler_MouseClick != value)
    {
      if (_eventHandler_MouseClick != null)
        MouseClick -= _eventHandler_MouseClick;
      MouseClick -= Event_MouseClick;

      _eventHandler_MouseClick = value;
            
      if (_eventHandler_MouseClick != null)
        MouseClick += _eventHandler_MouseClick;
      else
        MouseClick += Event_MouseClick;
    }
  }
}

virtual public void Event_MouseClick(object sender, MouseEventArgs e)
{
  if (cButtonUnderMouse != null)
  {
    if (cButtonUnderMouse.CanBeToggled)
      cButtonUnderMouse.Toggle();
  }
}
//

by setting the MBP (instance of a classMultiButtonPic) _eventHandler_MouseClick to an event in your app, that event will override the MBP's mouse click event. Here's how it happens in this app:

通过将MBP( classMultiButtonPic实例) _eventHandler_MouseClick设置为应用程序中的事件,该事件将覆盖MBP的鼠标单击事件。 这是此应用程序中发生的情况:

The event is set in the panelSelectDictionary class:

该事件在panelSelectDictionary类中设置:

//
cMBP.eventHandler_MouseClick = cMBP_HTMLTagList_Click;
//

Then the event itself takes over the job of toggling what needs to be toggled in order for groups of buttons to be mutually exclusively toggled (like radio-buttons on a common panel) in the case of the search-type rows of buttons next to the names of the dictionaries.

然后,事件本身接管了切换需要切换的内容的工作,以使按钮组的搜索类型的按钮旁边的搜索类型的按钮相互排斥地切换(例如公共面板上的单选按钮)。字典的名称。

//

private void cMBP_HTMLTagList_Click(object sender, EventArgs e)
{
classCK_Objects.classMultiButtonPic cMBPSender = (classCK_Objects.classMultiButtonPic)sender;
classCK_Objects.classMultiButtonPic.classButton cBtn = 
   (classCK_Objects.classMultiButtonPic.classButton)cMBPSender.cButtonUnderMouse;
if (cBtn != null)
{
  if (cBtn.Tag != null)
  {
    classButtonArray cBtnArray = (classButtonArray)cBtn.Tag;
    classBinTrees.classDictionary cDictionary = cBtnArray.cDictionary;
    int intIndex = cBtnArray.lstButtons.IndexOf(cBtn);
    if (intIndex < (int)enuSearchType._num)
    {
      cBtnArray.eSearchType = (intIndex >= 0 && intIndex < (int)enuSearchType._num)
                        ? (enuSearchType)intIndex
                        : enuSearchType._num;
      for (int intBtnCounter = 0; 
                intBtnCounter < (int)enuSearchType._num; intBtnCounter++)
      {
        cBtn = cBtnArray.lstButtons[intBtnCounter];
        cBtn.Toggled
            = cBtn.Highlight
            = intBtnCounter == intIndex;
      }
      cMBPSender.Refresh();
      if (cBtnPopupReference.Toggled)
        formDictionarySelection.instance.pnlPopUpReference = this;
    }
  }
  else
  {
    panelSelector.enuTypeButton eButtonType = (panelSelector.enuTypeButton)cBtn.obj;
    switch (eButtonType)
    {
      case panelSelector.enuTypeButton.UseClipBoard:
        {
          cBtn.Toggle();
          if (cBtn.Toggled)
          {
            for (int intPnlCounter = 0; intPnlCounter < 
                       formDictionarySelection.instance.lstPnlSelector.Count; intPnlCounter++)
            {
              panelSelector pnlSel = 
                           formDictionarySelection.instance.lstPnlSelector[intPnlCounter];
              if (pnlSel != this && pnlSel.cBtnUseClipBoard.Toggled)
              {
                pnlSel.cBtnUseClipBoard.Toggled = false;
                pnlSel.cBtnUseClipBoard.Highlight = false;
                pnlSel.cMBP.Refresh();
              }
            }
            formDictionarySelection.instance.pnlUseClipBoard = this;
          }
          else
          {
            formDictionarySelection.instance.pnlUseClipBoard = null;
          }
          formDictionarySelection.instance.TmrClipboard_Set();
        }
        break;

// some cases deleted for brevity

      default:
        {
        }
        break;
    }
  }
}

//

In the case of the UseClipBoard button, it needs to look at other panels to make certain that no two panels list dictionaries to be searched whenever your user copies text onto the MS clipboard (which is convenient for use outside this word-processor, e.g., while in your web-browser).

对于UseClipBoard按钮,它需要查看其他面板,以确保每当您的用户将文本复制到MS剪贴板上时,没有两个面板列出要搜索的字典(这在该文字处理器外部方便使用,例如,在您的网络浏览器中)。

Below, you can see the Dictionary Selection screen. By clicking the 'add' button on top, you can add new panels with a full list of all available dictionaries to select from. These panels each have their own Fast-key selections, as well as the option to be selected as the ClipBoard search or PopUpReference dictionaries. Note the top-middle panel's fast-key is Ctrl-T and has the Thesaurus : English dictionary selected. So, when you have your cursor on a word, pressing Ctrl-T in the App will summon the search results of the English Thesaurus for whatever word your cursor is on. Ctrl-W will search Merriam-Webster's dictionary, as it is set in the top-left panel below.

在下面,您可以看到“词典选择”屏幕。 通过单击顶部的“ 添加 ”按钮,您可以添加包含所有可用字典的完整列表的新面板。 这些面板每个都有自己的快捷键选择,以及作为剪贴板搜索或PopUpReference词典选择的选项。 请注意,顶部中间面板的快捷键是Ctrl-T,并且已选择“ 同义词库:英语”词典。 因此,当您将光标放在某个单词上时,在应用程序中按Ctrl-T即可召集英语词库针对光标所在单词的搜索结果。 Ctrl-W将搜索Merriam-Webster的字典,因为它在下面的左上方面板中设置。

N.B. If you want the search type selection to stand out more than they do in the image below, you can go to the class panelSelector panelSelector() instantiation function and add the line:

注意:如果要使搜索类型选择比下图中更加突出,可以转到类panelSelector panelSelector()实例化函数并添加以下行:

//
cButton.BackgroundStyle = 
   classCK_Objects.classMultiButtonPic.classButton.enuBackgroundStyle.BlendIdle;
//

to the default case of the switch(eSearchType). BackgroundStyle = Blend will blend the button with the background image when that button is either idle or highlighted (mouse-over or toggled on) while the BlendIdle setting will not blend with the background when it is highlighted, which is what you want.

defaultswitch(eSearchType)default情况。 BackgroundStyle = Blend将在按钮处于空闲或突出显示状态(鼠标悬停或启用)时将按钮与背景图像混合,而BlendIdle设置在突出显示时不与背景混合,这就是您想要的。

Image 3

In the code above, this image you can see the Switch-Case where the UseClipBoard is dealt with. Since we only want one of the many panels to be referenced when the user copies text to the MS-Clipboard, we have to override the click Mouse-Event and manually set and unset all the UseClipBoard buttons for each of the MultiButtonPics on the screen in order for them to be mutually exclusive. They work similar to the Search-Type selection buttons mentioned earlier, except that they're on different MBP objects and can be toggled on/off. Unlike a set of radio buttons, where you can click the same already selected button again but cannot toggle it off.

在上面的代码中,此图您可以看到处理UseClipBoardSwitch-Case 。 因为我们只希望众多面板中的一个被引用,当用户复制文本到MS-剪贴板,我们必须覆盖点击鼠标事件和手动设置和取消所有UseClipBoard按钮每个的MultiButtonPics在屏幕上为了使它们相互排斥。 它们与前面提到的“搜索类型”选择按钮相似,但它们位于不同的MBP对象上并且可以打开/关闭。 与一组单选按钮不同,您可以在其中再次单击相同的已选择按钮,但无法将其关闭。

N.B. If you plan to use the Rhyming Dictionary, you'll have to set its search-type to 'content' and not 'heading' because I was annoyed watching it download the same list of 100 words 100 times for the same rhyme. So if you want to rhyme with 'log' and you get the results for 'dog', it's because the word dog appears in the list of words that rhyme with 'log' and that's just that.

注意:如果您打算使用押韵字典,则必须将其搜索类型设置为“内容”而不是“标题”,因为我很生气地看着它为同一押韵下载了100个单词的相同列表100次。 因此,如果您想与“ log”押韵,并且得到“ dog”的结果,那是因为dog单词出现在与“ log”押韵的单词列表中,仅此而已。

扫一扫 (Sweep And Prune)

The Sweep and Prune algorithm is implemented as its own class and can be used with any kind of objects from characters in a string (just set the Y value to a constant and use the character index as X) to a map of the cities in Britney Spears's World Tour. You create elements, define their regions and add them to the map. Then when you ask it 'what is under Point(x, y)?' it spits-up whatever you've got hiding under there. Here's a good article to help you understand the algorithm.

Sweep and Prune算法是作为其自己的类实现的,并且可以与string中的string (只需将Y值设置为常数并将字符索引用作X)的任何种类的对象一起使用,以绘制布兰妮市的地图矛的世界巡回演唱会。 您创建元素,定义它们的区域并将其添加到地图。 然后,当您问“在Point(x,y)下是什么?”时, 无论您藏在那儿,它都会吐出来。 这是一篇很好的文章,可以帮助您了解算法。

After receiving a classButton object, the classMultiButtonPic's AddButton() function creates a classSweepAndPrune element which it defines with the rectangular region of the new button then sets its Tag pointer to point to that same button you're defining. Given the region which this button occupies on the screen (cBtn.Area), the SweepAndPrune element will be found whenever the classMultiButton's Search is asked to find any object on its map within the button's region (defined by its location and size, here called Area).

收到classButton对象后, classMultiButtonPicAddButton()函数将创建一个classSweepAndPrune元素,该元素将用新按钮的矩形区域进行定义,然后将其Tag指针设置为指向您要定义的同一按钮。 给定此按钮在屏幕上占据的区域( cBtn.Area ),每当要求classMultiButton的Search在按钮的区域内(由其位置和大小定义,在此定义)上找到任何对象时,都会找到SweepAndPrune元素。称为Area )。

//
public void AddButton(ref classButton cBtn)
{
  classSweepAndPrune.classElement cEle = new classSweepAndPrune.classElement();
  cEle.obj = (object)cBtn;
  cEle.rec = cBtn.Area;
  cMap.Add(ref cEle);
  cBtn.cEle = cEle;
  placeButtons();
}

//

Here's where the App's overriding Mouse-event handles a mouse-click in panelSelector class:

这是应用程序的替代Mouse -event处理panelSelector类中的鼠标单击的panelSelector

//

private void cMBP_HTMLTagList_Click(object sender, EventArgs e)
{
  classCK_Objects.classMultiButtonPic cMBPSender = 
                       (classCK_Objects.classMultiButtonPic)sender;
  classCK_Objects.classMultiButtonPic.classButton cBtn = 
         (classCK_Objects.classMultiButtonPic.classButton)cMBPSender.cButtonUnderMouse;
  if (cBtn != null)
  {
    if (cBtn.Tag != null)
    {
      classButtonArray cBtnArray = (classButtonArray)cBtn.Tag;
      classBinTrees.classDictionary cDictionary = cBtnArray.cDictionary;
      int intIndex = cBtnArray.lstButtons.IndexOf(cBtn);
      if (intIndex < (int)enuSearchType._num)
      {
        cBtnArray.eSearchType = (intIndex >= 0 && intIndex < (int)enuSearchType._num)
                          ? (enuSearchType)intIndex
                          : enuSearchType._num;
        for (int intBtnCounter = 0; 
                    intBtnCounter < (int)enuSearchType._num; intBtnCounter++)
        {
          cBtn = cBtnArray.lstButtons[intBtnCounter];
          cBtn.Toggled
              = cBtn.Highlight
              = intBtnCounter == intIndex;
        }
        cMBPSender.Refresh();
        if (cBtnPopupReference.Toggled)
          formDictionarySelection.instance.pnlPopUpReference = this;
      }
    }
//

You can see how it unpacks the classMultiButtonPic object, then retrieves the classButton which is under the mouse cursor before toggling it while untoggling all the other buttons that are stored in the same classButton array.

您可以看到它如何解压缩classMultiButtonPic对象,然后在切换它之前取消鼠标光标下方的classButton ,同时解开存储在同一classButton数组中的所有其他按钮。

笔记 (Notes)

Notes are an interesting feature because you can keep separate notes for each writing project you have. If you're plotting a novel, you might like to write out an outline before you get to the actual scribbling. Jack Kerouac could type out a novel overnight and send it to his publisher and still get paid but most of us aren't Jack Kerouac and despite his success and beep-bop prose finger-snapping rhythm, I'd still suggest : "Edit Jack! Edit!". Beatniks, what are you gonna do, right? I've only ever read one of Daniel Steele's novels, and as forgettable as it was, the one thing that struck me was the way the plot's main dilemna may have lasted throughout the entire novel but the conflicts that got us from start to finish were all resolved within a page or two, as if she just wrote it all without forethought or planning ... but I digress.

笔记是一项有趣的功能,因为您可以为每个写作项目保留单独的笔记。 如果要绘制小说,则可能需要先写出轮廓,然后才能进行实际的涂鸦。 杰克·凯鲁亚克(Jack Kerouac)可以在一夜之间写出一部小说,然后将其寄给出版商,但仍能获得报酬,但是我们大多数人都不是杰克·凯鲁亚克(Jack Kerouac),尽管他的成功和哔哔声散文的手指捕捉节奏,我仍然建议: !编辑!”。 Beatniks,你打算做什么,对吗? 我只读过丹尼尔·斯蒂尔(Daniel Steele)的一部小说,尽管如此,它仍然令人难以忘怀,使我震惊的是,情节的主要困境可能贯穿整部小说,但使我们自始至终的冲突是所有这些问题都在一两页之内解决了,就好像她只是在没有预见或计划的情况下写完了一切……但是我离题了。

Notes... this word processor lets you keep notes. Just right click the listbox at the top to summon a context menu and you can Add, Delete or Edit the title of the note currently selected. You can edit the content of your notes by just typing what you will. You can reorder the list of notes in the listbox by selecting the one you want to move and then mouse-wheel your way up or down. For the price of forfeiting the use of the '#' pound character, you can create numerical bullet points in the content of your notes. Just type '#' and a numbered bullet will appear. Delete one, insert another or cut'n'paste them in whatever order you like and when you do the slick '#' pressing action-hero move again they'll all be reordered numerically to reflect the order in which they appear in your note's content.

笔记...此文字处理器可让您保留笔记。 只需右键单击顶部的列表框即可调用上下文菜单,您可以添加,删除或编辑当前所选笔记的标题。 您只需输入将要编辑的内容即可编辑便笺的内容。 您可以通过选择要移动的注释,然后上下滚动鼠标滚轮来对列表框中的注释列表重新排序。 为了避免使用'#'井字字符的价格,您可以在笔记内容中创建数字项目符号。 只需键入“#”,就会出现一个编号的项目符号。 删除一个,插入另一个,或以您喜欢的顺序剪切或粘贴它们,然后在按光滑的“#”键时再次按动作英雄,将它们重新排序,以反映它们在笔记中出现的顺序。内容。

You can Load, Save or SaveAs which notes you want independently from which project you're working on by using the Notes form context-menu (right-click the list of Notes Headings or Textbox below and select File).

您可以使用Notes表单上下文菜单(右键单击下面的Notes标题或文本框的列表,然后选择File ),将所需的注释与正在处理的项目独立地加载保存另存为。

QuickView - will display the text-content of any of your notes when you move the mouse over the ListBox

快速查看-将鼠标移到列表框上时将显示任何便笺的文本内容

TopMost - will make sure your Notes form stays in front of all other forms.

TopMost-将确保您的Notes表单位于所有其他表单的前面。

Image 4

In the image below, you can see the result of a search in Merriam-Webster's dictionary for the word 'cold'. There are 107 results and what you see is the definition for 'cold dark matter' printed out in the main dictionary output textbox below on the right while to the left of the mouse-cursor is the result of a mouse-move event over the listbox of results that puts a pop-up definition on the screen defining the word under the mouse cursor 'cold-blooded'. It's a faster way to preview what you would see appear below in the main definition output textbox below if you were to click on the listbox item over which the mouse is currently hovering.

在下图中,您可以在Merriam-Webster的词典中查看单词' cold '的搜索结果。 有107个结果,您所看到的是在右下方的主词典输出文本框中打印出的“ 冷暗物质 ”的定义,而鼠标光标的左侧是列表框上的鼠标移动事件的结果结果显示,在屏幕上弹出定义在鼠标光标“ 冷血 ”下的单词的定义。 如果您要单击鼠标当前悬停在其上的列表框项目,这是一种预览显示在下面的主定义输出文本框中的内容的更快的方法。

Image 5

If you click on a word in the definition below, that word will be searched using the PopUpReference dictionary selected in the Dictionary Selection Panels. You can also let your mouse hover over a word inside that same text and get a pop-up definition that way. This can be handy when you're searching through lists of rhyming words from the Rhyming dictionary or lists of synonyms pulled out of a thesaurus. The word you're looking at in the definition may look and sound good for where you are in your creative writing but you may not be certain of its definition, having this pop-up means of quickly getting that word's definition can be a real time saver. Might spare you the embarrassment of shamelessly abusing your readers by rhyming euphoniously but not getting your meaning across, if you know what I mean.

如果单击以下定义中的单词,将使用在“ 词典选择面板”中选择的PopUpReference词典搜索该单词。 您也可以将鼠标悬停在同一文本内的单词上,并以此方式获得弹出定义。 当您搜索Rhyming词典中的押韵单词列表或从同义词库中提取的同义词列表时,这可能很方便。 您在定义中查看的单词可能看起来和听起来对您在创意写作中所处的位置都不错,但您可能不确定其定义,采用这种弹出式快速获取单词定义的方法可能是实时的保护程序。 如果您明白我的意思,可能会因为调皮而押韵而无意间使读者无耻地虐待读者的尴尬。

You'll notice at the bottom right of the main dictionary definition output textbox there is a button with the '^' character on it. This allows you to make a copy of the current definition into another form you can place beside the search-results form you're looking at. That way, you can search for multiple words from a thesaurus, for example, and mix-and-match the words you think sound good together and still get your meaning across.

您会注意到在主词典定义输出文本框的右下角,有一个带有'^'字符的按钮。 这使您可以将当前定义的副本复制到另一种表单中,该表单可以放在您要查找的搜索结果表单旁边。 这样,您可以从同义词库中搜索多个单词,然后将您认为听起来不错的单词混合搭配在一起,但仍然可以理解您的意思。

Image 6

For example, in the screen capture above, you might want to talk about a 'dead moon' but not actually say 'dead moon'. So you call up a thesaurus search for the word 'dead' by putting the cursor on the word 'dead' in your text and pressing the fast-key combination Ctrl-T defined in the Dictionary Selection Screen to search for the English Thesaurus. This will bring up the Thesaurus search results for the word 'dead'. You make sure what you want is defined in the main definition textbox below by clicking it in the listbox above, then press that funny looking '^' button at the bottom of that form and a new one will appear on top of the one you just clicked. Move that form aside, then repeat the search operation for the word 'moon' and you'll see the search results for that Thesaurus entry. Looking at your two thesaurus entries side-by-side, you can commingle counterparts and sibilate 'lifeless satellite' or you conjure 'inanimate satellite' for a sense of rhyme. Of course, you could just as well say 'dead moon'.... but whatever. You get the idea.

例如,在上面的屏幕截图中,您可能想谈谈“死月亮”,而不是说“死月亮”。 因此,通过将光标置于文本中的“死”一词上并按在“ 字典选择”屏幕中定义的快速键组合Ctrl-T来搜索英语词库,就可以调用词库搜索“死”一词。 这将调出词库搜索结果到“死”一词。 通过单击上方的列表框,确保要在下面的主定义文本框中定义所需的内容,然后按该表单底部的那个看起来很有趣的“ ^”按钮,然后在您刚刚创建的表单顶部显示一个新的点击。 将表单移到一边,然后重复搜索“ moon”一词,您将看到该词库条目的搜索结果。 并排查看两个词库条目,您可以将对应的词混合在一起,使“无生命的卫星”稳定下来,或者使“无生命的卫星”变幻有韵味。 当然,您也可以说“死月亮”...。 你明白了。

兴趣点 (Points of Interest)

If this project doesn't help your prose, maybe you can use some of its component parts and make something else you need. Either way, happy writing, joyous scribbling and may your documents delight, blithe belles-lettres abound that you may create contented compositions and wonder work for pleasant publications and so forth.

如果这个项目对您的散文没有帮助,也许您可​​以使用它的某些组成部分并制作其他所需的东西。 不管是哪种方式,愉快的写作,愉快的涂鸦,并可能使您的文档高兴,使您心满意足,您可以创作出令人满意的作品,并想出令人愉快的出版物等等。

P.S.: Now I can go back to my P.T.M.C. - arcade game I've put on the back-burner to publish this project.

PS:现在,我可以回到我的PTMC-街机游戏,我放了很多东西来发布这个项目。

翻译自: https://www.codeproject.com/Articles/5246733/Creative-Writers-Word-Processor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值