📄 bmpbutton.c
字号:
GetWindowRect(hWnd,&cl);
//只有发消息才能改变其状态
//add by tjb 2004-5-13
if((dwStyle & BBS_TYPEMASK) == BBS_PUSHDOWNBNT)
{
if(PtInRect (&cl, x, y)) //add by hejian 2004-5-16
{
NotifyParent (hWnd, id, BBN_CLICKED);
}
else
{
ReleaseCapture ();
}
break;
}
if (PtInRect (&cl, x, y))
{
pData->status &= ~BBST_PUSHED;
if (!( pData->status & BBST_CHECKED))
SendMessage (hWnd, BBM_SETCHECK, BBST_CHECKED, 0);
//else
if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
{
RefreshChildInParent(hWnd);
}
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, id, BBN_CLICKED);
}
else if (pData->status & BBST_PUSHED)
{
ReleaseCapture ();
pData->status &= ~BBST_PUSHED;
pData->status &= ~BBST_FOCUS;
InvalidateRect (hWnd, NULL, TRUE);
}
}
return 0;
case MSG_NCMOUSEMOVE:
{
if (pData->status & BBST_FOCUS)
{
pData->status &= ~BBST_FOCUS;
if (GetCapture () == hWnd)
{
ReleaseCapture ();
}
if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
{
RefreshChildInParent(hWnd);
}
InvalidateRect (hWnd, NULL, TRUE);
}
}
break;
case MSG_MOUSEMOVE:
{
int x, y;
RECT cl;
if (GetCapture () != hWnd)
{
SetCapture (hWnd);
pData->status |= BBST_FOCUS;
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, id, BBN_SETFOCUS);
break;
}
x = LOSWORD(lParam);
y = HISWORD(lParam);
ScreenToWindow(GetParent (hWnd), &x, &y);
GetWindowRect(hWnd,&cl);
if (PtInRect ((PRECT)&cl, x, y))
{
if (GetCapture () == hWnd)
break;
SetCapture (hWnd);
pData->status |= BBST_FOCUS;
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, id, BBN_SETFOCUS);
}
else if (pData->status & BBST_FOCUS)
{
pData->status &= ~BBST_FOCUS;
if (GetCapture () == hWnd)
{
ReleaseCapture ();
}
if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
{
RefreshChildInParent(hWnd);
}
// InvalidateRect (hWnd, NULL, TRUE);
//postmessage 处理不及时,造成控键重叠时在Paint时的顺序不确定
SendMessage(hWnd, MSG_PAINT, 0, 0);
NotifyParent (hWnd, id, BBN_KILLFOCUS);
}
}
break;
case MSG_PAINT:
{
RECT rcBounds;
PLOGFONT pfont = GetWindowFont(hWnd);
hdc = BeginPaint (hWnd);
GetClientRect (hWnd, &rcClient);
if (pfont)
SelectFont (hdc, pfont);
SetBrushColor (hdc, GetWindowBkColor(hWnd));
SetBkColor (hdc, GetWindowBkColor(hWnd));
//if(pData)
// SetTextColor (hdc, pData->textcolor);
/************************add by hj 2004-97-14******************************/
if(pData)
{
if(pData->status & BBST_PUSHED)
{
//按钮被点击时的文字颜色
SetTextColor (hdc, pData->pstextcolor);
}
else if(pData->status & BBST_FOCUS)
{
//按钮被鼠标经过时的文字颜色
SetTextColor (hdc, pData->fstextcolor);
}
else
{
//按钮常态下的文字颜色
SetTextColor (hdc, pData->textcolor);
}
}
/*****************************************************/
if(((dwStyle & BBS_TYPEMASK) == BBS_THREESTATE))
{
if(dwStyle & BBS_BMPFILE)
{
BITMAP bmp;
char bmpfile[MAX_PATH+1];
char * pbmpfile;
pbmpfile = &bmpfile[0];
memset(&bmp,0,sizeof(BITMAP));
if(pData && pData->data)
{
if (pData->status & BBST_PUSHED)
{
PrefixFileName((const char *)(pData->data),"ps",pbmpfile,MAX_PATH);
}
else if(pData->status & BBST_FOCUS)
{
PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
}
else
{
PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
}
#if 1//edit by tjb 2004-9-29
if (dwStyle & BBS_BKALPHARED)
// FillWithAlphaBmpfile(hWnd, hdc, bmpfile, dwStyle & BBS_BKALPHA);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
else if(dwStyle & BBS_BKALPHA)
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
else
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);
SetBkMode(hdc,BM_TRANSPARENT);
#endif
}
}
}
else if((dwStyle & BBS_TYPEMASK) == BBS_PUSHBUTTON)
{
}
else if((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON)
{
if(dwStyle & BBS_BMPFILE)
{
BITMAP bmp;
char bmpfile[MAX_PATH+1];
char * pbmpfile;
int x,y;
pbmpfile = &bmpfile[0];
memset(&bmp,0,sizeof(BITMAP));
x = y = 0 ;
if(pData && pData->data)
{
if (pData->status & BBST_PUSHED)
{
PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
x = 0;
y = 2;
}
else if(pData->status & BBST_FOCUS)
{
PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
}
else
{
PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
}
#if 1//edit by tjb 2004-3-29
if (dwStyle & BBS_BKALPHARED)
// FillWithAlphaBmpfile(hWnd, hdc, pbmpfile, dwStyle & BBS_BKALPHA);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
else if(dwStyle & BBS_BKALPHA)
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
else
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);
SetBkMode(hdc,BM_TRANSPARENT);
#endif
}
}
}
else if((dwStyle & BBS_TYPEMASK) == BBS_TWOSTATE)//add by tjb 2004-4-22
{
if(dwStyle & BBS_BMPFILE)
{
BITMAP bmp;
char bmpfile[MAX_PATH+1];
char * pbmpfile;
pbmpfile = &bmpfile[0];
memset(&bmp,0,sizeof(BITMAP));
if(pData && pData->data)
{
if(pData->status & BBST_FOCUS)
{
PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
}
else
{
PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
}
if (dwStyle & BBS_BKALPHARED)
// FillWithAlphaBmpfile(hWnd, hdc, bmpfile, dwStyle &BBS_BKALPHA);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
else if (dwStyle & BBS_BKALPHA)
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
else
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);
SetBkMode(hdc,BM_TRANSPARENT);
}
}
}
else if((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE)
{
if(dwStyle & BBS_BMPFILE)
{
BITMAP bmp;
char bmpfile[MAX_PATH+1];
char * pbmpfile;
int x,y;
pbmpfile = &bmpfile[0];
memset(&bmp,0,sizeof(BITMAP));
x = y = 0 ;
if (pData->status & BBST_PUSHED)
x = y = 2;
if(pData && pData->data)
{
HDC mem_dc;
int bmemdc = 0;
strncpy(bmpfile,(char*)(pData->data),MAX_PATH);
if ((pData->status & BBST_PUSHED) || (pData->status & BBST_FOCUS))
{
int oldbrush;
mem_dc = CreateCompatibleDC (hdc);
oldbrush = SetBrushColor (mem_dc, 0x00000000);
FillBox(mem_dc,rcClient.left,rcClient.top,RECTW(rcClient),RECTH(rcClient));
SetBrushColor(mem_dc,oldbrush);
FillRectWithAlpha(mem_dc,&rcClient,"res/sunning.tga");
bmemdc = 1;
}
if(!LoadBitmap( HDC_SCREEN, &bmp, bmpfile))
{
if(dwStyle &BBS_BKALPHA)
{
unsigned char r,g,b,a;
Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hWnd),&r,&g,&b,&a);
bmp.bmType |= BMP_TYPE_ALPHACHANNEL;
bmp.bmAlpha = a;
}
if (bmemdc)
{
FillBoxWithBitmap(mem_dc, 0, 0, 0, 0,&bmp);
}
else
FillBoxWithBitmap(hdc, x, y, 0, 0,&bmp);
UnloadBitmap(&bmp);
}
if(bmemdc)
{
BitBlt (mem_dc, 0, 0, rcClient.right, rcClient.bottom, hdc, x, y, 0);
DeleteCompatibleDC (mem_dc);
}
SetBkMode(hdc,BM_TRANSPARENT);
}
}
}
else if((dwStyle & BBS_TYPEMASK) == BBS_PUSHDOWNBNT)//add by tjb 2004-5-13
{
if(dwStyle & BBS_BMPFILE)
{
BITMAP bmp;
char bmpfile[MAX_PATH+1];
char * pbmpfile;
pbmpfile = &bmpfile[0];
memset(&bmp,0,sizeof(BITMAP));
if(pData && pData->data)
{
if(pData->status & BBST_PUSHED)
{
PrefixFileName((const char *)(pData->data),"ps",pbmpfile,MAX_PATH);
}
else
{
PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
}
if (dwStyle & BBS_BKALPHARED)
// FillWithAlphaBmpfile(hWnd, hdc, bmpfile, dwStyle & BBS_BKALPHA);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
else if (dwStyle &BBS_BKALPHA)
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
else
// FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);
SetBkMode(hdc,BM_TRANSPARENT);
}
}
}
rcClient.right--;
rcClient.bottom--;
spCaption = GetWindowCaption (hWnd);
if((dwStyle & BBS_TEXT) && spCaption)
{
int valigntype = (dwStyle & BBS_ALIGNMASK) >> 12;
int haligntype = ((dwStyle & BBS_ALIGNMASK) >> 8) & 3;
int textWidth,textHeight,x,y;
textHeight = GetSysCharHeight();
textHeight = pfont->size;
textWidth = GetStrDispWidth(hWnd,spCaption,strlen(spCaption));
switch(valigntype)
{
case 2:
{
y = rcClient.bottom-textHeight-1;
}
break;
case 3:
{
y = rcClient.top +1 +
(rcClient.bottom-rcClient.top - textHeight)/2;
}
break;
default:
y = rcClient.top + 1;
break;
}
switch(haligntype)
{
case 2:
{
x = rcClient.right-textWidth-1;
}
break;
case 3:
{
x = rcClient.left +1 +
(rcClient.right-rcClient.left - textWidth)/2;
}
break;
default:
x = rcClient.left + 1;
break;
}
btnPaintText(hWnd,hdc,spCaption,dwStyle,&rcClient);
}
//btnGetTextBoundsRect(spCaption,hdc,dwStyle,&rcClient,&rcBounds);
EndPaint (hWnd, hdc);
}
break;
case MSG_FONTCHANGED:
{
InvalidateRect (hWnd, NULL, FALSE);
return 0;
}
default:
break;
}
return DefaultControlProc (hWnd, uMsg, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -