Диалог с кнопкой owner draw
От: Valand  
Дата: 18.02.02 10:24
Оценка:
Здраствуйте !!!
1)Есть диалог на нём размещены tab control и две кнопки у кнопок стиль owner draw.
Хочу получить эффект подсветки кнопок т.е. если проводишь мышкой кнопка приподнимается.
В MSDN в структуре DRAWITEM есть флаг ODS_HOTLIGHT для windows 98(у меня Windows98)
но почему-то не работает,устанавливал #define _WIN32_WINNT 0x0500 в заголовочном файле,
бесполезно !!?
Решил пойти другим путём:
Нарисовал кнопки с помощью WM_DRAWITEM(DrawEdge,DrawState).
Сделал subclass кнопок получил ButtonProc,ответил на WM_MOUSEMOVE и WM_MOUSELEAVE.
Работает но реакция на нажатие кнопки из пять нажатий 4 ответных реакции кнопки
может дело в ButtonProc привожу код:

#define ODS_MOUSEMOVE WM_USER+100
#define ODS_MOUSEOUT WM_USER+101

LRESULT CALLBACK BtnProc(HWND hbtn,UINT msg,WPARAM wParam,LPARAM lParam)
{
DRAWITEMSTRUCT draw={0};
RECT rc={0};
HDC hdc=NULL;
TRACKMOUSEEVENT tme={0};

if(msg==WM_MOUSEMOVE && wParam==0)
{
hdc=GetDC(hbtn);
SelectObject(hdc,hfnt);
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = hbtn;
if(!TrackMouseEvent(&tme))
{
MessageBox(0,"TrackMouseEvent Failed","Error",MB_OK);
}
GetClientRect(hbtn,&rc);

draw.CtlType =ODT_BUTTON;

draw.CtlID =GetDlgCtrlID(hbtn);
draw.itemID =0;
draw.itemAction=ODA_SELECT;
draw.itemState=ODS_MOUSEMOVE;
draw.rcItem=rc;
draw.hDC =hdc;
draw.hwndItem =hbtn;
draw.itemData=0;
if(draw.CtlID==IDB_SAVE)
SendMessage(hinfo,WM_DRAWITEM,draw.CtlID,(LPARAM)(LPDRAWITEMSTRUCT)&draw);
else
SendMessage(hMain,WM_DRAWITEM,draw.CtlID,(LPARAM)(LPDRAWITEMSTRUCT)&draw);
ReleaseDC(hbtn,hdc);
}
if(msg==WM_MOUSELEAVE)
{
hdc=GetDC(hbtn);
SelectObject(hdc,hfnt);
GetClientRect(hbtn,&rc);
DPtoLP(hdc,(LPPOINT)&rc,4);
draw.CtlType =ODT_BUTTON;
draw.CtlID =GetDlgCtrlID(hbtn);
draw.itemID =0;
draw.itemAction=ODA_MOUSEOUT;
draw.itemState=ODS_MOUSEOUT;
draw.rcItem=rc;
draw.hDC =hdc;
draw.hwndItem =hbtn;
draw.itemData=0;
if(draw.CtlID==IDB_SAVE)
SendMessage(hinfo,WM_DRAWITEM,draw.CtlID,(LPARAM)(LPDRAWITEMSTRUCT)&draw);
else
SendMessage(hMain,WM_DRAWITEM,draw.CtlID,(LPARAM)(LPDRAWITEMSTRUCT)&draw);
ReleaseDC(hbtn,hdc);
}

return CallWindowProc(oldButProc,hbtn,msg,wParam,lParam);
}

2)Можно-ли использовать одну процедуру ButtonProc для всех кнопок включая
кнопки расположенные на другом диалоге?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.