Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не получается сделать (например)круглую кнопку

9.7K
04 февраля 2008 года
SpeedShifter
67 / / 07.10.2007
Кнопку рисую как OWNERDRAW, с помощью .bmp. Круглой делаю с помощью вот такой ф-ции:
 
Код:
void RegionM(HWND hwnd)
{
    RECT rct;
    GetClientRect(hwnd, &rct);
    HRGN hRgn=CreateEllipticRgn(rct.left, rct.top, rct.right, rct.bottom);
    SetWindowRgn(hwnd, hRgn, false);
    DeleteObject(hRgn);
}

Ф-ция работает - на любом элементе HWND, и на кнопке тоже, т.е ее можно нажать именно в этой окружности. НО вот запара : рисуется кнопка как квадратная, не обрезая лишние углы.

П.С. :confused: интересно что если ф-цию применить в одработке WM_DRAWITEM :
Код:
lpdis = (LPDRAWITEMSTRUCT) lParam;
            hdcMem = CreateCompatibleDC(lpdis->hDC);
    if (lpdis->CtlID==BUTTON_SHUTDOWN)
           {
             if (lpdis->itemState & ODS_SELECTED)  // if selected
                SelectObject(hdcMem, scin_stop1);
             else
                SelectObject(hdcMem, scin_stop);
             StretchBlt( ....SRCCOPY);
     }
        RegionM(lpdis->hwndItem);
        DeleteDC(hdcMem);
        return TRUE;

то кнопка рисуется вначале круглой, но при любой дальнейшей перерисовке окна (сворачивается основное окно) все возвращается и кнопка - не круглая.
Помогите, дайте хоть пример , но только не в MFC -там я не пойму в чем ошибка!!!
535
05 февраля 2008 года
Нездешний
537 / / 17.01.2008
 
Код:
SetWindowRgn(hwnd, hRgn, true);


Цитата:
int SetWindowRgn(

HWND hWnd, // handle to window whose window region is to be set
HRGN hRgn, // handle to region
BOOL bRedraw // window redraw flag
);


Parameters
...
bRedraw

Boolean value that specifies whether the operating system redraws the window after setting the window region. If bRedraw is TRUE, the operating system does so; otherwise, it does not.
Typically, you set bRedraw to TRUE if the window is visible.

9.7K
05 февраля 2008 года
SpeedShifter
67 / / 07.10.2007
Я знаю для чего нужен этот флаг но он проблему не решает! Просто в идеале регион надо применять до рисования элемента поэтому можно оставить и false! Я пробовал и так ,и так!
535
06 февраля 2008 года
Нездешний
537 / / 17.01.2008
1. Так и примени регион до рисования элемента, тогда действительно нет разницы. А так -- применяешь регион после, и перерисовки не происходит, когда флаг false
2. У тебя регион применяется, даже если это не тот элемент

Код:
WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
      ...
      hWndButton = CreateWindow ("button", "But",
               WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | BS_OWNERDRAW,
      10, 35, 100, 50,
      hWndMain, (HMENU) ID_BUTTON, hInstance, NULL);
     ...
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    ...
    case WM_DRAWITEM:
    {
         LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
         
         if (lpdis->CtlID == ID_BUTTON)
         {
               RegionM(lpdis->hwndItem);              
               
               HDC hdcMem = CreateCompatibleDC(lpdis->hDC);
               HBITMAP scin_stop = CreateCompatibleBitmap( hdcMem, 100, 50 );
               HBITMAP scin_stop1 = CreateCompatibleBitmap( hdcMem, 100, 50 );

               if (lpdis->itemState & ODS_SELECTED)    SelectObject(hdcMem, scin_stop1);
               else                     SelectObject(hdcMem, scin_stop);

               StretchBlt( lpdis->hDC, 0, 0, 100, 50, hdcMem, 0, 0, 100, 50, SRCCOPY);

               DeleteDC(hdcMem);
       
         }
    }
    break;
...
9.7K
06 февраля 2008 года
SpeedShifter
67 / / 07.10.2007
1.Вариации на эту тему ни к чему не приводили!
2.Почему не тот элемент? а lpdis->CtlID==BUTTON_SHUTDOWN зачем?
у меня больше нет контролов с такими именами!

3. Ура оказалось проблема в том что при создании кнопки я не применял флаг WS_CLIPSIBLINGS (шайтан-> нет страницы у меня в SDK с этими флагами)! Так что проблема Решена!
Спасибо!:)
535
07 февраля 2008 года
Нездешний
537 / / 17.01.2008
Цитата:
2.Почему не тот элемент? а lpdis->CtlID==BUTTON_SHUTDOWN зачем?
у меня больше нет контролов с такими именами!



Смотри внимательно на свой код:

Цитата:
 
Код:
if ( lpdis->CtlID == BUTTON_SHUTDOWN )
{
      ...
}

RegionM(lpdis->hwndItem);

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог