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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание кнопки 
V
    Опции темы
Mikron
Дата 5.10.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте, были уже на форуме похожие темы, но все равно остался вопрос.
Код

       case WM_CREATE:
            hButton = CreateWindow("button","",    
                WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,
                0,0,100,100,
                hwnd, (HMENU) IDC_BUTTON, hInstance,NULL);        
            return 0;
        case WM_DRAWITEM:
            hRgn = CreateEllipticRgn(0,0,100,100);
            hdc = GetDC(hwnd);
            FillRgn(hdc,hRgn, (HBRUSH)GetStockObject(WHITE_BRUSH));
                FrameRgn(hdc,hRgn,(HBRUSH)GetStockObject(BLACK_BRUSH),100,100);
            SetWindowRgn(hButton,hRgn,TRUE);
            ReleaseDC(hwnd, hdc);
            return 0;


Правильно здесь у меня создается кнопка? Скорее всего ведь нет, потому что когда указываю в hButton = CreateWindow...
размер кнопки, и потом тот же размер в FrameRgn, то при перерисовке рабочей области, остается часть от квадрата, имеющая другой цвет.И вместо того, что бы только рамка была черной, весь регион становится черным.
Что не так здесь, подскажите. 
Спасибо за помощь.


Это сообщение отредактировал(а) Mikron - 5.10.2009, 17:32
PM MAIL   Вверх
GremlinProg
Дата 5.10.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. у FrameRgn последние 2 параметра задают толщину штриха границы, по горизонтали и вертикали, а не размеры
при толщине в 100 пикс. не удивительно, что все черное

2. чтобы поставить регион окну, достаточно всего лишь одного вызова SetWindowRgn,
не нужно это делать всякий раз при перерисовке


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


Шустрый
*


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

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



GremlinProg, вот блин я тупанул, спасибо.
Я что хотел уточнить. Когда мы кнопке задаем стиль BS_OWNERDRAW, она отображается серой, а когда мы ставим регион окну, то часть  этой кнопки обрезается, и закрашивается цветом, который я выбрал, а другая часть, теперь уже не используемая, так и остается серой. А как это изменить?
PM MAIL   Вверх
GremlinProg
Дата 6.10.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

если остается, убери у родителя стиль WS_CLIPCHILDREN (если он стоит),
если проблема останется, показывай скриншоты и код создания родительского окна,
будем дальше думать


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


Шустрый
*


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

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



GremlinProg, спасибо.
Кнопка круглой формы получилась, но вот в чем дело
user posted image

остается часть серого цвета, к кнопки не относящаяся
Код

hwnd = CreateWindow(szMainClass,szTitle,
     WS_VISIBLE|WS_SYSMENU,
    CW_USEDEFAULT,CW_USEDEFAULT,
                650,460,
                 NULL, NULL,
                 hInstance, NULL);

Код

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style = 0;
    wc.lpfnWndProc = Proc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = (LPCTSTR)NULL;
    wc.lpszClassName = szName;
    return (RegisterClass(&wc) !=0);
}

Код

        case WM_CREATE:
            nach_pozition=rect.right/2-10;
            for(i=0; i<4; i++)
            hButton[i] = CreateWindow("button","", WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,
                    nach_position=nach_position+step,70,40,40,
                    hwnd, (HMENU)i, hInstance,NULL);
            return 0;    
        case WM_DRAWITEM:
            pdis = (LPDRAWITEMSTRUCT) lParam;
            for(i=0; i<4; i++)
            {
                hRgn[i] = CreateEllipticRgn(0,0,40,40);
                FillRgn(pdis->hDC,hRgn[i], (HBRUSH)GetStockObject(WHITE_BRUSH));
                FrameRgn(pdis->hDC,hRgn[i],(HBRUSH)GetStockObject(BLACK_BRUSH),1,1);
                SetWindowRgn(hButton[i],hRgn[i],TRUE);
            }
            return 0;    

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


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

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