Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > создание кнопки


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

       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, то при перерисовке рабочей области, остается часть от квадрата, имеющая другой цвет.И вместо того, что бы только рамка была черной, весь регион становится черным.
Что не так здесь, подскажите. 
Спасибо за помощь.

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

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

Автор: Mikron 5.10.2009, 22:20
GremlinProg, вот блин я тупанул, спасибо.
Я что хотел уточнить. Когда мы кнопке задаем стиль BS_OWNERDRAW, она отображается серой, а когда мы ставим регион окну, то часть  этой кнопки обрезается, и закрашивается цветом, который я выбрал, а другая часть, теперь уже не используемая, так и остается серой. А как это изменить?

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

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

Автор: Mikron 6.10.2009, 22:06
GremlinProg, спасибо.
Кнопка круглой формы получилась, но вот в чем дело
http://ipicture.ru/

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

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;    

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