读书人

关于动态自绘按钮解决方法

发布时间: 2012-01-15 22:57:48 作者: rapoo

关于动态自绘按钮
我定义了一个CXPButton的自绘按钮的类,可以实现对话框上控件添加的按钮的特殊风格,也可以响应鼠标事件;
但是我又像下面那样创建了一个动态按钮时,这个按钮只显示出了特殊风格,却不响应鼠标的任何事件了,请问这是为什么?

CXPButton m_btn;

m_btn.Create("new",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,
CRect(0,0,100,100),this,ID_BUTTON);

把它改成CButton m_btn;就能响应鼠标事件.


[解决办法]
CXPButton 是从CButton里继承而来的吗?
[解决办法]
这是在win32平台下写的一个自绘按钮
代码如下:
#include <windows.h>
#define BT_WIDTH 12*cx
#define BT_HEIGHT 4*cy
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
#define IDB_OnDraw 100
HINSTANCE hInst ;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
HWND hwnd;
MSG msg;
WNDCLASS WndClass;
TCHAR szAppClassName[]=TEXT("OwnerDrawButton");
hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(hInstance,IDC_ARROW);
WndClass.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=szAppClassName;
WndClass.lpszMenuName=NULL;
WndClass.style=0;
if (!RegisterClass(&WndClass))
{
MessageBox(NULL,"Error","Worning",MB_OK);
return FALSE;
}
hwnd = CreateWindow (szAppClassName, TEXT ("Owner-Draw Button Demo"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd,nShowCmd);
UpdateWindow(hwnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam;
}
void DrawArrow(HDC hdc,POINT pt[])
{
SelectObject(hdc,GetStockObject (WHITE_BRUSH));
Polygon(hdc,pt,7);
SelectObject (hdc, GetStockObject (WHITE_BRUSH)) ;

}
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static HWND hButton;
static int cxClient,cyClient,cx,cy;
int cxArrow,cyArrow;
LPDRAWITEMSTRUCT pdis;
static HBRUSH hBrush;
static HPEN hPen;
POINT pt[7];
TCHAR szButton[]=TEXT("Back");
switch(uMsg)
{
case WM_CREATE :
cx = LOWORD (GetDialogBaseUnits ()) ;
cy = HIWORD (GetDialogBaseUnits ()) ;
hButton = CreateWindow (TEXT ("button"), TEXT (""),
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
0, 0, BT_WIDTH, BT_HEIGHT,
hwnd, (HMENU) IDB_OnDraw, hInst, NULL) ;
hBrush =CreateSolidBrush(COLORREF RGB(47,186,255));
hPen=CreatePen(PS_SOLID,1,COLORREF RGB(0,0,0));
return 0 ;

case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
MoveWindow(hButton,(cxClient-BT_WIDTH)/2,(cyClient-BT_HEIGHT)/2,BT_WIDTH,BT_HEIGHT,TRUE);
return 0;
case WM_DRAWITEM:
pdis=(LPDRAWITEMSTRUCT)lParam;
SelectObject(pdis->hDC,hPen);
SelectObject(pdis->hDC,hBrush);
RoundRect(pdis->hDC,pdis->rcItem.left,pdis->rcItem.top,
pdis->rcItem.right,pdis->rcItem.bottom,10,10);
cxArrow=pdis->rcItem.right-pdis->rcItem.left;
cyArrow=pdis->rcItem.bottom-pdis->rcItem.top;
pt[0].x=cxArrow/4; pt[0].y=3*cyArrow/8;
pt[1].x=5*cxArrow/8; pt[1].y=3*cyArrow/8;
pt[2].x=9*cxArrow/16; pt[2].y=3*cyArrow/16;


pt[3].x=7*cxArrow/8; pt[3].y=cyArrow/2;
pt[4].x=9*cxArrow/16; pt[4].y=13*cyArrow/16;
pt[5].x=5*cxArrow/8; pt[5].y=5*cyArrow/8;
pt[6].x=cxArrow/4; pt[6].y=5*cyArrow/8;
DrawArrow(pdis->hDC,pt);
if (pdis->itemState & ODS_SELECTED)
{
SelectObject(pdis->hDC,CreateSolidBrush(COLORREF RGB(192,192,192)));
RoundRect(pdis->hDC,pdis->rcItem.left,pdis->rcItem.top,
pdis->rcItem.right,pdis->rcItem.bottom,10,10);
DrawArrow(pdis->hDC,pt);
}
if (pdis->itemState & ODS_FOCUS)
{
pdis->rcItem.left += cxArrow / 16 ;
pdis->rcItem.top += cyArrow / 16 ;
pdis->rcItem.right -= cxArrow / 16 ;
pdis->rcItem.bottom-= cyArrow / 16 ;
DrawFocusRect (pdis->hDC, &pdis->rcItem) ;
}
return 0;
case WM_DESTROY:
DeleteObject(hBrush);
DeleteObject(hPen);
PostQuitMessage(0);
return 0;
}
return DefWindowProc (hwnd, uMsg, wParam, lParam) ;
}

[解决办法]

我定义了一个CXPButton的自绘按钮的类,可以实现对话框上控件添加的按钮的特殊风格,也可以响应鼠标事件;
但是我又像下面那样创建了一个动态按钮时,这个按钮只显示出了特殊风格,却不响应鼠标的任何事件了,请问这是为什么?

CXPButton m_btn;

m_btn.Create("new",BS_PUSHBUTTON ¦WS_VISIBLE ¦WS_CHILD,
CRect(0,0,100,100),this,ID_BUTTON);

把它改成CButton m_btn;就能响应鼠标事件.

------

你就是动态创建个按钮
不是自绘..!

自绘需要重载 virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
添加相应代码即可

CXPButton 你是怎么添加的?

1.insert 的?
vc--> insert --> new class ....

2.手动添加的话
消息映射对不对?

BEGIN_MESSAGE_MAP(CXPButton, CButton)
//:::::
END_MESSAGE_MAP()

读书人网 >VC/MFC

热点推荐