Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Курсор в поле мемо


Автор: OutlawZ 23.11.2008, 22:01
Привет народ, вот такая вот проблемка, как можно увеличить ширину курсора в поле Memo? и сделать его другим цветом? помоги те пожалуйста или скажите какая API функция отвечает за это  smile  smile 

Автор: artsb 23.11.2008, 22:12
Я так предполагаю, что нужно заранее нарисовать нужный курсор и в нужный момент просто подставить его.

Добавлено через 8 минут и 22 секунды
Извиняюсь, что в общих чертах. Просто давно за Билдером не сидел и конкретного ничего (пока) сказать не могу.

Автор: OutlawZ 24.11.2008, 20:09
Это не есть true smile, в Putty там курсор не нарисован, есть возможность увеличить курсор тока вот не знаю как это сделать!

Автор: OutlawZ 25.11.2008, 15:35
Народ ну помогите пожалуйста  smile 

Автор: taiven 25.11.2008, 16:07
Что подразумевается под курсором: курсор мыши или каретка(мигающий курсор в поле Memo)?

Автор: OutlawZ 25.11.2008, 16:09
мигающий курсор в поле Memo да я про него!

Автор: KTatsu 25.11.2008, 17:33
Мне известно лишь, что толщина его в самой винде настраивается и действует во всех приложениях. А что конкретно тебе требуется сделать? Может есть другой выход?

Автор: OutlawZ 25.11.2008, 19:36
Есть такая программа как Putty в ней зеленая и широкая каретка, в не зависимости настройки винды. Просто мне что нужно:

1) Увеличить ширину!
2) Сменить цвет!

Пробовал пойти по пути прогресс бара с помощью апи функций я менял ему цвет, а вот не как не могу сменить апи функции для каретки.

Если тут надо задействовать реестр то подскажите как это реализовать!

Автор: THandle 25.11.2008, 21:26
OutlawZ, изучай то что тут написано:

http://msdn.microsoft.com/en-us/library/ms646968(VS.85).aspx

По идее можно создать каретку в виде рисунка smile

Автор: OutlawZ 25.11.2008, 21:34
спасибо )

Автор: artsb 25.11.2008, 22:05
Цитата(THandle @  25.11.2008,  21:26 Найти цитируемый пост)
По идее можно создать каретку в виде рисунка

Цитата(OutlawZ @  25.11.2008,  21:34 Найти цитируемый пост)
спасибо ) 

Дык я про это  и говорил. smile
Могу дать пример.

Автор: OutlawZ 25.11.2008, 23:31
Если можно пример то буду рад, хотя уже сам понял как замутить ) но все таки посмотреть не откажусь! )

У меня тут еще вопрос по поводу создание каретки, вот структура как показано в примере msdn 
Код

BOOL CreateCaret(      
    HWND hWnd,
    HBITMAP hBitmap,
    int nWidth,
    int nHeight
);


Поскольку я программирую в билдере то код скорей должен принять у меня такой вид? :
Код

//сначала создаю рисунок и делаю его ресурсом и подключаю
#pragma resource "im.res"
//потом загружаю картинку
sprite = new Graphics::TBitmap();
sprite->LoadFromResourceName((int)HInstance,"carec");
//потом работаю со структурой создания каретки
BOOL CreateCaret(      
    HWND NULL, 
    HBITMAP sprite,
    int nWidth = 2,
    int nHeight = 2
);




Если код правильный "просто я щас не рядом с своим компом" то в какое событие его пихать? OnCreate?

Автор: THandle 25.11.2008, 23:34
Цитата(OutlawZ @  25.11.2008,  23:31 Найти цитируемый пост)
вот структура как показано


Вообще-то это функция...

Добавлено через 1 минуту и 23 секунды
Описанная в winuser.h

Автор: OutlawZ 25.11.2008, 23:37
Цитата(THandle @ 25.11.2008,  23:34)
Цитата(OutlawZ @  25.11.2008,  23:31 Найти цитируемый пост)
вот структура как показано


Вообще-то это функция...

Добавлено @ 23:35
Описанная в winuser.h

функция или структура мне без разници похожи они smile Но поскольку правило хорошего тона не кто не отменял то извиняюсь smile

Автор: taiven 26.11.2008, 00:33
Вроде получилось, привожу содержание Unit1.cpp и Unit1.h

Unit1.h
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TMemo *Memo1;
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);

    /*********************************************/
    TWndMethod OldProc;
    void __fastcall NewProc(TMessage &Message);
    /*********************************************/

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Unit1.cpp
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    OldProc = Memo1->WindowProc;
    Memo1->WindowProc = NewProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewProc(TMessage &Message)
{
    OldProc(Message);
    if(Message.Msg == WM_SETFOCUS)
    {
        CreateCaret(Memo1->Handle, NULL, 10, 1); //просто меняем ширину и высоту
        ShowCaret(Memo1->Handle);
        OldProc(Message);
    }
    
}

Автор: artsb 26.11.2008, 12:15
OutlawZ, посмотрел Ваш пример. Я приблизительно такой хотел дать smile

Вот другой пример. Если я правильно понял, то это то, что Вам нужно. Единственно пока не придумал, как сделать чтобы каретка менялась при переходе в поле по TAB. Пока работает только при клике мыши.


Автор: taiven 26.11.2008, 13:47
Цитата

Единственно пока не придумал, как сделать чтобы каретка менялась при переходе в поле по TAB. Пока работает только при клике мыши.

надо просто WM_SETFOCUS отловить. Ты мой пример пробовал?

Автор: OutlawZ 26.11.2008, 19:01
Спасибо всем за участие в решение этой задачки smile Все работает smile

Автор: artsb 26.11.2008, 19:02
Цитата(taiven @  26.11.2008,  13:47 Найти цитируемый пост)
надо просто WM_SETFOCUS отловить.

Нет, попробую.

Добавлено через 2 минуты и 7 секунд
OutlawZ, так на чём вы остановились?

Автор: artsb 26.11.2008, 19:39
Вот. Доделал. smile
Может кому пригодится...

Автор: THandle 26.11.2008, 19:41
Вообще примеров с изменением каретки предостаточно в http://drkb.ru/.


Пусть и на Delphi - то же самое.
Советую посмотреть статьи:
  • Можно ли изменить вид текстового курсора (каретки) edit'а или другого элемента?
  • Изменить вид каретки TEdit
  • Как создать каретку свой собственной формы?

Автор: OutlawZ 26.11.2008, 21:28
Я просто совместил два примера в месте smile 

Код

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TMemo *Memo1;
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
    TWndMethod OldProc;
    void __fastcall NewProc(TMessage &Message);
    Graphics::TBitmap *bmp;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



И собственно код:
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma resource "image.res"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    OldProc = Memo1->WindowProc;
    Memo1->WindowProc = NewProc;
    bmp = new Graphics::TBitmap();
    bmp->LoadFromResourceName((int)HInstance,"CARECT");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewProc(TMessage &Message)
{
    OldProc(Message);
    if(Message.Msg == WM_SETFOCUS)
    {
        CreateCaret(Memo1->Handle, bmp->Handle, 0,0);
        ShowCaret(Memo1->Handle);
        OldProc(Message);
    }

}


Все работает smile

user posted image

Автор: artsb 26.11.2008, 21:37
OutlawZ, а зачем мусор в ресурсы засовываете? smile
Таку простую каретку легче нарисовать. Например так, как в моём примере.

Автор: OutlawZ 2.12.2008, 02:02
Цитата(artsb @ 26.11.2008,  21:37)
Таку простую каретку легче нарисовать. Например так, как в моём примере.

Согласен smile, переписал код теперь он такой:

Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TMemo *Memo1;
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
    TWndMethod OldProc;
    void __fastcall NewProc(TMessage &Message);
    Graphics::TBitmap *bmp;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


И собвственно сам код:
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    OldProc = Memo1->WindowProc;
    Memo1->WindowProc = NewProc;
    bmp = new Graphics::TBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewProc(TMessage &Message)
{
    bmp->Height = 12;
    bmp->Width = 10;
    bmp->Canvas->Brush->Color = clLime;
    bmp->Canvas->Brush->Style = bsSolid;
    bmp->Canvas->FillRect(TRect(0,0,bmp->Width,bmp->Height));
    OldProc(Message);
    if(Message.Msg == WM_SETFOCUS)
    {
        CreateCaret(Memo1->Handle, bmp->Handle, 0,0);
        ShowCaret(Memo1->Handle);
        OldProc(Message);
    }

}


И вот все работает так как надо smile
user posted image

Автор: OutlawZ 2.12.2008, 02:25
А можно еще сделать так что бы она не мигала?

Автор: THandle 2.12.2008, 08:15
OutlawZ, поставь огромное время не мигания каретки...

Код

SetCaretBlinkTime(INFINITE);


Только это подействует вообще на всю систему. Видимо это надо делать при получении фокуса твоим контролом с измененной кареткой, а при потере фокуса возвращать BlinkTime обратно smile

Автор: OutlawZ 2.12.2008, 21:16
Спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)