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;
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 -там я не пойму в чем ошибка!!!
Код:
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.
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.
Я знаю для чего нужен этот флаг но он проблему не решает! Просто в идеале регион надо применять до рисования элемента поэтому можно оставить и 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;
...
{
...
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;
...
2.Почему не тот элемент? а lpdis->CtlID==BUTTON_SHUTDOWN зачем?
у меня больше нет контролов с такими именами!
3. Ура оказалось проблема в том что при создании кнопки я не применял флаг WS_CLIPSIBLINGS (шайтан-> нет страницы у меня в SDK с этими флагами)! Так что проблема Решена!
Спасибо!:)
Цитата:
2.Почему не тот элемент? а lpdis->CtlID==BUTTON_SHUTDOWN зачем?
у меня больше нет контролов с такими именами!
у меня больше нет контролов с такими именами!
Смотри внимательно на свой код:
Цитата:
Код:
if ( lpdis->CtlID == BUTTON_SHUTDOWN )
{
...
}
RegionM(lpdis->hwndItem);
{
...
}
RegionM(lpdis->hwndItem);