📄 button.c
字号:
case BS_AUTORADIOBUTTON: case BS_RADIOBUTTON: FastFillRect(hdc, &rc, GetSysColor(COLOR_BTNFACE));#ifdef CONFIG_AUTORADIOBUTTONSIZE n = (uiHeight >= 20) ? 18 : 10;#else n = 10;#endif rc.left = 0; rc.top += (uiHeight - n) / 2; rc.right = rc.left + n; rc.bottom = rc.top + n; 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) { SelectObject ( hdc, GetStockObject(BLACK_BRUSH) ); Ellipse(hdc, rc.left+2, rc.top+2, rc.right-2, rc.bottom-2); } break; } /* * draw text */ if(buf[ 0]) { RECT ulinePos; BOOL bUline; hNewFont = GET_WND_FONT ( hwnd ); hOldFont = SelectObject( hdc, hNewFont); /* Check for underlined char */ bUline = MwCheckUnderlineChar ( hdc, buf, &txtlen, &ulinePos ); /* calculate text bounding rect*/ rect.left = 0; rect.top = 0; DrawText( hdc, buf, txtlen, &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 = uiHeight+2; 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) || !IsWindowEnabled(hwnd) ) hOldColor = SetTextColor( hdc, GetSysColor( COLOR_GRAYTEXT)); else hOldColor = SetTextColor( hdc, GetSysColor( COLOR_BTNTEXT)); SET_PBTXTRECT ( hwnd, rect ); OffsetRect ( &ulinePos, rect.left, rect.top ); DrawText( hdc, buf, txtlen, &rect,DT_LEFT | DT_SINGLELINE | DT_TOP); if( bUline ) { SelectObject ( hdc, GetStockObject(BLACK_PEN) ); MoveToEx ( hdc, ulinePos.left, ulinePos.bottom, NULL ); LineTo ( hdc, ulinePos.right, ulinePos.bottom ); } if( (GetFocus() == hwnd) ) DrawFocusRect ( hdc, &rect ); 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 WINAPIcenButton_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); if(!IsWindowEnabled(hwnd)) return; if( (hwnd->szTitle[0] != 0) && ((hwnd->style & (BS_FLAT/*|BS_NOFOCUSRECT*/)) == 0) ) { RECT rect; HDC hdc = GetDC ( hwnd ); GET_PBTXTRECT ( hwnd, rect ); rect.top = HIWORD(rect.left); rect.left=LOWORD(rect.left); rect.bottom = HIWORD(rect.right); rect.right=LOWORD(rect.right); DrawFocusRect ( hdc, &rect ); ReleaseDC ( hwnd, hdc ); }}static void WINAPIcenButton_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 WINAPIcenButton_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 WINAPIcenButton_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 0static void WINAPIcenButton_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);}#endifstatic void WINAPIcenButton_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 CALLBACKcenButtonWndFn(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 WM_GETDLGCODE: return cenButton_OnGetDlgCode ( hwnd, (LPMSG)lParam ); case WM_CHAR: if( (char)wParam == ' ' ) { SendMessage ( hwnd, WM_LBUTTONDOWN, -1, -1 ); UpdateWindow ( hwnd ); SendMessage ( hwnd, WM_LBUTTONUP, -1, -1 ); UpdateWindow ( hwnd ); } else return SendMessage ( GetParent(hwnd), message, wParam, lParam ); case BM_GETCHECK:#if 0 return cenButton_OnGetState(hwnd);#else return ((GET_PBSTATE(hwnd) & PUSH_CHECKED) == PUSH_CHECKED) ? BST_CHECKED : BST_UNCHECKED;#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 1; case BM_SETIMAGE: hwnd->userdata = (DWORD)wParam; InvalidateRect(hwnd, NULL, FALSE); return 0; // if cursor exit from client area, remove pushed state case WM_NCMOUSEMOVE: if( GetCapture() == hwnd ) { int x = LOWORD(lParam); int y = HIWORD(lParam); if( !PtInsideWindowNC(hwnd, x, y) ) { if( GET_PBWASINSIDE( hwnd)) { cenButton_SetState( hwnd, PUSH_DOWN, FALSE); SET_PBWASINSIDE( hwnd, FALSE ); } } else { if( !GET_PBWASINSIDE( hwnd) ) { cenButton_SetState( hwnd, PUSH_DOWN, TRUE ); SET_PBWASINSIDE( hwnd, TRUE ); } } } break; // if LBUTT go up when outside client area, reset state case WM_NCLBUTTONUP: if( GetCapture() == hwnd ) { int x = LOWORD(lParam); int y = HIWORD(lParam); if( !PtInsideWindowNC(hwnd, x, y) ) { SET_PBCAPTURE( hwnd, FALSE ); SET_PBWASINSIDE( hwnd, FALSE ); ReleaseCapture(); } } break; case WM_SETFONT: if( wParam == 0 ) break; SET_WND_FONT ( hwnd, (HFONT)wParam ); if( LOWORD(lParam) != 0 ) InvalidateRect ( hwnd, NULL, TRUE ); return 0; case WM_GETFONT: return (LRESULT) GET_WND_FONT ( hwnd ); case WM_ENABLE: InvalidateRect ( hwnd, NULL, TRUE ); if( (wParam == FALSE) && (GetFocus() == hwnd) ) PostMessage ( GetParent(hwnd), WM_NEXTDLGCTL, 0, 0 ); break; case WM_NCHITTEST: { DWORD dwStyle = GetWindowLong ( hwnd, GWL_STYLE ); if( (dwStyle & 0x0F) == BS_GROUPBOX ) return HTTRANSPARENT; break; } } return DefWindowProc( hwnd, message, wParam, lParam);}/* backwards compatibility*/int WINAPIMwButtonRegister(HINSTANCE hInstance){ return MwRegisterButtonControl(hInstance);}int WINAPIMwRegisterButtonControl(HINSTANCE hInstance){ WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS; wc.lpfnWndProc = (WNDPROC)cenButtonWndFn; wc.cbClsExtra = 0; wc.cbWndExtra = 22; /*GB: was 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 WINAPIDrawGroupBox(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; int txtlen; hdc = BeginPaint(hwnd, &ps); if(!hdc) goto Return; txtlen = GetWindowText(hwnd, buf, sizeof(buf)); GetClientRect( hwnd, &rcClient ); hFont = GET_WND_FONT ( hwnd ); if (hFont) hFont = SelectObject(hdc,hFont); rc.left = 0; rc.top = 0; DrawText( hdc, buf, -1, &rc, DT_CALCRECT); FastFillRect(hdc, &rcClient, GetSysColor(COLOR_BTNFACE)); if(buf[ 0]) { RECT ulinePos; BOOL bUline = MwCheckUnderlineChar ( hdc, buf, &txtlen, &ulinePos ); SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT)); SetBkMode(hdc,TRANSPARENT); SetRect(&rcText,8,2,rc.right+8,rc.bottom+2); OffsetRect ( &ulinePos, rcText.left, rcText.top ); DrawText(hdc,buf,txtlen,&rcText,DT_CENTER|DT_VCENTER); if( bUline ) { SelectObject ( hdc, GetStockObject(BLACK_PEN) ); MoveToEx ( hdc, ulinePos.left, ulinePos.bottom, NULL ); LineTo ( hdc, ulinePos.right, ulinePos.bottom ); } } 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -