WINCE 自绘位图按钮
2009-05-12 10:57
204 查看
//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;
}
}
// 自绘按钮的实现
//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;
}
}
相关文章推荐
- WINCE 自绘位图按钮
- 自绘位图按钮
- wince控件之自绘按钮(支持多种状态的图像加载、可通过图像创建不规程按钮)
- WINCE 自绘按钮的图形及背景
- WINCE 自绘按钮的图形及背景
- WINCE位图按钮切换闪烁的问题解决方法
- CBitmapButton位图按钮 WinCE 下无法正常使用
- 使用自绘的按钮,怎样给他添加位图
- 自绘位图按钮
- MFC的自绘位图按钮
- 自绘热点按钮
- (学)Lazarus 在 WinCE 下如何取消标题栏上的 OK 或 X 按钮
- MFC自绘按钮的实现,按钮动态效果
- C++编码SDK实现的位图按钮类
- WINCE下点阵转化为位图
- MFC(4)自绘按钮
- 1.6.2 简单自绘控件——无边框对话框最小化按钮
- VC使用位图和图标制作按钮
- 利用CBitmapButton类实现位图按钮的两种方法
- 菜鸟也疯狂,易语言自绘控件__按钮篇,用所有者自绘方式实现