📄 button.c
字号:
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
0, BTN_HEIGHT_BMP);
}
break;
case BS_3STATE:
case BS_AUTO3STATE:
case BS_AUTOCHECKBOX:
case BS_CHECKBOX:
if (dwStyle & BS_PUSHLIKE) {
myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
prcClient->right, prcClient->bottom,
DF_3DBOX_NORMAL | DF_3DBOX_FILL,
GetWindowBkColor ((HWND)pCtrl));
break;
}
if (dwStyle & WS_DISABLED) {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP * 2, 0);
}
else {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
0, 0);
}
break;
/*
case BS_OWNERDRAW:
break;
*/
default:
break;
}
}
static void btnPaintCheckedButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
int bmp_left = prcBitmap->left;
int bmp_top = prcBitmap->top + (prcBitmap->bottom - BTN_HEIGHT_BMP) / 2;
switch (dwStyle & BS_TYPEMASK)
{
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
if (dwStyle & BS_PUSHLIKE) {
myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
prcClient->right, prcClient->bottom,
DF_3DBOX_PRESSED | DF_3DBOX_FILL,
GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
break;
}
if (dwStyle & WS_DISABLED) {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
(BTN_WIDTH_BMP << 2), BTN_HEIGHT_BMP);
}
else {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP);
}
break;
case BS_3STATE:
case BS_AUTO3STATE:
case BS_AUTOCHECKBOX:
case BS_CHECKBOX:
if (dwStyle & BS_PUSHLIKE) {
myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
prcClient->right, prcClient->bottom,
DF_3DBOX_PRESSED | DF_3DBOX_FILL,
GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
break;
}
if (dwStyle & WS_DISABLED) {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP << 2, 0);
}
else {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP, 0);
}
break;
/*
case BS_DEFPUSHBUTTON:
case BS_PUSHBUTTON:
case BS_OWNERDRAW:
break;
*/
default:
break;
}
}
static void btnPaintInterminateButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
int bmp_left = prcBitmap->left;
int bmp_top = prcBitmap->top + (prcBitmap->bottom - BTN_HEIGHT_BMP) / 2;
switch (dwStyle & BS_TYPEMASK)
{
case BS_3STATE:
case BS_AUTO3STATE:
if (dwStyle & BS_PUSHLIKE) {
break;
}
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP << 1, 0);
break;
/*
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
case BS_AUTOCHECKBOX:
case BS_CHECKBOX:
case BS_DEFPUSHBUTTON:
case BS_PUSHBUTTON:
case BS_OWNERDRAW:
break;
*/
default:
break;
}
}
static void btnPaintPushedButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
int bmp_left = prcBitmap->left;
int bmp_top = prcBitmap->top + (prcBitmap->bottom - BTN_HEIGHT_BMP) / 2;
switch (dwStyle & BS_TYPEMASK)
{
case BS_DEFPUSHBUTTON:
case BS_PUSHBUTTON:
myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
prcClient->right, prcClient->bottom,
DF_3DBOX_PRESSED | DF_3DBOX_FILL,
GetWindowBkColor ((HWND)pCtrl));
OffsetRect (prcText, 1, 1);
break;
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
if (dwStyle & BS_PUSHLIKE) {
myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
prcClient->right, prcClient->bottom,
DF_3DBOX_PRESSED | DF_3DBOX_FILL,
GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
OffsetRect (prcText, 1, 1);
break;
}
if (BUTTON_STATUS(pCtrl) & BST_CHECKED) {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP * 3, BTN_HEIGHT_BMP);
}
else {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP << 1, BTN_HEIGHT_BMP);
}
break;
case BS_3STATE:
case BS_AUTO3STATE:
case BS_AUTOCHECKBOX:
case BS_CHECKBOX:
if (dwStyle & BS_PUSHLIKE) {
myDrawButton (hdc, (HWND)pCtrl, prcClient->left, prcClient->top,
prcClient->right, prcClient->bottom,
DF_3DBOX_PRESSED | DF_3DBOX_FILL,
GetWindowElementColorEx ((HWND)pCtrl, WEC_3DBOX_DARK));
OffsetRect (prcText, 1, 1);
break;
}
if (BUTTON_STATUS (pCtrl) & BST_CHECKED) {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP * 3, 0);
}
else {
FillBoxWithBitmapPart (hdc, bmp_left, bmp_top,
BTN_WIDTH_BMP, BTN_HEIGHT_BMP,
0, 0,
BUTTON_BMP,
BTN_WIDTH_BMP << 1, 0);
}
break;
/*
case BS_OWNERDRAW:
break;
*/
default:
break;
}
}
static void btnPaintFocusButton (PCONTROL pCtrl, HDC hdc, DWORD dwStyle,
RECT* prcClient, RECT* prcText, RECT* prcBitmap)
{
RECT rcBounds;
SetPenColor (hdc, PIXEL_darkgray);
switch (dwStyle & BS_TYPEMASK)
{
case BS_DEFPUSHBUTTON:
case BS_PUSHBUTTON:
FocusRect (hdc, prcClient->left + BTN_WIDTH_BORDER,
prcClient->top + BTN_WIDTH_BORDER,
prcClient->right - BTN_WIDTH_BORDER,
prcClient->bottom - BTN_WIDTH_BORDER);
break;
case BS_3STATE:
case BS_AUTO3STATE:
case BS_AUTOCHECKBOX:
case BS_CHECKBOX:
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
if (dwStyle & BS_PUSHLIKE) {
FocusRect (hdc, prcClient->left + BTN_WIDTH_BORDER,
prcClient->top + BTN_WIDTH_BORDER,
prcClient->right - BTN_WIDTH_BORDER,
prcClient->bottom - BTN_WIDTH_BORDER);
break;
}
btnGetTextBoundsRect (pCtrl, hdc, dwStyle, prcText, &rcBounds);
FocusRect (hdc, rcBounds.left - 1,
rcBounds.top - 1,
rcBounds.right + 1,
rcBounds.bottom + 1);
break;
/*
case BS_OWNERDRAW:
break;
*/
default:
break;
}
}
static int btnUncheckOthers (PCONTROL pCtrl)
{
PCONTROL pGroupLeader = pCtrl;
PCONTROL pOthers;
DWORD type = pCtrl->dwStyle & BS_TYPEMASK;
while (pGroupLeader) {
if (pGroupLeader->dwStyle & WS_GROUP)
break;
pGroupLeader = pGroupLeader->prev;
}
pOthers = pGroupLeader;
while (pOthers) {
if ((pOthers->dwStyle & BS_TYPEMASK) != type)
break;
if ((pOthers != pCtrl) && (BUTTON_STATUS (pOthers) | BST_CHECKED)) {
BUTTON_STATUS (pOthers) &= ~BST_CHECKED;
InvalidateRect ((HWND)pOthers, NULL, TRUE);
}
pOthers = pOthers->next;
}
return pCtrl->id;
}
static int ButtonCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PCONTROL pCtrl;
DWORD dwStyle;
RECT rcClient;
RECT rcText;
RECT rcBitmap;
PBUTTONDATA pData;
pCtrl = Control(hWnd);
dwStyle = pCtrl->dwStyle;
switch(uMsg)
{
case MSG_CREATE:
pData = (BUTTONDATA*) calloc (1, sizeof(BUTTONDATA));
if (pData == NULL)
return -1;
pData->status = 0;
pData->data = pCtrl->dwAddData;
pCtrl->dwAddData2 = (DWORD) pData;
switch (dwStyle & BS_TYPEMASK) {
case BS_PUSHBUTTON:
case BS_DEFPUSHBUTTON:
SetWindowBkColor (hWnd, GetWindowElementColorEx (hWnd, BKC_BUTTON_DEF));
break;
default:
if (dwStyle & BS_CHECKED)
pData->status |= BST_CHECKED;
break;
}
break;
case MSG_DESTROY:
free ((void*) pCtrl->dwAddData2);
break;
#ifdef _PHONE_WINDOW_STYLE
case MSG_SIZECHANGING:
{
const RECT* rcExpect = (const RECT*)wParam;
RECT* rcResult = (RECT*)lParam;
rcResult->left = rcExpect->left;
rcResult->top = rcExpect->top;
rcResult->right = rcExpect->right;
rcResult->bottom = rcExpect->top + bmp_pushbutton->bmHeight;
return 0;
}
case MSG_SIZECHANGED:
{
RECT* rcWin = (RECT*)wParam;
RECT* rcClient = (RECT*)lParam;
*rcClient = *rcWin;
return 1;
}
#endif
case BM_GETCHECK:
switch (dwStyle & BS_TYPEMASK) {
case BS_AUTOCHECKBOX:
case BS_AUTORADIOBUTTON:
case BS_CHECKBOX:
case BS_RADIOBUTTON:
return (BUTTON_STATUS (pCtrl) & BST_CHECKED);
case BS_3STATE:
case BS_AUTO3STATE:
if (BUTTON_STATUS (pCtrl) & BST_INDETERMINATE)
return (BST_INDETERMINATE);
return (BUTTON_STATUS (pCtrl) & BST_CHECKED);
default:
return 0;
}
break;
case BM_GETSTATE:
return (int)(BUTTON_STATUS (pCtrl));
case BM_GETIMAGE:
{
int* image_type = (int*) wParam;
if (dwStyle & BS_BITMAP) {
if (image_type) {
*image_type = BM_IMAGE_BITMAP;
}
return (int)(BUTTON_DATA (pCtrl));
}
else if (dwStyle & BS_ICON) {
if (image_type) {
*image_type = BM_IMAGE_ICON;
}
return (int)(BUTTON_DATA (pCtrl));
}
}
return 0;
case BM_SETIMAGE:
{
int oldImage = (int)BUTTON_DATA (pCtrl);
if (wParam == BM_IMAGE_BITMAP) {
pCtrl->dwStyle &= ~BS_ICON;
pCtrl->dwStyle |= BS_BITMAP;
}
else if (wParam == BM_IMAGE_ICON){
pCtrl->dwStyle &= ~BS_BITMAP;
pCtrl->dwStyle |= BS_ICON;
}
if (lParam) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -