Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посоветуйте контрол, Отображающий форматируемый текст 
V
    Опции темы
albert21
  Дата 13.6.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Всем привет.

Нужен бесплатный контрол, который может отображать форматируемый текст. Что-то типа многострочного Label, строки которого могут быть написаны разным шрифтом, цветом, размером и т.д.

Подскажите пожалуйста, если знаете такого типа контрол.
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
jonie
Дата 13.6.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



RichTextBox [http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.aspx] ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
albert21
Дата 13.6.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Спасибо за совет. Попробовал RichTextBox и сразу наткнулся на ряд проблем, связанных с излишней (для моей задачи) функциональностью данного контрола, а именно:
1) пока не удалось избавиться от мигающего символа каретки (палочка в точке ввода текста). Может кто знает как избавиться?
2) пока не удалось запретить выделение выведенного текста. Может кто знает как запретить? smile
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
albert21
Дата 13.6.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Есть вариант использовать контрол WebBrowser. Присваивать  webBrowser.DocumentText сформированный текст html документа. Но этот самфй текст html документа может быть довольно большим и часто изменяющимся. А это может сказаться на производительности
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
jonie
Дата 14.6.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



Цитата(albert21 @  13.6.2011,  11:13 Найти цитируемый пост)

Нужен бесплатный контрол, который может отображать форматируемый текст. 

"я трубу твоя шаталь!". Форматируемый означает "который может быть отформатирован". Часть слова WebBrowser как бы намекает нам что это "просмотр". Конечно, можно какой-нибудь FSKEditor прикрутить - но овчинка выделки не стоит.

А для скрытия каретки надо (наверно) делать субклассинг окна и ловить нотификационное сообщение EN_SETFOCUS и делать HideCaret(), а также (для курсора мыши) ловить WM_SETCURSOR и делать ShowCursor(NULL). 

А для выделения делать либо EM_HIDESELECTION либо делать SelectionStart=SelectionEnd или что-то вроде того..

Это сообщение отредактировал(а) jonie - 14.6.2011, 00:02


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
albert21
Дата 15.6.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Цитата

А для скрытия каретки надо (наверно) делать субклассинг


Пробую...

Это класс в котором ловятся сообщения 
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    //[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    internal class MyNativeWindowListener : NativeWindow
    {
        [DllImport("user32.dll")]
        static extern bool HideCaret(IntPtr hWnd);

        // Constant value was found in the "WinUser.h" header file.
        private const int WM_LBUTTONDOWN = 0x201;
        private const int WM_SETCURSOR = 0x0020;

        private RichTextBox parent;

        public MyNativeWindowListener(RichTextBox parent)
        {

            parent.HandleCreated += new EventHandler(this.OnHandleCreated);
            parent.HandleDestroyed += new EventHandler(this.OnHandleDestroyed);
            this.parent = parent;
        }

        // Listen for the control's window creation and then hook into it.
        internal void OnHandleCreated(object sender, EventArgs e)
        {
            // Window is now created, assign handle to NativeWindow.
            AssignHandle(((RichTextBox)sender).Handle);
        }
        internal void OnHandleDestroyed(object sender, EventArgs e)
        {
            // Window was destroyed, release hook.
            ReleaseHandle();
        }

        //[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
        protected override void WndProc(ref Message m)
        {
            // Listen for operating system messages

            switch (m.Msg)
            {
                case WM_SETCURSOR:
                    //parent.Cursor = Cursors.Default;
                    HideCaret(parent.Handle);
                    break;
                case WM_LBUTTONDOWN:
                    HideCaret(parent.Handle);
                    break;
            }
            base.WndProc(ref m);
        }
    }
}


Форма на которой располагается RichTextBox
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private MyNativeWindowListener nwl;

        public Form1()
        {
            InitializeComponent();
            nwl = new MyNativeWindowListener(this.richTextBox1);
            
        }

        private void richTextBox1_SelectionChanged(object sender, EventArgs e)
        {
            richTextBox1.SelectionLength = 0;
        }
    }
}


В Win32 API я не шарю. Пробовал ловить сообщение EN_SETFOCUS , но оно не ловится. Наверное такое совсем не поступает в RichTextBox.
Ловится WM_SETFOCUS, но видимо при этом каретка исчезает лишь на тот момент времени, в который пришло это сообщение.

При том варианте, который я привёл, каретка исчезает если навести мышку на RichTextBox. При этом с момента запуска до момента наведения мыши каретка продолжает мигать. также она появляется в момент нажатия левой кнопки мыши.

Подскажите пожалуйста что я делаю не так? Может не те сообщения ловлю? Необходимо чтобы каретка вообще не отображалась.
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
dextermd
Дата 17.6.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Цитата(albert21 @  13.6.2011,  12:38 Найти цитируемый пост)
Попробовал RichTextBox и сразу наткнулся на ряд проблем, связанных с излишней (для моей задачи) функциональностью данного контрола, а именно:
1) пока не удалось избавиться от мигающего символа каретки (палочка в точке ввода текста). Может кто знает как избавиться?
2) пока не удалось запретить выделение выведенного текста. Может кто знает как запретить?


Обе проблемы решаются достаточно просто. Для начала устанавливаем два параметра для RichTextBox: ReadOnly = true  и TabStop = false, затем ловим событие MouseDown и переключаем фокус на другой контрол (например label). Ниже приведен полный код программы:

Код

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            richTextBox1.ReadOnly = true;
            richTextBox1.TabStop = false;            
        }

        private void richTextBox1_MouseDown(object sender, MouseEventArgs e)
        {
            label1.Focus();
        }
    }
}

PM MAIL   Вверх
albert21
Дата 17.6.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Спасибо, dextermd
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
Google
  Дата 20.11.2019, 09:11 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1144 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.