⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpbutton.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
// $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 + -