Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смазанный текст в EditBox 
:(
    Опции темы
Alv
Дата 6.8.2006, 04:24 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Народ, подскажите как справится с проблемкой: в EditBox (стиль мультилайн - вкл.) текст при любой прокрутке смазывается (ну, строки как бы накладываются друг на друга), если выделить смазанный текст мышкой эффект смазывания пропадает - до следующего движения текста. Как избавится от этой нежелательной фичи?
PM MAIL   Вверх
586
Дата 6.8.2006, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Какой стиль EditBox'a?
Как обрабатываешь сообщения окна?
PM   Вверх
Alv
Дата 6.8.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Стили мультилайн и wantreturn. Сообщения не обрабатываются, поскольку все три EditBox'а нужны только для вывода информации из программы для пользователя (часть из файла, часть - в результате работы программы). Да! У двоих из трех EditBox'ов еще стиль readonly.
PM MAIL   Вверх
586
Дата 6.8.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alv @  6.8.2006,  16:10 Найти цитируемый пост)
Сообщения не обрабатываются, поскольку все три EditBox'а нужны только для вывода информации из программы для пользователя (часть из файла, часть - в результате работы программы). 

Сообщения диалога (или главного окна). Какие сообщения перехватываешь, что возвращаешь.

Цитата(Alv @  6.8.2006,  16:10 Найти цитируемый пост)
Стили мультилайн и wantreturn

Это не всё. Есть ещё стили. Например WS_VISIBLE. Также укажи Ex-стиль.
PM   Вверх
GremlinProg
Дата 6.8.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



только под XP: к расширенным стилям класса главного окна, на котором лежат эдиты, добавь флаг WS_EX_COMPOSITED. Он обеспечит системный двойной буфер, смазываться ни чего не будет.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alv
Дата 8.8.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Цитата(586)
Это не всё. Есть ещё стили. Например WS_VISIBLE. Также укажи Ex-стиль.


Ex-стиль: WS_EX_CLIENTEDGE
Остальные: WS_CHILD,WS_VISIBLE,ES_LEFT,ES_AUTOVSCROLL,ES_MULTILINE,ES_WANTRETURN,ES_READONLY

Цитата(586)
Сообщения диалога (или главного окна). Какие сообщения перехватываешь, что возвращаешь.


WM_CTLCOLORSTATIC - фон
WM_NOTIFY - табконтрол и тултипсы обрабатываются
WM_PAINT
WM_COMMAND

Цитата(586)
только под XP: к расширенным стилям класса главного окна, на котором лежат эдиты, добавь флаг WS_EX_COMPOSITED. Он обеспечит системный двойной буфер, смазываться ни чего не будет.


под XP еще не пробовал, но в Win98 и Win2k получается забавный эффект в некоторых местах - прозрачность  smile да и решить бы для всех ОС хотелось бы... хотя спасибо за совет!
PM MAIL   Вверх
586
Дата 8.8.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alv @  8.8.2006,  18:27 Найти цитируемый пост)
WM_PAINT

Попробуй отказаться от обработки этого сообщения. Если проблема исчезнет, значит ты неправильно обрабатываешь это сообщение. Если проблема осталась, откажись от другого сообщения. В итоге ты найдешь ошибку.
Покажи код.
PM   Вверх
Alv
Дата 8.8.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Цитата(586)
WM_PAINT
Попробуй отказаться от обработки этого сообщения. Если проблема исчезнет, значит ты неправильно обрабатываешь это сообщение. Если проблема осталась, откажись от другого сообщения. В итоге ты найдешь ошибку.
Покажи код.


Угумс, виновато оказалось WM_CTLCOLORSTATIC, но там всего три строчки и без них у каждого контрола левый фон получается  smile 

Код

dc = (HDC) wParam;
SetBkMode( dc, TRANSPARENT );
return (BOOL) GetStockObject( TRANSPARENT );

PM MAIL   Вверх
586
Дата 8.8.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alv @  8.8.2006,  19:18 Найти цитируемый пост)
Угумс, виновато оказалось WM_CTLCOLORSTATIC, но там всего три строчки и без них у каждого контрола левый фон получается smile

Код
dc = (HDC) wParam;
SetBkMode( dc, TRANSPARENT );
return (BOOL) GetStockObject( TRANSPARENT );

Для какой цели этот код?
PM   Вверх
Alv
Дата 8.8.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Принудительно делаю фон контролов прозрачным. Без него под каждым контролом в системах, старше Win98 (под ней пишется) фон серый, хотя все окна создаются по умолчанию, цвет в этой задаче мне не нужен. Ну вот решив одну проблему, нашел другую smile 
PM MAIL   Вверх
Fixin
Дата 8.8.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Цитата(Alv @  8.8.2006,  19:08 Найти цитируемый пост)
под каждым контролом
Цитата(Alv @  8.8.2006,  18:18 Найти цитируемый пост)
 WM_CTLCOLORSTATIC
нуу, под каждым ли?
Цитата(Alv @  8.8.2006,  19:08 Найти цитируемый пост)
Принудительно делаю фон контролов прозрачным.
Что ты имеешь ввиду?

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



TRANSPARENT - это параметр не для GetStockObject.
В твоем случае этот код преобразится как GetStockObject(LTGRAY_BRUSH), т.е. вернет кисть светло-серого цвета. Есть на это другой сток: NULL_BRUSH. Вот с ней и получится, то, что задний фон не будет закрашен кистью.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Alv
Дата 9.8.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Все равно эффект смазывания не проходит  smile 
PM MAIL   Вверх
586
Дата 9.8.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alv, а у тебя Edit и Static не на одной области находятся? Для чего тебе прозрачный Static?
PM   Вверх
Fixin
Дата 9.8.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



создай отдельный проект с окном и едитом на нем, добавь тескст, прокрути и посмотри, есть ли это смазывание. если есть, выкладываешь этот временный проект на форуме и мы (или я) находим тебе все проблемы.
PM MAIL ICQ   Вверх
Alv
Дата 9.8.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Если не обрабатывать сообщение WM_CTLCOLORSTATIC, то на всех контролах (даже на EditBox'ах) фон, т.е. например описание radiobox'а, checkbox'а и даже цвет обычных кнопок, а также поля editbox'а заполняются левым цветом. Этот эффект не виден на том ПК, на котором составляется прога (Win'98), но на других ПК с Win2K и WinXP этот эффект проявляется.
PM MAIL   Вверх
Alv
Дата 9.8.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Убрал все лишнее, оставил только сцену. Pr.exe - с эффектом смазывания, Pr1.exe - без него (без обработки WM_CTLCOLORSTATIC), но с левым фоном.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Pr.zip 72,45 Kb
PM MAIL   Вверх
Fixin
Дата 9.8.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



1) извини, конечно, но такое ощущение, что циклами и массивами ты пользоваться не научился, не обижайся.
2) программеры из майкрософта всегда заботились о быстроте работы приложений и вводили множество оптимизаций. с одной из них ты столкнулся. для ускорения перемещения текста в мультистроковых редактируемых полях используется перемещение канвы контекста устройства элемента управления, а т.к. стоит режим прозрачности, то с канвы копируется пустое место и это дело всё глючит.

Это предпосылки. сейчас попробую решить эту проблему.
PM MAIL ICQ   Вверх
Alv
Дата 9.8.2006, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.7.2006
Где: Москва

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



Цитата(Fixin @  9.8.2006,  22:32 Найти цитируемый пост)
1) извини, конечно, но такое ощущение, что циклами и массивами ты пользоваться не научился, не обижайся.


На дельные замечания обижаться глупо. Не буду оправдываться - что есть, то есть. Но вот совета, если на него будет время, попрошу. Особенно интересует совет по оптимизации создания и управления различными контролами. Можно ПМом, конечно, опять-таки, если нетрудно.

Цитата(Fixin @  9.8.2006,  22:32 Найти цитируемый пост)
2) программеры из майкрософта всегда заботились о быстроте работы приложений и вводили множество оптимизаций. с одной из них ты столкнулся. для ускорения перемещения текста в мультистроковых редактируемых полях используется перемещение канвы контекста устройства элемента управления, а т.к. стоит режим прозрачности, то с канвы копируется пустое место и это дело всё глючит.

Это предпосылки. сейчас попробую решить эту проблему. 


Ух, куда меня понесло - наперекор майкрософтовским программерам  smile 
Буду благодарен за помощь, но вот проголосовать, увы, не могу
PM MAIL   Вверх
Fixin
Дата 10.8.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Цитата(Alv @  9.8.2006,  23:46 Найти цитируемый пост)
вот совета, если на него будет время, попрошу
Ну да, это я всю прогу просмотрю и сделаю что смогу, самому интересно.

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


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Сделано халтурно, сам видишь, но лучшего спсоба не нашел, да и не искал особо, времени не хватает
Код
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.hbrBackground    =    (HBRUSH)GetStockObject (LTGRAY_BRUSH);
    wc.hCursor            =    LoadCursor(NULL, IDC_ARROW);
    wc.hIcon            =    LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance        =    hInstance;
    wc.lpfnWndProc        =    WndProc;
    wc.lpszClassName    =    "TryWnd";
    
    if (!RegisterClass(&wc))
        return -1;
    
    CreateWindow("TryWnd", "MainWindow", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL,
        NULL, hInstance, NULL);
    
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HFONT hFont = CreateFont (-11,7,0,0,FW_LIGHT, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
                            CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "MS Sans Serif");
    switch (msg)
    {
        case WM_CREATE:
            {
                
                HWND hEdit6=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",
                    "текст: апвап вап вапва вап вап вап вап вапвап вап ап авп вап ап авп вап вап вап вап авп вап авп апваппавапвапт ап вап вапт ваптватп автаптвадтлп ваптвапваптаатпат ап тваптавтапттат аатвт валтп тавт таплдватп лватп",
                    WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_LEFT|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|ES_READONLY,
                    10,10,296,40,hwnd,(HMENU)NULL,NULL,NULL);
                SendMessage(hEdit6, WM_SETFONT, (WPARAM)hFont,(LPARAM) MAKELONG((WORD) TRUE, 0));
            }
            break;
        case WM_CTLCOLOREDIT:
        case WM_CTLCOLORSTATIC:
            {
                SetBkColor((HDC) wParam, RGB(192,192,192));
                return (LRESULT)GetStockObject(LTGRAY_BRUSH);
            }
            break;
        case WM_DESTROY:
            DeleteObject(hFont);
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
Но я еще хочу сделать элемент управления с кнопками, так что будет продолжение.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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