Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2010, 20:25   #1
Lich87
 
Аватар для Lich87
 
Регистрация: 22.10.2009
Сообщений: 9
По умолчанию условное отображение иконки в строке состояния StatusBar

У меня есть программа в виде текстового редактора. Большую часть области занимает компонент Memo. Вверху находится панель быстрого доступа, а над ним - меню. Программа может открывать файлы, изменять их, сохранять, создавать новые. Внизу, под Memo, находится строка состояния.

Задача:
Необходимо, чтобы при редактировании текста в строке состояния отображался значок-иконка с буквой "M" например. Также необходимо, чтобы после сохранения файла там же отображался другой значок-иконка, например, с буквой "S".

Обработчик события StatusBar1DrawPanel, насколько я понимаю, выполняется только один раз, при или перед загрузкой приложения. Мне нужно, что постоянно проверялось, изменён ли текст и выводилось в строку состоянию, если он изменён.
Lich87 вне форума Ответить с цитированием
Старый 24.04.2010, 18:04   #2
Lich87
 
Аватар для Lich87
 
Регистрация: 22.10.2009
Сообщений: 9
По умолчанию

Решил проблему сам (ну и частично мне помогли на другом форуме по программированию).

Вот окончательный вариант программы:
Код:
...
#pragma package(smart_init)
#pragma resource "*.dfm"
TScratchPad *ScratchPad;
bool FileisSaved,MemoModified; // глобальные переменные:
                                 //FileisSaved - сохранён ли файл
                                 // MemoModified - внесены ли изменения в файл
//---------------------------------------------------------------------------
...

void __fastcall TScratchPad::FileSaveClick(TObject *Sender)
{
        //
        // Åñëè èìÿ ôàéëà óæå áûëî ââåäåíî, íåò íåîáõîäèìîñòè
        //  âûçûâàòü äèàëîã File Save. Äîñòàòî÷íî ñîõðàíèòü ôàéë
        //  ñ ïîìîùüþ SaveToFile()
        //
        if (SaveDialog->FileName != "") {
                Memo->Lines->SaveToFile(SaveDialog->FileName);
                //
                // Óñòàíîâêà Modified â false, ò.ê. ôàéë óæå ñîõðàí¸í
                //
                Memo->Modified = false;
                FileisSaved = true; // после сохранения файла отмечаем 
                                          //это в глобальной переменной
                StatusBar->Invalidate(); //принудительная перерисовка панели
                }
        //
        // Åñëè èìÿ ôàéëà íå áûëî óêàçàíî, âûïîëíåíèå SaveAs()
        //
        else FileSaveAsClick(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TScratchPad::FileSaveAsClick(TObject *Sender)
{
        //
        // Âûçîâ äèàëîãà File Save äëÿ ñîõðàíåíèÿ ôàéëà.
        //  Óñòàíîâêà Modified â false, ò.ê. ôàéë óæå ñîõðàí¸í
        //
        SaveDialog->Title = "Save As";
        if (SaveDialog->Execute()) {
                Memo->Lines->SaveToFile(SaveDialog->FileName);
                Memo->Modified = false;
                FileisSaved = true; // ïîñëå ñîõðàíåíèÿ ôàéëà îòìå÷àåì
                                    // ýòî â ãëîáàëüíîé ïåðåìåííîé
                StatusBar->Invalidate(); //ïðèíóäèòåëüíàÿ ïåðåðèñîâêà ïàíåëè
                }
}
//---------------------------------------------------------------------------

...

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

void __fastcall TScratchPad::StatusBarDrawPanel(TStatusBar *StatusBar,
      TStatusPanel *Panel, const TRect &Rect)
{
    //
    // Ñîçäàíèå ññûëêè íà õîëñò (Canvas) ñòðîêè ñîñòîÿíèÿ,
    //  ÷òîáû íå ââîäèòü ñëèøêîì ìíîãî òåêñòà
    //
    TCanvas& CanvasOnPanel = *StatusBar->Canvas;
    //
    // Ñîçäàíèåì âðåìåííîîãî îáúåêòà TRect. Ïàðàìåòð Rect ÿâëÿåòñÿ
    //  êîíñòàíòîé, ïîýòîìó ìû íå ìîæåò åãî èçìåíÿòü
    //
    TRect temp = Rect;

    //
    // Ïðîâåðêà: ÿâëÿåòñÿ ëè ïàíåëü ¹2 (1) òîé ïàíåëüþ, êîòîðóþ
    //  íóæíî íàðèñîâàòü. Åñëè äà, òî âûâîäèì çíà÷îê íà ïàíåëü
    //
    if (Panel->Index == 1) {
        //
        // Çàãðóçêà îäíîãî èç ñòàíäàðòíûõ çíà÷êîâ Windows.
        //  Çäåñü ïðîùå èñïîëüçîâàòü API, ÷åì VCL.
        //
        HICON iconM = LoadIconA(HInstance, "MODIFIED");
        HICON iconS = LoadIconA(HInstance, "SAVED");

        //ShowMessage("ïåðåðèñîâêà ïàíåëüêè =)");
        //
        // Âûâîä çíà÷êà è ñæàòèå åãî äî ðàçìåðà 15 õ 15 ïèêñåëîâ.
        //  Öåíòðèðîâêà çíà÷êà â ïàíåëè
        //
       /* CanvasOnPanel.Brush->Color = clBtnFace;
        CanvasOnPanel.Brush->Style = bsSolid;
        CanvasOnPanel.FillRect (Rect);*/
        if (FileisSaved)
            DrawIconEx(CanvasOnPanel.Handle,Rect.Left + 6, 3, iconS,
                15, 15, NULL, NULL, DI_NORMAL);
        else if (MemoModified) {
            //ShowMessage("À ìåìî-òî ðàáîòàåò!");
            DrawIconEx(CanvasOnPanel.Handle,Rect.Left + 6, 3, iconM,
                15, 15, NULL, NULL, DI_NORMAL);
            }

        }
}
//---------------------------------------------------------------------------
void __fastcall TScratchPad::MemoChange(TObject *Sender)
{
    MemoModified = Memo->Modified;
    FileisSaved = false;
    StatusBar->Invalidate();
}
//---------------------------------------------------------------------------
Короче, использовал функцию DrawIconEx(...) для непосредственно вывода значков на панели. Саму функции перерисовку панели я вызываю методом Invalidate() строки состояния. В StatusBarDrawPanel () я проверяю значения глобальных переменных и вывожу соответствующий значок, то есть если было изменение текста файла, то значок "M", а если файл был сохранён, то "S". Потом при изменении сохранённого файла снова выводится "M".
Lich87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсутствуют результаты фильтрации в строке состояния Excel. Hagen83 Microsoft Office Excel 2 22.04.2010 20:43
JavaScript.Бегущая строка в строке состояния Zempery JavaScript, Ajax 1 01.12.2009 19:15
Отображение StatusBar mutabor Компоненты Delphi 6 17.07.2007 18:06