簡體   English   中英

如何在Windows上創建自定義圖形控制台/終端?

[英]How should I create a custom graphical console/terminal on Windows?

Windows控制台界面(認為cmd窗口)對用戶來說是一個非常簡單的GUI。 但是,它處理渲染,用戶輸入和滾動的效率很高。 無疑,用於創建該界面的方法與傳統的桌面GUI完全不同。

我有興趣為Windows創建自己的自定義控制台/終端,最好使用C#和基於.NET的技術(例如,托管GDI +或WPF)。 首先,我非常希望重新創建標准的簡單Windows Shell。 然后,我可以擴展內容並從那里添加功能。

我正在尋找有關如何創建這樣的控制台UI的一般指導,但是一些具體點包括:

  • 我應該使用哪種渲染模型? 渲染循環? 部分更新(例如WPF)? WinForms模型(不確定如何工作)?

  • 渲染模型中使用哪種緩存?

  • 如何加載字體以及如何呈現字體? 它們是標准的TrueType字體,位圖字體還是其他字體?

  • 滾動如何如此有效地執行?

  • 您認為其他任何相關問題!

實際上,任何關於內置Windows控制台UI(甚至高級Linux終端UI)如何執行這些操作以及如何模擬它們的解釋都是理想的。

編輯:明確地說,我真的很想完全從頭開始。 基於GDI +或WPF等圖形框架,但僅此而已。

我曾經從頭開始實現一個文本輸出窗口-我想要一個像Visual Studio中的“輸出”窗口一樣工作的窗口。 事實證明,這比我預期的要復雜,而且沒有任何輸入功能。

不幸的是,代碼是C ++的,屬於前任雇主,所以我不能與您共享。 但是我可以給你一個關於期望的想法。

您需要一種方法來存儲可以快速索引的輸出行。 如果要限制顯示的行數,還需要易於從頂部擦除行。 在C ++中, deque<string>非常完美,我不知道C#中的等效項(如果有)是什么。

您將需要以下Windows消息的處理程序,並且沒有特定的順序。

  • WM_LBUTTONDOWN-開始選擇。 按下按鈕時,使用SetCapture跟蹤鼠標。
  • WM_LBUTTONUP-結束選擇。
  • WM_RBUTTONUP-轉換為WM_CONTEXTMENU。
  • WM_CONTEXTMENU-顯示帶有“復制/剪切/粘貼”以及其他所需菜單的菜單。
  • WM_KEYDOWN-響應四個光標鍵:Home / End,PageUp / PageDown。 Ctrl-A / Ctrl-C / Ctrl-X / Ctrl-V / Ctrl-D。
  • WM_PAINT-繪制窗口的內容。
  • WM_SIZE-在窗口大小更改時更新滾動條。
  • WM_VSCROLL-在垂直滾動過程中更新窗口的可見部分。
  • WM_HSCROLL-在水平滾動過程中更新窗口的可見部分。
  • WM_CREATE-用於在創建窗口時進行初始化。
  • WM_SETFOCUS-創建系統插入符號以在窗口中顯示當前位置。
  • WM_KILLFOCUS-殺死插入符號,因為只有當前聚焦的窗口應該顯示插入符號。
  • WM_MOUSEMOVE-在按下鼠標左鍵時跟蹤對選擇的更改。
  • WM_CAPTURECHANGED-結束選擇。
  • WM_TIMER-在選擇期間光標離開窗口時自動滾動。
  • WM_GETDLGCODE-添加DLGC_WANTARROWS,以便箭頭鍵通過。
  • WM_MOUSEWHEEL-響應鼠標滾輪的滾動。

將行添加到文本緩沖區后,調整滾動條的范圍。 垂直滾動條范圍將是總行數,水平滾動條范圍將是最寬行的寬度。

最好使用等距的單個字體-這樣會使計算變得容易得多。 特定的字體技術並不重要。 您只需要能夠跟蹤字符的位置即可。

滾動如何如此有效地執行? 您在滾動窗口時跟蹤窗口的頂部和底部,當繪制消息出現時,您僅繪制當前可見的線。 其他人仍在緩沖區中,但不會被觸碰。 滾動窗口時可能會滲色窗口的內容,並且僅繪制從頂部或底部進入的部分,但是對於當今的處理器,這是浪費了精力-窗口會如此快地進行完全重新繪制,以至於您不會注意到。

編輯:碰巧我碰到了這個Microsoft指南滾動條,這應該是完成此任務的必讀內容。 http://msdn.microsoft.com/zh-CN/library/windows/desktop/bb787527.aspx

如果要創建漂亮的基於.NET的命令提示符替換,則建議查看http://poshconsole.codeplex.com/。它使用WPF作為圖形元素,並實現了PowerShell腳本宿主。 PowerShell是Microsoft替代古老的命令提示符的工具。 默認情況下,Windows 7中已安裝PowerShell,但您可以將其下載到XP和Vista中。 通過直接使用.NET對象編寫腳本,PowerShell具有高度可擴展性。 它也可以嵌入其他程序中。

WPF + PowerShell將是您要做的一個很好的起點。 如果需要,可以將PowerShell換成自己的命令/腳本引擎。 如果您真的很雄心勃勃,則可以大膽嘗試在DLR上實現自己的腳本語言以充當命令解釋器。

祝你好運。

看一下Console開源項目。 它做了很多,而且做得很好。 它為基於字符的任何內容提供了一個統一的控制台。 我分別在自己的標簽中運行cmd,bash和python。

它是用C ++語言編寫的,但是不會提供自己編寫代碼的樂趣。

我在RichTextBox的輸出方面取得了很大的成功。 實際上,它完成了您可能希望做的所有事情:顏色自定義,有效的渲染和滾動,剪貼板操作等。輸入是通過攔截窗口的KeyPress事件來組織的。

如果速度至關重要,則XNA是一種快速繪制文本的快速方法(最少編碼)。 它可以以100幀的FPS處理數千個精靈。 使用SpriteBatch :: DrawString()和SpriteFont,您可以花費很少的精力就可以得到一個高速的“控制台”。 可以修改標准的“游戲”類,以僅按需重新繪制屏幕的子區域。 注意事項包括不完善的字距調整,這會使文本的外觀模糊(您可以通過關閉抗鋸齒並注意投影和子畫面的位置來解決此問題)。 如果這是一個問題,則Direct2D可能會提供更好的解決方案(或任何已經提到的解決方案)。

作為第一種簡單方法,我將在多行模式下使用TextBox 監視TextChangedKeyPressedKeyUp事件並采取相應措施。 以后,您可以通過從一個簡單的Panel控件派生一個控件來創建自己的控件。 通過覆蓋OnPaint方法(WinForms)進行渲染。 不需要循環,只需調用InvalidateRefresh

使用字符串數組或List<string>LinkedList<string>作為行緩沖區,或僅使用存儲在文本框中的文本。

如果使用WinForms創建自己的控件,則System.Windows.Forms.TextRenderer是呈現文本的不錯選擇。 它將在OnPaint

如果創建自己的控件,滾動是一件棘手的事情。 System.Windows.Controls.Panel已經包含滾動支持,但是當文本更改時,您仍然必須告訴控件如何放置和調整滾動條按鈕的大小。 另一方面,當用戶移動滾動條並相應更新顯示時,您已經移動了文本。 對於這樣簡單的控制,性能應該不是問題。

github上的FastColoredTextBox項目有一個Console示例。 它是:

  • 高效快捷
  • 有色
  • 在WPF和WinForm中可用
  • 在C#中且易於閱讀

我認為閱讀代碼將對您有很大幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM