您的位置:首页 > 其它

WINCE 自绘位图按钮

2013-05-14 19:03 197 查看
作者:太阳下的泪

转自:http://blog.sina.com.cn/s/blog_5be1061c0100azwo.html

//TITLE:

// 自绘按钮的实现

//AUTHOR:

// norains

//DATE:

// Saturday 12-January-2008

//Environment:

// VS2005 +SDK-WINCE5.0-MIPSII

// EVC +SDK-WINCE5.0-MIPSII

//========================================================================

自绘按钮的实现并不难,只不过如果是在非MFC类库中实现,却是显得有点麻烦,或是说,更需要一点小技巧.

文章打算在CMainWnd窗口类中实现一个自绘按钮,为了方便讲解以及突出重点,CMainWnd直接派生于CWndBase类.关于CWndBase类的信息,可以在此找到:http://blog.csdn.net/norains/archive/2008/01/12/2040109.aspx

首先我们先要创建一个按钮,我将它命名为m_hBnExit:

m_hBnExit = CreateWindowEx(WS_EX_TOPMOST,

TEXT("BUTTON"),

TEXT(""),

BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | BS_OWNERDRAW ,

POS_EXIT.left,

POS_EXIT.top,

POS_EXIT.right - POS_EXIT.left,

POS_EXIT.bottom - POS_EXIT.top,

m_hWnd,

(HMENU)IDC_BTN_EXIT,

m_hInst,

NULL);

这里有点需要注意,因为我们需要重新绘制按钮,所以BS_OWNERDRAW风格一定需要设置.一旦设置该风格,CMainWnd窗口的消息处理函数就能接收到按钮的WM_DRAWITEM消息:
LRESULT CMainWnd::WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)

{

...

switch(wMsg)

{

case WM_DRAWITEM:

if(((LPDRAWITEMSTRUCT)lParam)->CtlID == IDC_BTN_EXIT)

{

//TODO something;

}

...

}

...

}

接下来需要做的就很简单了,我们只需要在接收到WM_DRAWITEM消息时,判断是否为退出按键的ID号(在本文例子中为IDC_BTN_EXIT),如果是的话就重新绘制.为此,我们定义一个OnDrawItemBtnExit()函数,用来绘制该按钮:
void CMainWnd::OnDrawItemBtnExit(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)

{

LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;

//读取按钮的图片

HANDLE hBmp = LoadImage(m_hInst,MAKEINTRESOURCE(IDB_EXIT),IMAGE_BITMAP,0,0,0);

if(hBmp == NULL)

{

return ;

}

//Draw the button

HDC hdcBmp = CreateCompatibleDC(lpdis->hDC);

HGDIOBJ hOldSel = SelectObject(hdcBmp,hBmp);

if((lpdis->itemState & ODS_SELECTED ) && !(lpdis->itemState & ODS_DISABLED))

{

//按下状态

TransparentBlt(lpdis->hDC,

lpdis->rcItem.left,

lpdis->rcItem.top,

lpdis->rcItem.right - lpdis->rcItem.left,

lpdis->rcItem.bottom - lpdis->rcItem.top,

hdcBmp,

IMG_EXIT_PUSH.left,

IMG_EXIT_PUSH.top,

IMG_EXIT_PUSH.right - IMG_EXIT_PUSH.left,

IMG_EXIT_PUSH.bottom - IMG_EXIT_PUSH.top,

DEFAULT_TRANSPARENT_COLOR);

}

else if(lpdis->itemState & ODS_DISABLED)

{

//无效状态

TransparentBlt(lpdis->hDC,

lpdis->rcItem.left,

lpdis->rcItem.top,

lpdis->rcItem.right - lpdis->rcItem.left,

lpdis->rcItem.bottom - lpdis->rcItem.top,

hdcBmp,

IMG_EXIT_DISABLE.left,

IMG_EXIT_DISABLE.top,

IMG_EXIT_DISABLE.right - IMG_EXIT_DISABLE.left,

IMG_EXIT_DISABLE.bottom - IMG_EXIT_DISABLE.top,

DEFAULT_TRANSPARENT_COLOR);

}

else

{

//正常状态

TransparentBlt(lpdis->hDC,

lpdis->rcItem.left,

lpdis->rcItem.top,

lpdis->rcItem.right - lpdis->rcItem.left,

lpdis->rcItem.bottom - lpdis->rcItem.top,

hdcBmp,

IMG_EXIT_ENABLE.left,

IMG_EXIT_ENABLE.top,

IMG_EXIT_ENABLE.right - IMG_EXIT_ENABLE.left,

IMG_EXIT_ENABLE.bottom - IMG_EXIT_ENABLE.top,

DEFAULT_TRANSPARENT_COLOR);

}

if(hdcBmp != NULL && hOldSel != NULL)

{

SelectObject(hdcBmp,hOldSel);

DeleteDC(hdcBmp);

hdcBmp = NULL;

hOldSel = NULL;

}

if(hBmp != NULL)

{

DeleteObject(hBmp);

hBmp = NULL;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: