crashtuak
14-02-2010, 10:03
Как правильно "запихнуть" оконную процедуру в самодельный класс, и как потом правильно прикрутить ту процедуру к нужному окну(в данном случае-к кнопке)? Вот собственно код класса, прошу строго не судить, мой первый класс в жизни:)(который без оконной процедуры работает нормально):
class PNG_Button
{
public:
HWND bt_hwnd;
HWND bt_parent_hwnd;
int x_position;
int y_position;
int x_size;
int y_size;
LPCSTR normal_image;
LPCSTR focused_image;
LPCSTR pushed_image;
LPCSTR draw_image;
BOOL g_bMouseTrack;
WNDPROC btnOld;
//вот она-процедура
LRESULT CALLBACK ButtonSubclassProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch ( msg )
{
case WM_MOUSELEAVE:
{
g_bMouseTrack = FALSE;
draw_image=normal_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_MOUSEHOVER:
{
draw_image=focused_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_LBUTTONDOWN:
{
draw_image=pushed_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_LBUTTONUP:
{
draw_image=focused_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_MOUSEMOVE:
if(g_bMouseTrack==FALSE)
{
TrackMouse(bt_hwnd);
g_bMouseTrack = TRUE;
}
return 0;
}
return CallWindowProc(btnOld, hwnd, msg, wParam, lParam);
}
//конец оконной процедуры
//конструктор
PNG_Button(LPCSTR bt_text,int x_pos,int y_pos,int x_sz,int y_sz,
HWND bt_parent,
LPCSTR n_image,
LPCSTR f_image,
LPCSTR p_image)
{
x_position=x_pos, y_position=y_pos, x_size=x_sz ,y_size=y_sz;
draw_image=n_image, normal_image=n_image, focused_image=f_image, pushed_image=p_image;
bt_parent_hwnd=bt_parent;
g_bMouseTrack = FALSE;
bt_hwnd=CreateWindowEx(NULL,"Button",bt_text,WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, x_pos, y_pos, x_sz, y_sz,bt_parent, NULL,NULL,NULL);
//на слудующую строчку очень сильно ругается компилятор
btnOld = (WNDPROC)SetWindowLong(bt_hwnd, GWL_WNDPROC, (LONG)ButtonSubclassProc);
TrackMouse(bt_hwnd);
return 1;
}
//конец конструктора
HWND Get_BT_HWND()
{
return bt_hwnd;
}
int DrawBTN()
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(bt_hwnd, &ps);
CxImage image;
image.Load(draw_image,CXIMAGE_FORMAT_PNG);
image.Draw(hdc,0,0,-1,-1,0,true);
EndPaint(bt_hwnd, &ps);
return 1;
}
};
class PNG_Button
{
public:
HWND bt_hwnd;
HWND bt_parent_hwnd;
int x_position;
int y_position;
int x_size;
int y_size;
LPCSTR normal_image;
LPCSTR focused_image;
LPCSTR pushed_image;
LPCSTR draw_image;
BOOL g_bMouseTrack;
WNDPROC btnOld;
//вот она-процедура
LRESULT CALLBACK ButtonSubclassProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch ( msg )
{
case WM_MOUSELEAVE:
{
g_bMouseTrack = FALSE;
draw_image=normal_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_MOUSEHOVER:
{
draw_image=focused_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_LBUTTONDOWN:
{
draw_image=pushed_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_LBUTTONUP:
{
draw_image=focused_image;
InvalidateRect(bt_parent_hwnd,0,true);
}
return 0;
case WM_MOUSEMOVE:
if(g_bMouseTrack==FALSE)
{
TrackMouse(bt_hwnd);
g_bMouseTrack = TRUE;
}
return 0;
}
return CallWindowProc(btnOld, hwnd, msg, wParam, lParam);
}
//конец оконной процедуры
//конструктор
PNG_Button(LPCSTR bt_text,int x_pos,int y_pos,int x_sz,int y_sz,
HWND bt_parent,
LPCSTR n_image,
LPCSTR f_image,
LPCSTR p_image)
{
x_position=x_pos, y_position=y_pos, x_size=x_sz ,y_size=y_sz;
draw_image=n_image, normal_image=n_image, focused_image=f_image, pushed_image=p_image;
bt_parent_hwnd=bt_parent;
g_bMouseTrack = FALSE;
bt_hwnd=CreateWindowEx(NULL,"Button",bt_text,WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, x_pos, y_pos, x_sz, y_sz,bt_parent, NULL,NULL,NULL);
//на слудующую строчку очень сильно ругается компилятор
btnOld = (WNDPROC)SetWindowLong(bt_hwnd, GWL_WNDPROC, (LONG)ButtonSubclassProc);
TrackMouse(bt_hwnd);
return 1;
}
//конец конструктора
HWND Get_BT_HWND()
{
return bt_hwnd;
}
int DrawBTN()
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(bt_hwnd, &ps);
CxImage image;
image.Load(draw_image,CXIMAGE_FORMAT_PNG);
image.Draw(hdc,0,0,-1,-1,0,true);
EndPaint(bt_hwnd, &ps);
return 1;
}
};