Плоские штуковины.
Вот уже вторую неделю пытаюсь найти какие-либо доки/примеры по созданию плоских контролов посредством API (Скроллбары, окна и т.д.) - безрезультатно.
Научился только кнопки плоские ваять - это не сложно совсем. о_О
Прошу ответить на мои незамысловатые вопросы - каким образом можно создать плоское окошко а ля "дочернее WinSight'овское"?
И еще меня интересует создание плоского скроллбара.
Буду оч. рад даже самым скудным кусочкам кода. Желателен синтаксис MSVCPP (не MFC!).
Благодарю.
без Parent, или controls (и какие controls).
По поводу Flat Scroll Bars, есть такой готовый
control (так и называется), живет в comctl32.dll, в SDK подробно описан.
Вообще, в зависимости от конкретных целей, можно использовать разные способы.
Можно собственно WS_CHILD и использовать:
Код:
CreateWindowEx(WS_EX_TOPMOST,"MyWndClass","MyWndName,WS_CHILD|WS_BORDER,x,y,w,h,GetDesktopWindow(),...
Далее SetWindowPos и т.п.
Можно так же создать это окно "ребенком" какого-нить другого, потом SetParent(myHwnd,0).
Иногда, наверное, можно использовать regions
(SetWindowRgn), обрубая ненужные украшения.
Так же, можно обрабатывать WM_NCxxx сообщения (WM_NCPAINT,WM_NCACTIVATE,WM_NCCALCSIZE,WM_NCHITTEST и т.д., все или некоторые), обрабатывать их, правда весьма неудобно.
В этих статьях, хотя речь идет о другом
(рисование caption в MFC и задание размеров клиентской области) эти функции обсуждаются
http://www.microsoft.com/msj/0197/c/c0197.aspx
http://www.microsoft.com/msj/0697/c0697.aspx
http://msdn.microsoft.com/msdnmag/issues/04/10/cqa/default.aspx
Примерчик "плоского" окна с WS_OVERLAPPEDWINDOW
(правда, практически не тестировал):
Код:
int OnNcCalcSize(WPARAM wparam,LPARAM lparam)
{
NCCALCSIZE_PARAMS* par=(NCCALCSIZE_PARAMS*)lparam;
if(!par->lppos)
return DefWindowProc(m_hWnd,WM_NCCALCSIZE,wparam,lparam);
int cxfr=GetSystemMetrics(SM_CXSIZEFRAME);
int cyfr=GetSystemMetrics(SM_CYSIZEFRAME);
InflateRect(par->rgrc,cxfr-1,cyfr-1);
return DefWindowProc(m_hWnd,WM_NCCALCSIZE,wparam,lparam);
}
int OnNcPaint(WPARAM wparam,LPARAM lparam)
{
int cxFr=GetSystemMetrics(SM_CXSIZEFRAME);
int cyFr=GetSystemMetrics(SM_CYSIZEFRAME);
int cyCap=GetSystemMetrics(SM_CYCAPTION);
RECT rct,rct1;
GetWindowRect(m_hWnd,&rct);
CopyRect(&rct1,&rct);
rct.left+=cxFr;
rct.right-=cxFr;
rct.top+=cyFr;
rct.bottom=rct.top+cyCap;
HRGN hRgnCaption = CreateRectRgnIndirect(&rct);
OffsetRect(&rct1,-rct1.left,-rct1.top);
HDC hdc=GetWindowDC(m_hWnd);
Rectangle(hdc,rct1.left,rct1.top,rct1.right,rct1.bottom);
ReleaseDC(m_hWnd, hdc);
HRGN oldRgn=(HRGN)wparam;
DefWindowProc(m_hWnd,WM_NCPAINT,(WPARAM)hRgnCaption,lparam);
if((WORD)oldRgn>1)
DeleteObject(oldRgn);
return 0;
}
{
NCCALCSIZE_PARAMS* par=(NCCALCSIZE_PARAMS*)lparam;
if(!par->lppos)
return DefWindowProc(m_hWnd,WM_NCCALCSIZE,wparam,lparam);
int cxfr=GetSystemMetrics(SM_CXSIZEFRAME);
int cyfr=GetSystemMetrics(SM_CYSIZEFRAME);
InflateRect(par->rgrc,cxfr-1,cyfr-1);
return DefWindowProc(m_hWnd,WM_NCCALCSIZE,wparam,lparam);
}
int OnNcPaint(WPARAM wparam,LPARAM lparam)
{
int cxFr=GetSystemMetrics(SM_CXSIZEFRAME);
int cyFr=GetSystemMetrics(SM_CYSIZEFRAME);
int cyCap=GetSystemMetrics(SM_CYCAPTION);
RECT rct,rct1;
GetWindowRect(m_hWnd,&rct);
CopyRect(&rct1,&rct);
rct.left+=cxFr;
rct.right-=cxFr;
rct.top+=cyFr;
rct.bottom=rct.top+cyCap;
HRGN hRgnCaption = CreateRectRgnIndirect(&rct);
OffsetRect(&rct1,-rct1.left,-rct1.top);
HDC hdc=GetWindowDC(m_hWnd);
Rectangle(hdc,rct1.left,rct1.top,rct1.right,rct1.bottom);
ReleaseDC(m_hWnd, hdc);
HRGN oldRgn=(HRGN)wparam;
DefWindowProc(m_hWnd,WM_NCPAINT,(WPARAM)hRgnCaption,lparam);
if((WORD)oldRgn>1)
DeleteObject(oldRgn);
return 0;
}
ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES| LVS_EX_FLATSB);
InitializeFlatSB(hList);
FlatSB_EnableScrollBar(hList, SB_BOTH, ESB_ENABLE_BOTH);
И получаеться красивенький плоский скроллбар