📄 bmpbutton.c
字号:
// $Id: bmpbutton.c,v 1.2 2005/07/26 02:28:32 tangjb Exp $
//
// bmpbutton.c: the Button Control module.
//
// Copyright (C) 1999, 2000, 2001, 2002, Wei Yongming.
//
// Current maintainer: Wei Yongming.
/*
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Library General Public
** License as published by the Free Software Foundation; either
** version 2 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Library General Public License for more details.
**
** You should have received a copy of the GNU Library General Public
** License along with this library; if not, write to the Free
** Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA
*/
/*
** Alternatively, the contents of this file may be used under the terms
** of the Mozilla Public License (the "MPL License") in which case the
** provisions of the MPL License are applicable instead of those above.
*/
//
// Note:
// Originally by Zhao Jianghua.
//
// Create date: 1999/8/23
//
// Modify records:
//
// Who When Where For What Status
//-----------------------------------------------------------------------------
// WEI Yongming 1999/10/27 Tsinghua Notify Message Fininshed
// WEI Yongming 2000/02/24 Tsinghua Add MPL License Finished
//
// TODO:
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include "ebcontrol.h"
#include "bmpbutton.h"
#include "ctrlmisc.h"
#define BTN_WIDTH_BORDER 1
static int BmpButtonCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam);
BOOL RegisterBmpButtonControl (void)
{
WNDCLASS WndClass;
WndClass.spClassName = CTRL_BMPBUTTON;
WndClass.dwStyle = WS_NONE;
WndClass.dwExStyle = WS_EX_NONE;
WndClass.hCursor = GetSystemCursor (IDC_ARROW);
WndClass.iBkColor = PIXEL_transparent;
WndClass.WinProc = BmpButtonCtrlProc;
return RegisterWindowClass (&WndClass);
}
void BmpButtonControlCleanup (void)
{
UnregisterWindowClass (CTRL_BMPBUTTON);
}
static void btnGetTextBoundsRect (char * szcaption,HDC hdc, DWORD dwStyle,
const RECT* prcText, RECT* prcBounds)
{
UINT uFormat;
*prcBounds = *prcText;
uFormat = DT_SINGLELINE;
if ((dwStyle & BBS_TYPEMASK) == BBS_PUSHBUTTON)
uFormat |= DT_CENTER | DT_VCENTER;
else {
uFormat = DT_TOP | DT_LEFT;
if ((dwStyle & BBS_ALIGNMASK) == BBS_LEFT)
uFormat = DT_WORDBREAK | DT_LEFT;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_RIGHT)
uFormat = DT_WORDBREAK | DT_RIGHT;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_CENTER)
uFormat = DT_WORDBREAK | DT_CENTER;
if ((dwStyle & BBS_ALIGNMASK) == BBS_TOP)
uFormat = DT_SINGLELINE | DT_TOP;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_BOTTOM)
uFormat = DT_SINGLELINE | DT_BOTTOM;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_VCENTER)
uFormat = DT_SINGLELINE | DT_VCENTER;
}
uFormat |= DT_CALCRECT;
DrawText (hdc, szcaption, -1, prcBounds, uFormat);
}
static void btnPaintText (HWND hWnd, HDC hdc, const char * sztext,DWORD dwStyle,
RECT* prcText)
{
if(dwStyle & BBS_TEXT)
{
UINT uFormat;
uFormat = DT_SINGLELINE;
//edit by tjb 2004-3-21
//修改原因:文字不能居中、不能垂直居中
//
#if 1
if ((dwStyle & BS_TYPEMASK) == BBS_PUSHBUTTON)
uFormat |= DT_CENTER | DT_VCENTER;
else
{
uFormat |= DT_TOP | DT_LEFT; /*默认位置*/
if (dwStyle & BBS_CENTER)
uFormat |= DT_CENTER;
else if (dwStyle & BBS_RIGHT)
uFormat |= DT_RIGHT;
if (dwStyle & BBS_VCENTER)
uFormat |= DT_VCENTER;
else if (dwStyle & BBS_BOTTOM)
uFormat |= DT_BOTTOM;
}
#else
if ((dwStyle & BBS_TYPEMASK) == BBS_PUSHBUTTON)
uFormat = DT_SINGLELINE | DT_CENTER | DT_VCENTER;
else
{
// uFormat = DT_TOP | DT_LEFT;
uFormat = DT_SINGLELINE | DT_CENTER | DT_VCENTER;
if ((dwStyle & BBS_ALIGNMASK) == BBS_LEFT)
uFormat = DT_WORDBREAK | DT_LEFT;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_RIGHT)
uFormat = DT_WORDBREAK | DT_RIGHT;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_CENTER)
uFormat = DT_WORDBREAK | DT_CENTER;
if ((dwStyle & BBS_ALIGNMASK) == BBS_TOP)
uFormat = DT_SINGLELINE | DT_TOP;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_BOTTOM)
uFormat = DT_SINGLELINE | DT_BOTTOM;
else if ((dwStyle & BBS_ALIGNMASK) == BBS_VCENTER)
uFormat = DT_SINGLELINE | DT_VCENTER |DT_CENTER;
}
#endif
DrawText (hdc, sztext, -1, prcText, uFormat);
}
}
static int BmpButtonCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
DWORD dwStyle;
RECT rcClient;
RECT rcText;
RECT rcBitmap;
const char* spCaption;
UINT uFormat;
DWORD data2;
PBMPBUTTONDATA2 pData =(PBMPBUTTONDATA2)GetWindowAdditionalData2 (hWnd);
int id = GetDlgCtrlID (hWnd);
dwStyle = GetWindowStyle (hWnd);
switch(uMsg)
{
case MSG_NCCREATE:
break;
case MSG_CREATE:
{
DWORD data;
pData = (BMPBUTTONDATA2*) calloc (1, sizeof(BMPBUTTONDATA2));
if (pData == NULL)
return -1;
data = GetWindowAdditionalData (hWnd);
pData->textcolor = PIXEL_black;
pData->fstextcolor =PIXEL_black;
pData->pstextcolor =PIXEL_black;
pData->data = data;
pData->status = 0;
SetWindowAdditionalData2 (hWnd, (DWORD)pData);
}
break;
case MSG_DESTROY:
{
if (GetCapture() == hWnd)
ReleaseCapture ();
if (pData != 0) {
free(pData);
}
}
break;
case BBM_CLICK:
{
SendMessage (hWnd, BBM_SETCHECK, BBST_CHECKED, 0);
InvalidateRect (hWnd, NULL, FALSE);
NotifyParent (hWnd, id, BBN_CLICKED);
}
break;
case BBM_SETTEXTCOLOR:
{
int pOldValue = 0;
int whichcolor;
if(pData)
{
//pOldValue = (int)pData->textcolor;
//pData->textcolor = (DWORD)wParam;
/***************************add by hj 2004-07-14*********/
whichcolor =(int)lParam;
if(whichcolor ==1 || whichcolor ==0) //设置常态下的按钮文字颜色
{
pOldValue = (int)pData->textcolor;
pData->textcolor = (DWORD)wParam;
}
else if(whichcolor ==2) //设置鼠标经过时的按钮文字颜色
{
pOldValue = (int)pData->fstextcolor;
pData->fstextcolor = (DWORD)wParam;
}
else if(whichcolor ==3) //设置按钮被点击时的文字颜色
{
pOldValue = (int)pData->pstextcolor;
pData->pstextcolor = (DWORD)wParam;
}
/****************************************/
}
SetWindowAdditionalData2 (hWnd, (DWORD)pData);
InvalidateRect (hWnd, NULL, TRUE);
return pOldValue;
}
break;
case BBM_GETTEXTCOLOR:
{
if(pData)
return (int)pData->textcolor;
return 0;
}
break;
case BBM_GETCHECK:
{
if(pData)
return (pData->status & BBST_CHECKED);
else
return 0;
}
break;
case BBM_GETSTATE:
{
if(pData)
return (pData->status);
else
return 0;
}
break;
case MSG_SETTEXT:
{
SetWindowCaption (hWnd, (char*)lParam);
InvalidateRect (hWnd, NULL, TRUE);
break;
}
case BBM_SETIMAGE:
if ( (wParam == BBM_IMAGE_BITMAP)|| (wParam == BBM_IMAGE_ICON) ) {
int oldImage = (int)(pData->data);
pData->data = (DWORD)lParam;
InvalidateRect (hWnd, NULL, TRUE);
return oldImage;
}
break;
case BBM_SETCHECK:
{
DWORD dwOldState = pData->status;
if (wParam & BBST_CHECKED)
pData->status |= BBST_CHECKED;
else
pData->status &= ~BBST_CHECKED;
if (dwOldState != pData->status)
InvalidateRect (hWnd, NULL, TRUE);
}
break;
case BBM_SETSTATE:
{
DWORD dwOldState = pData->status & BBST_PUSHED;
if (wParam)
pData->status |= BBST_PUSHED;
else
pData->status &= ~BBST_PUSHED;
if (dwOldState != (pData->status & BBST_PUSHED))
InvalidateRect (hWnd, NULL, TRUE);
}
break;
case MSG_NCPAINT:
case MSG_ERASEBKGND:
return 0;
case MSG_ENABLE:
return 0;
case MSG_GETDLGCODE:
return DLGC_PUSHBUTTON;
case MSG_NCHITTEST:
{
int x, y;
RECT cl;
x = (int)wParam;
y = (int)lParam;
GetWindowRect(hWnd,&cl);
//fprintf(stderr,"\nbmpbutton::MSG_NCHITTEST:x=%d,y=%d,cl(%d/%d/%d/%d)",x,y,cl.left,cl.top,cl.right,cl.bottom);
if (PtInRect (&cl, x, y))
return HT_CLIENT;
else
return HT_OUT;
}
break;
case MSG_KILLFOCUS:
pData->status &= (~BBST_FOCUS);
if (GetCapture() == hWnd)
{
ReleaseCapture ();
pData->status &= (~BBST_PUSHED);
}
InvalidateRect (hWnd, NULL, TRUE);
// if (dwStyle & BBS_NOTIFY)
NotifyParent (hWnd, id, BBN_KILLFOCUS);
break;
case MSG_SETFOCUS:
{
//add by tjb 2005-7-1 当系统发送MSG_SETFOCUS消息后,鼠标移动不能改变其focus 状态
if (GetCapture () != hWnd)
SetCapture (hWnd);
//end add
pData->status |= BBST_FOCUS;
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, id, BBN_SETFOCUS);
break;
}
case MSG_KEYDOWN:
{
if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
break;
if (GetCapture () != hWnd)
{
SetCapture (hWnd);
}
pData->status |= BBST_PUSHED;
pData->status |= BBST_FOCUS;
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, id, BBN_PUSHED);
break;
}
case MSG_KEYUP:
{
DWORD dwState;
if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
break;
if (GetCapture () != hWnd)
break;
//只有发消息才能改变其状态
//add by tjb 2004-5-13
if((dwStyle & BBS_TYPEMASK) == BBS_PUSHDOWNBNT)
{
NotifyParent (hWnd, id, BBN_CLICKED);
break;
}
pData->status &= ~BBST_PUSHED;
if (!( pData->status & BBST_CHECKED))
SendMessage (hWnd, BBM_SETCHECK, BBST_CHECKED, 0);
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent (hWnd, id, BBN_CLICKED);
NotifyParent (hWnd, id, BBN_UNPUSHED);
}
break;
case MSG_LBUTTONDOWN:
if (GetCapture () != hWnd)
{
SetCapture (hWnd);
}
if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
{
RefreshChildInParent(hWnd);
}
pData->status |= BBST_PUSHED;
pData->status |= BBST_FOCUS;
InvalidateRect (hWnd, NULL, TRUE);
break;
case MSG_LBUTTONUP:
{
int x, y;
DWORD dwState;
RECT cl;
if (GetCapture() != hWnd)
break;
x = LOSWORD(lParam);
y = HISWORD(lParam);
ScreenToWindow(GetParent (hWnd), &x, &y);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -