📄 button.c
字号:
case BS_AUTOCHECKBOX:
FastFillRect(hdc, &rc, GetSysColor(COLOR_BTNFACE));
/*rc.left += 2;*/
/*rc.top += 2;*/
rc.right = rc.left + 12;
rc.bottom = rc.top + 12;
/*Draw3dBox(hdc, rc.left, rc.top, 8, 8,
GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_3DLIGHT));*/
Draw3dInset(hdc, rc.left, rc.top, 12, 12);
InsetR(&rc, 2, 2);
FastFillRect(hdc, &rc, GetSysColor(COLOR_BTNHIGHLIGHT));
iFaceOffset = 1;
if(wEnumState & PBS_CHECKED) {
MoveToEx(hdc, rc.left, rc.top,NULL);
LineTo(hdc, rc.right, rc.bottom);
MoveToEx(hdc, rc.left, rc.bottom,NULL);
LineTo(hdc, rc.right, rc.top);
}
break;
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
FastFillRect(hdc, &rc, GetSysColor(COLOR_BTNFACE));
rc.left = 0;
rc.top += 1;
rc.right = rc.left + 10;
rc.bottom = rc.top + 10;
SelectObject(hdc, GetStockObject(NULL_BRUSH));
hOldPen = SelectObject(hdc, CreatePen(PS_SOLID, 1,
GetSysColor(COLOR_BTNSHADOW)));
SelectObject(hdc, GetStockObject(WHITE_BRUSH));
Ellipse(hdc,rc.left,rc.top, rc.right,rc.bottom);
InsetR(&rc, 1, 1);
SelectObject(hdc, GetStockObject(WHITE_BRUSH));
DeleteObject(SelectObject(hdc,
CreatePen(PS_SOLID, 1,GetSysColor(COLOR_WINDOWFRAME))));
Ellipse(hdc,rc.left,rc.top, rc.right,rc.bottom);
DeleteObject(SelectObject(hdc, hOldPen));
iFaceOffset = 0;
if(wEnumState & PBS_CHECKED)
Ellipse(hdc, rc.left+2, rc.top+2, rc.right-2,
rc.bottom-2);
break;
}
/*
* draw text
*/
if(buf[ 0]) {
hNewFont = GetStockObject( DEFAULT_GUI_FONT);
hOldFont = SelectObject( hdc, hNewFont);
/* calculate text bounding rect*/
rect.left = 0;
rect.top = 0;
DrawText( hdc, buf, -1, &rect, DT_CALCRECT | DT_LEFT |
DT_SINGLELINE | DT_TOP);
rectSave = rect;
/*
* calculate text draw location
*/
switch((int)(dwStyle & (BS_LEFT|BS_CENTER|BS_RIGHT))) {
case BS_CENTER:
default:
rect.left = (uiWidth - (rect.right - rect.left)) / 2
+ iFaceOffset;
break;
case BS_LEFT:
rect.left = uiWidthFrame + uiWidthShadow + 2
+ iFaceOffset;
break;
case BS_RIGHT:
rect.left = (rect.right - rect.left) + uiWidthFrame
+ uiWidthShadow + 4 + iFaceOffset;
break;
}
switch((int)(dwStyle & 0x0f)) {
case BS_CHECKBOX:
case BS_AUTOCHECKBOX:
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
rect.left = 12;
break;
}
rect.right += rect.left - rectSave.left;
switch((int)(dwStyle & (BS_TOP|BS_VCENTER|BS_BOTTOM))) {
case BS_VCENTER:
default:
rect.top = (uiHeight - (rect.bottom - rect.top)) / 2
+ iFaceOffset;
break;
case BS_TOP:
rect.top = 2 + uiWidthFrame + uiWidthShadow
+ iFaceOffset;
break;
case BS_BOTTOM:
rect.top = uiHeight - uiWidthFrame - uiWidthShadow -
(rect.bottom - rect.top) - 1 + iFaceOffset;
break;
}
switch((int)(dwStyle & 0x0f)) {
case BS_CHECKBOX:
case BS_AUTOCHECKBOX:
case BS_AUTORADIOBUTTON:
case BS_RADIOBUTTON:
rect.top = 0;
break;
}
rect.bottom += rect.top - rectSave.top;
oldBkMode = SetBkMode( hdc, TRANSPARENT);
if(wEnumState & PBS_DISABLED)
hOldColor = SetTextColor( hdc,
GetSysColor( COLOR_GRAYTEXT));
else
hOldColor = SetTextColor( hdc,
GetSysColor( COLOR_BTNTEXT));
DrawText( hdc, buf, -1, &rect,DT_LEFT | DT_SINGLELINE | DT_TOP);
SetBkMode( hdc, oldBkMode);
SetTextColor( hdc, hOldColor);
SelectObject( hdc, hOldFont);
}
#if 0
if( (!(wEnumState&PBS_CHECKED) && (wEnumState&PBS_FOCUSDOWN)) ||
(wEnumState & PBS_FOCUSUP)) {
rect = rectClient;
uiWidth = uiWidthFrame + uiWidthShadow + 2;
rect.left += uiWidth;
rect.top += uiWidth;
rect.right -= uiWidth;
rect.bottom -= uiWidth;
if((dwStyle & (BS_FLAT|BS_NOFOCUSRECT)) == 0)
DrawFocusRect( hdc, &rect);
}
#endif
SetTextColor( hdc, crOld);
SetBkColor( hdc, crBkOld);
Return:
EndPaint(hwnd, &ps);
}
static void WINAPI
cenButton_OnSetFocus(
HWND hwnd,
HWND hwndOldFocus)
{
/* WM_SETFOCUS is sent when the user clicks on the control */
/* or when the dialog manager determines that a keystroke */
/* should cause the control to be focused. This affects */
/* the appearance of the control so the state is saved for */
/* future drawing. */
WORD wState;
wState = cenButton_FnStart( hwnd);
/*if(!IsWindowEnabled(hwnd))
cenButton_SetState( hwnd, PUSH_FOCUS, TRUE );*/
cenButton_FnEnd( hwnd, wState);
}
static void WINAPI
cenButton_OnSetStyle(
HWND hwnd,
WORD style,
BOOL bRedraw)
{
WORD wState;
wState = cenButton_FnStart( hwnd);
cenButton_SetState( hwnd, PUSH_DEFAULT,
(style & 0x0f) == BS_DEFPUSHBUTTON);
cenButton_FnEnd( hwnd, wState);
}
static void WINAPI
cenButton_OnSetState(
HWND hwnd,
WORD wState)
{
WORD wStateOld;
wStateOld = cenButton_FnStart( hwnd);
cenButton_SetState( hwnd, PUSH_DOWN, (wState ? TRUE : FALSE ) );
cenButton_FnEnd( hwnd, wStateOld);
}
static void WINAPI
cenButton_SetState(
HWND hwnd,
WORD wState,
BOOL bEnable )
{
/* Turn on/off state bits according to the bEnable flag. If the */
/* new state is different, invalidate the client window so that */
/* the proper bitmap is displayed. */
WORD wNewState;
WORD wOldState;
RECT rectClient;
wOldState = GET_PBSTATE( hwnd);
wNewState = (bEnable ? (wOldState | wState) : (wOldState & ~wState));
if (wOldState != wNewState)
{ SET_PBSTATE( hwnd, wNewState );
GetClientRect(hwnd, &rectClient);
InvalidateRect(hwnd, &rectClient, FALSE);
}
}
#if 0
static void WINAPI
cenButton_OnSetFont(
HWND hwnd,
HFONT hFont,
BOOL bRedraw)
{
BOOL bDeleteFont = FALSE;
HFONT hFontNew = 0;
LOGFONT logFont;
/* create a thin font*/
if( GetObject( hFont, sizeof( logFont), &logFont) != 0) {
if( logFont.lfWeight != FW_NORMAL) {
logFont.lfWeight = FW_NORMAL;
if( ( hFontNew = CreateFontIndirect( &logFont)) != 0) {
hFont = hFontNew;
bDeleteFont = TRUE;
}
}
}
if( GET_PBDELETEFONT( hwnd))
DeleteObject( GET_PBFONT( hwnd));
SET_PBDELETEFONT( hwnd, bDeleteFont);
SET_PBFONT( hwnd, hFont);
FORWARD_WM_SETFONT( hwnd, hFont, bRedraw, DefWindowProc);
}
#endif
static void WINAPI
cenButton_OnSetText(
HWND hwnd,
LPCSTR lpszText)
{
/* WM_SETTEXT is sent to change the text of the button */
/* control. In this case we allow the default window proc */
/* to handle the message first. But this only affects the */
/* internal Windows data structure of the control, it does */
/* not display the change. To do this we invalidate and */
/* update the client area of the control which displays */
/* the new text. */
FORWARD_WM_SETTEXT( hwnd, lpszText, DefWindowProc);
InvalidateRect( hwnd, NULL, FALSE);
UpdateWindow( hwnd);
}
LRESULT CALLBACK
cenButtonWndFn(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
/* This is the window proc for the pushbutton control. Most of */
/* the drawing is accomplished in the DrawPushButton() function. */
/* The code below is mainly concerned with the keyboard and mouse */
/* events that the control detects. */
switch( message) {
HANDLE_MSG( hwnd, WM_CREATE, cenButton_OnCreate);
/*HANDLE_MSG( hwnd, WM_ENABLE, cenButton_OnEnable);*/
HANDLE_MSG( hwnd, WM_SETFOCUS, cenButton_OnSetFocus);
HANDLE_MSG( hwnd, WM_KILLFOCUS, cenButton_OnKillFocus);
HANDLE_MSG( hwnd, WM_LBUTTONDOWN, cenButton_OnLButtonDown);
HANDLE_MSG( hwnd, WM_LBUTTONDBLCLK, cenButton_OnLButtonDown);
HANDLE_MSG( hwnd, WM_LBUTTONUP, cenButton_OnLButtonUp);
HANDLE_MSG( hwnd, WM_MOUSEMOVE, cenButton_OnMouseMove);
/*HANDLE_MSG( hwnd, WM_KEYDOWN, cenButton_OnKey);*/
/*HANDLE_MSG( hwnd, WM_KEYUP, cenButton_OnKey);*/
HANDLE_MSG( hwnd, WM_ERASEBKGND, cenButton_OnEraseBkgnd);
HANDLE_MSG( hwnd, WM_PAINT_SPECIAL, cenButton_OnPaint);
/*HANDLE_MSG( hwnd, WM_GETDLGCODE, cenButton_OnGetDlgCode);*/
HANDLE_MSG( hwnd, BM_SETSTYLE, cenButton_OnSetStyle);
HANDLE_MSG( hwnd, BM_GETSTATE, cenButton_OnGetState);
HANDLE_MSG( hwnd, BM_SETSTATE, cenButton_OnSetState);
/*HANDLE_MSG( hwnd, WM_DESTROY, cenButton_OnDestroy);*/
/*HANDLE_MSG( hwnd, WM_SETFONT, cenButton_OnSetFont);*/
HANDLE_MSG( hwnd, WM_SETTEXT, cenButton_OnSetText);
case BM_GETCHECK:
#if 0
return cenButton_OnGetState(hwnd);
#else
return( ( GET_PBSTATE(hwnd) & PUSH_CHECKED) == PUSH_CHECKED);
#endif
case BM_SETCHECK:
#if 0
cenButton_OnSetState(hwnd, (WORD)wParam);
#else
{
WORD wStateOld;
wStateOld = cenButton_FnStart( hwnd);
cenButton_SetState( hwnd, PUSH_CHECKED,
((WORD)wParam ? TRUE : FALSE) );
cenButton_FnEnd( hwnd, wStateOld);
}
#endif
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam);
}
/* backwards compatibility*/
int WINAPI
MwButtonRegister(HINSTANCE hInstance)
{
return MwRegisterButtonControl(hInstance);
}
int WINAPI
MwRegisterButtonControl(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS;
wc.lpfnWndProc = (WNDPROC)cenButtonWndFn;
wc.cbClsExtra = 0;
wc.cbWndExtra = 10;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = 0; /*LoadCursor(NULL, IDC_ARROW);*/
wc.hbrBackground= GetStockObject(LTGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName= "BUTTON";
return RegisterClass(&wc);
}
static void WINAPI
DrawGroupBox(HWND hwnd,HDC hDCwParam,DWORD dwStyle)
{
HDC hdc;
HFONT hFont;
RECT rcClient;
RECT rcText;
RECT rc;
PAINTSTRUCT ps;
char buf[256];
HPEN hPenTop, hPenBottom, holdPen;
COLORREF crTop,crBottom;
hdc = BeginPaint(hwnd, &ps);
if(!hdc)
goto Return;
GetWindowText(hwnd, buf, sizeof(buf));
GetClientRect( hwnd, &rcClient );
hFont = GetStockObject( DEFAULT_GUI_FONT);
if (hFont)
hFont = SelectObject(hdc,hFont);
rc.left = 0;
rc.top = 0;
DrawText( hdc, buf, -1, &rc, DT_CALCRECT);
if(buf[ 0]) {
SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
SetBkMode(hdc,TRANSPARENT);
SetRect(&rcText,8,2,rc.right+8,rc.bottom+2);
DrawText(hdc,buf,-1,&rcText,DT_CENTER);
}
crTop=GetSysColor(COLOR_BTNHIGHLIGHT);
crBottom=GetSysColor(COLOR_BTNSHADOW);
hPenTop = CreatePen( PS_SOLID, 1, crTop);
hPenBottom = CreatePen( PS_SOLID, 1, crBottom);
holdPen = SelectObject( hdc, hPenTop);
MoveToEx(hdc,0,rc.bottom/2,NULL);
if(buf[ 0]) {
LineTo(hdc,5,rc.bottom/2);
MoveToEx(hdc,rc.right+11,rc.bottom/2,NULL);
LineTo(hdc,rcClient.right-1,rc.bottom/2);
}
else
LineTo(hdc,rcClient.right-1,rc.bottom/2);
LineTo(hdc,rcClient.right-1,rcClient.bottom-1);
SelectObject( hdc, hPenBottom);
LineTo(hdc,rcClient.left,rcClient.bottom-1);
LineTo(hdc,rcClient.left,rc.bottom/2);
SelectObject( hdc, holdPen);
DeleteObject( hPenTop);
DeleteObject( hPenBottom);
if (hFont)
SelectObject(hdc,hFont);
Return:
EndPaint(hwnd, &ps);
}
/* temporarily here, should move to winuser.c*/
void WINAPI
CheckRadioButton(HWND hDlg, int nIDFirst,int nIDLast,int nIDCheckButton)
{
HWND hWndCheck,hWndTemp;
DWORD dwStyle;
if (!(hWndCheck = GetDlgItem(hDlg,nIDCheckButton)))
return;
for(hWndTemp=hDlg->children; hWndTemp; hWndTemp=hWndTemp->siblings) {
if(hWndCheck == hWndTemp) continue;
dwStyle = GetWindowLong(hWndTemp,GWL_STYLE);
if ((hWndTemp->id >= (WORD)nIDFirst) &&
(hWndTemp->id <= (WORD)nIDLast) &&
((LOWORD(dwStyle) == BS_RADIOBUTTON) ||
(LOWORD(dwStyle) == BS_AUTORADIOBUTTON)))
SendMessage(hWndTemp,BM_SETCHECK,FALSE,0);
}
SendMessage(hWndCheck,BM_SETCHECK,TRUE,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -