主题:自编画按钮函数
此按函数要在 WM_DRAWITEM:消息下调用。
示例:
LPDRAWITEMSTRUCT pdis;
static TCHAR *butText; //按钮文字
static int butBkColor[3]; //按钮背景色
...
case WM_DRAWITEM:
pdis = (LPDRAWITEMSTRUCT)lParam;
defDrawButton(pdis,butText,butBkColor);
break;
......
//这个函数可以实现彩色按钮的简单绘制,只需要3个参数即可,应该是比较有用的,分享一下。
//不过此程序可能有待改进,比如现在我就遇到一个问题 就是在按钮下无法快速点击,不知道为什么? 请各位朋友给我指点改进一下这些问题? 谢谢!
补充一下: 哪位朋友知道如何将该函数的第3个参数改成画刷类型,如下:
void defDrawButton(LPDRAWITEMSTRUCT pdis,TCHAR *butText,HBRUSH butBkColor)
{
.......
}
我试过好像都不行,提示的意思说 未定义。
//自绘按钮函数
void defDrawButton(LPDRAWITEMSTRUCT pdis,TCHAR *butText,int butBkColor[])
{
RECT rc;
HBRUSH HbuttonBackColor;
int ixChar,iyChar;
ixChar = LOWORD(GetDialogBaseUnits());
iyChar = HIWORD(GetDialogBaseUnits());
HbuttonBackColor = CreateSolidBrush(RGB(butBkColor[0],butBkColor[1],butBkColor[2]));
FillRect(pdis->hDC,&pdis->rcItem,HbuttonBackColor);
FrameRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH));
TextOut(pdis->hDC,
(pdis->rcItem.right - pdis->rcItem.left)/2-lstrlen(butText)*ixChar/2,
(pdis->rcItem.bottom - pdis->rcItem.top)/2-iyChar/2,
butText,
lstrlen(butText));
if(pdis->itemState & ODS_SELECTED)
{
rc.left = pdis->rcItem.left -5;
rc.top = pdis->rcItem.top -5;
rc.right = pdis->rcItem.right +5;
rc.bottom = pdis->rcItem.bottom +5;
FillRect(pdis->hDC,&rc,(HBRUSH)GetStockObject(WHITE_BRUSH));
rc.left = pdis->rcItem.left+2;
rc.top = pdis->rcItem.top +2;
rc.right = pdis->rcItem.right +2;
rc.bottom = pdis->rcItem.bottom +2;
pdis->rcItem = rc;
FrameRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH));
FillRect(pdis->hDC,&pdis->rcItem,HbuttonBackColor);
TextOut(pdis->hDC,
(pdis->rcItem.right - pdis->rcItem.left)/4+2,
(pdis->rcItem.bottom - pdis->rcItem.top)/4+2,
butText,
lstrlen(butText));
}
if(pdis->itemState & ODS_FOCUS)
{
pdis->rcItem.left += 4;
pdis->rcItem.right -= 4;
pdis->rcItem.top += 4;
pdis->rcItem.bottom -= 4;
DrawFocusRect (pdis->hDC, &pdis->rcItem);
}
}
示例:
LPDRAWITEMSTRUCT pdis;
static TCHAR *butText; //按钮文字
static int butBkColor[3]; //按钮背景色
...
case WM_DRAWITEM:
pdis = (LPDRAWITEMSTRUCT)lParam;
defDrawButton(pdis,butText,butBkColor);
break;
......
//这个函数可以实现彩色按钮的简单绘制,只需要3个参数即可,应该是比较有用的,分享一下。
//不过此程序可能有待改进,比如现在我就遇到一个问题 就是在按钮下无法快速点击,不知道为什么? 请各位朋友给我指点改进一下这些问题? 谢谢!
补充一下: 哪位朋友知道如何将该函数的第3个参数改成画刷类型,如下:
void defDrawButton(LPDRAWITEMSTRUCT pdis,TCHAR *butText,HBRUSH butBkColor)
{
.......
}
我试过好像都不行,提示的意思说 未定义。
//自绘按钮函数
void defDrawButton(LPDRAWITEMSTRUCT pdis,TCHAR *butText,int butBkColor[])
{
RECT rc;
HBRUSH HbuttonBackColor;
int ixChar,iyChar;
ixChar = LOWORD(GetDialogBaseUnits());
iyChar = HIWORD(GetDialogBaseUnits());
HbuttonBackColor = CreateSolidBrush(RGB(butBkColor[0],butBkColor[1],butBkColor[2]));
FillRect(pdis->hDC,&pdis->rcItem,HbuttonBackColor);
FrameRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH));
TextOut(pdis->hDC,
(pdis->rcItem.right - pdis->rcItem.left)/2-lstrlen(butText)*ixChar/2,
(pdis->rcItem.bottom - pdis->rcItem.top)/2-iyChar/2,
butText,
lstrlen(butText));
if(pdis->itemState & ODS_SELECTED)
{
rc.left = pdis->rcItem.left -5;
rc.top = pdis->rcItem.top -5;
rc.right = pdis->rcItem.right +5;
rc.bottom = pdis->rcItem.bottom +5;
FillRect(pdis->hDC,&rc,(HBRUSH)GetStockObject(WHITE_BRUSH));
rc.left = pdis->rcItem.left+2;
rc.top = pdis->rcItem.top +2;
rc.right = pdis->rcItem.right +2;
rc.bottom = pdis->rcItem.bottom +2;
pdis->rcItem = rc;
FrameRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH));
FillRect(pdis->hDC,&pdis->rcItem,HbuttonBackColor);
TextOut(pdis->hDC,
(pdis->rcItem.right - pdis->rcItem.left)/4+2,
(pdis->rcItem.bottom - pdis->rcItem.top)/4+2,
butText,
lstrlen(butText));
}
if(pdis->itemState & ODS_FOCUS)
{
pdis->rcItem.left += 4;
pdis->rcItem.right -= 4;
pdis->rcItem.top += 4;
pdis->rcItem.bottom -= 4;
DrawFocusRect (pdis->hDC, &pdis->rcItem);
}
}