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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Edit Control цвет рамки 
:(
    Опции темы
ZC1989
Дата 30.4.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



поискал по форуму и интернету но не нашёл нигде упоминания о том как можно поменять цвет рамки этого контрола со стилями Static Edge = true и Border = false

да вообще нигде не нашёл про то как менять цвет рамок, только текста и фона...

это вообще возможно? по мсдн лажу но ничего найти не могу...может не так ищу...


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ИванМ
Дата 1.5.2010, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ZC1989, вроде нельзя. Если только свой контрол писать.
PM MAIL   Вверх
Emura
Дата 1.5.2010, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Static Edge = true и Border = false

это визуал студия?
рамку вроде как рисует тема. 
можно например рисовать свою поверх, просабклассив эдит.


а можно реализовать эдит самостоятельно. 
но эта задача не на один день и даже не на одну неделю, тем более если эдит мультилайн. 
к тому же надо знать винапи на зубок. сложно для новичка.



Это сообщение отредактировал(а) Emura - 1.5.2010, 00:30
PM   Вверх
ZC1989
Дата 1.5.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



Emura, у меня были мысли переписать контрол,я так и понял что пока не асилю.
а можно же убрать тогда в студии у этого контрола рамку вовсе,а как тогда нарисовать на нём её? сразу после отрисовки его же?
и ещё,пробовал отлавливать сообщения для перерисовки, WM_COLOREDIT,в нём менял цвет текста SetTextColor, SetBkColor. и почему то фон менялся не под всем контролом, а только под набранным текстом 0.о

п.с.: с кодом попробовать сейчас никак,с телефона сижу


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Emura
Дата 1.5.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возможно есть какое-нибудь сообщение отвечающее за отрисовку рамки, но не припомню. если самому рисовать, то можно попробовать такой вариант.

сабклассим контрол  
отлавливаем WM_PAINT, в нем передаем WM_PAINT в процедуру по умолчанию и после что-то вроде:
Код

GetDC()
Rect()
ReleaseDC()

возвращаем из процедуры 0


Код

case WM_PAINT:
{
истинная процедура(WM_PAINT, ...);
GetDC(...);
Rect(...);
ReleaseDC(...);
return 0;
}



ИМХО 
не стоит заморачиваться с нестандартными контролами, окнами. 
99% пользователей не оценит того огромного времени, которое потратиться на все эти дела!
а если делать, то делать свои контролы полностью, и нужны будут обертки для всех стандартых операций, во внешнем виде которых не будет и намека на винапи. это сильно упростит разработку! ООП - обязательно



Это сообщение отредактировал(а) Emura - 1.5.2010, 13:20
PM   Вверх
ZC1989
Дата 1.5.2010, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



Emura, вот я сейчас попробовал сделать такую штуку, но не сабклассил едит


вот эта функция у меня напрямую вызывается в функции окна
Код

case WM_CTLCOLOREDIT:
    return draw_edits(hwnd, Global_hInst, (HWND)lParam, (HDC)wParam);
    break;
...
...
...
LRESULT draw_edits(HWND hwnd, HINSTANCE hInst, HWND hwndForm, HDC hDC){
        bool Ret = false;
        if(hwndForm == edit_Login.hwnd){
            StaticHDC = hDC;
            MemoryHDC = CreateCompatibleDC(StaticHDC);

            HPEN hPen;
            HGDIOBJ hPenOld;
            LOGBRUSH lb;
            lb.lbStyle = BS_SOLID;
            lb.lbColor = RGB(255,0,0);
            lb.lbHatch = 0;

            hPen = ExtCreatePen(PS_COSMETIC | PS_SOLID, 1, &lb, 0, NULL); 
            hPenOld = SelectObject(StaticHDC, hPen);


// рисую 4 линии рамки
            MoveToEx(StaticHDC, 0, 0, NULL);
            LineTo(StaticHDC, edit_Login.width, 0); 

            MoveToEx(StaticHDC, edit_Login.width, 0, NULL);
            LineTo(StaticHDC, edit_Login.width, edit_Login.height);

            MoveToEx(StaticHDC, 0, 0, NULL);
            LineTo(StaticHDC, 0, edit_Login.height);

            MoveToEx(StaticHDC, 0, edit_Login.height, NULL);
            LineTo(StaticHDC, edit_Login.width, edit_Login.height);

            SelectObject(StaticHDC, hPenOld); 
            DeleteObject(hPen); 

            DeleteDC(MemoryHDC);
            

            //SetTextColor(hDC, edit_Login.color_text);
            //SetBkColor(hDC, edit_Login.color_bg);
            SetBkMode(hDC, TRANSPARENT);


// так как фон прозрачный, я делаю перерисовку фона под едитом
            RECT rect_hwnd;

            rect_hwnd.left = edit_Login.pos_x;
            rect_hwnd.right = edit_Login.pos_x + edit_Login.width;
            rect_hwnd.top = edit_Login.pos_y;
            rect_hwnd.bottom = edit_Login.pos_y + edit_Login.height;
            InvalidateRect(hwnd, &rect_hwnd, FALSE);



            Ret = true;
        }

        if(Ret) return (LRESULT)GetStockObject(NULL_BRUSH);
        return NULL; 
    }


и получает касяк, изза перерисовки фона мерцает слишком сильно весь контрол... а без перерисовки не получается очищать фон...в чём ошибка???

Добавлено через 1 минуту и 21 секунду
на счёт того что бы сабклассить, я это не делал никогда...смутно понимаю что к чему...есть вариант без эксперементов сейчас сделать мне?

Добавлено через 4 минуты и 21 секунду
Цитата

не стоит заморачиваться с нестандартными контролами, окнами. 


я тут стремлюсь больше не для масс, программа узко специализирована...(для управления движком для сайта) поэтому видеть её будут люди связанные с этим...а они оценят я думаю)


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Emura
Дата 1.5.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ZC1989,
WM_CTLCOLOREDIT - никогда не использовал подобных сообщений, поэтому не могу сказать что к чему.  
если мне нужен какой-то контрол, то он делается "с чистого листа".


Цитата

на счёт того что бы сабклассить, я это не делал никогда...смутно понимаю что к чему...есть вариант без эксперементов сейчас сделать мне?

это эксперимент не сложный. наверное знаешь что любое окно использует свою оконную процедуру. сабклассинг ни что иное как замена этой процедуры на другую.

Код

// назначаем свою процедуру, 
// фун-ция возвращает текущую процедуру
WNDPROC oldWinProc =(WNDPROC)::SetWindowLongPtrW( hWndEdit, GWL_WNDPROC, (long)newWindowProcedure );



Цитата

я тут стремлюсь больше не для масс, программа узко специализирована...(для управления движком для сайта) поэтому видеть её будут люди связанные с этим...а они оценят я думаю)

ок, хозяин-барин

Это сообщение отредактировал(а) Emura - 1.5.2010, 14:57
PM   Вверх
ZC1989
Дата 1.5.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



Emura, WM_CTLCOLOREDIT посылается когда оконная процедура перерисовывает один из edit text, я из под такого сообщения для Static (WM_CTLCOLORSTATIC) меняю цвет и прозрачность фона, с ним приходят HWND и HDC контрола который нужно отрисовать, посути. этот же WM_PAINT как был бы если бы я сделал сабклассинг, насколько я понимаю...  smile 

я точно так же из него же сделал отрисовку рамок...

хатя может серьёзно есть большая разница..

вопрос ещё такой (чтоб уж не перерывать щас кучу мануалок) если я сделаю для контрола свою оконную процедуру, то мне полностью придётся обрабатывать всё да? тоесть от цвета вывода до самого написания текста на экране?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Earnest
Дата 4.5.2010, 07:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



ZC1989, рамка рисуется на WM_NCPAINT - если рамка в принципе есть. Достаточно перехватить это сообщение.
Но есть некоторая опасность, что в некоторых ситуациях будет проскакивать стандартная рамка (старые контролы Виндоус не всегда соблюдают собственные соглашения). Насчет эдита не знаю, нужно проверять.
Еще вариант - сдалать контрол без рамки (без стилей WS_BORDER и прочая), но обработать WM_NCCALSIZE, чтобы таки сдвинуть клиентскую область вглубь контрола (на 1-2 пиксела, чтобы было где рамку рисовать). Рисовать, опять же, на WM_NCPAINT.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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