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

📄 ebcheckbox.c

📁 基于minigui开发的一套图形控件系统
💻 C
字号:
// button.c: the Button Control module.
//
// Copyright (C) 2004 TCL Multimedia Electronics Research & Development Center
//
// Current maintainer: Tang jianbin.
/*
**  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.
*/
//
// Create date: 2004/1/6
//
// Modify records:
//
//  Who             When        Where       For What                Status
//-----------------------------------------------------------------------------
// 
//  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <minigui/mywindows.h>

#include "ebcontrol.h"
#include "ebcheckbox.h"

static int EbCheckboxCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam);

BOOL RegisterEBCheckBoxControl (void)
{
    WNDCLASS WndClass;

    WndClass.spClassName = "ebcheckbox";
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);
    WndClass.iBkColor    = PIXEL_yellow;
    WndClass.WinProc     = EbCheckboxCtrlProc;

    return AddNewControlClass (&WndClass) == ERR_OK;
}

void EBCheckboxControlCleanup (void)
{
	UnregisterWindowClass (CTRL_EBCHECKBOX);
}

static void PaintContent (HWND hWnd, HDC hdc, DWORD dwStyle, RECT* prcText)
{
	UINT uFormat = DT_SINGLELINE | DT_VCENTER| DT_LEFT;
   	PEBCHECKBOXDATA pData = (PEBCHECKBOXDATA)GetWindowAdditionalData2(hWnd);
	
    SetBkColor (hdc, GetWindowBkColor (hWnd));
	SetBrushColor (hdc, GetWindowBkColor(hWnd));
	SetBkMode (hdc, BM_TRANSPARENT);
	
    if (dwStyle & WS_DISABLED) 
	{
        RECT rc;
		
		CopyRect(&rc, prcText);
        SetTextColor (hdc, PIXEL_lightwhite);
        OffsetRect (prcText, 1, 1);
        DrawText (hdc, GetWindowCaption(hWnd), -1, prcText, uFormat);
        
        SetTextColor (hdc, PIXEL_darkgray);
        DrawText (hdc, GetWindowCaption(hWnd), -1, &rc, uFormat);
    }
    else 
	{
		if (pData->textcolor)
			SetTextColor (hdc, pData->textcolor);
		else
			SetTextColor (hdc, PIXEL_black);

        DrawText (hdc, GetWindowCaption(hWnd), -1, prcText, uFormat);
    }	
}

static int EbCheckboxCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
{
    DWORD       	dwStyle = GetWindowStyle(hWnd);
	PEBCHECKBOXDATA	adddata2 = (PEBCHECKBOXDATA)GetWindowAdditionalData2(hWnd);
	
    switch(uMsg)
    {
        case MSG_NCCREATE:
        	break;        
    
        case MSG_CREATE:
		{
			PEBCHECKBOXDATA pData;
			
			pData = (EBCHECKBOXDATA*) calloc (1, sizeof(EBCHECKBOXDATA));
            if (pData == NULL) 
                return -1;
			SetWindowAdditionalData2(hWnd, pData);
			pData->status = 0;
			pData->textcolor = PIXEL_invalid;
        	break;
        }
        case MSG_DESTROY:
			if (adddata2 != 0) 
			{
				free ((void*) adddata2);
            }            
       		break;
        
        case ECBM_CLICK:
        {
            DWORD dwState;
            switch (dwStyle & ECBS_TYPEMASK)
            {
                case ECBS_RADIOBOX:
                    if (!(adddata2->status & ECBT_CHECKED))
                        SendMessage (hWnd, ECBM_SETCHECK, ECBT_CHECKED, 0);
                	break;
                    
                case ECBS_CHECKBOX:
                    if (adddata2->status & ECBT_CHECKED)
                        dwState = ECBT_UNCHECKED;
                    else
                        dwState = ECBT_CHECKED;
                                
                    SendMessage (hWnd, ECBM_SETCHECK, (WPARAM)dwState, 0);
                	break;                   
                default:
					break;
            }               
            InvalidateRect (hWnd, NULL, FALSE);
            NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
        }
        break;
        
        case ECBM_GETCHECK:
        	return (adddata2->status & ECBT_CHECKED);
        break;
        
        case ECBM_GETSTATE:
            return (int)(adddata2->status);
        break;

		case ECBM_SETTEXTCOLOR:
		{
			DWORD oldcolor;
			
			if (wParam)
			{
				oldcolor =adddata2->textcolor;
				adddata2->textcolor = wParam;
			}
			return oldcolor;
		}
		case ECBM_GETTEXTCOLOR:
			return adddata2->textcolor;			
        case MSG_SETTEXT:
        {
			SetWindowCaption(hWnd, (const char *) lParam);
            InvalidateRect (hWnd, NULL, TRUE);
            break;
        }
		
		//因为在SetWinUncheckOthers函数里不认ECBM_SETCHECK 消息,所以用BM_SETCHECK替代它
        case ECBM_SETCHECK:
        {			
            DWORD dwOldState= adddata2->status;
            switch (dwStyle & ECBS_TYPEMASK) 
			{
                case ECBS_CHECKBOX:
                    if (wParam & ECBT_CHECKED)
                        adddata2->status |= ECBT_CHECKED;
                    else
                        adddata2->status &= ~ECBT_CHECKED;
                break;
                case ECBS_RADIOBOX:
                    if ( ((adddata2->status & ECBT_CHECKED) == 0)
                            && (wParam & ECBT_CHECKED) ) 
                    {
                        adddata2->status |= ECBT_CHECKED;            
                        SetWinUncheckOthers(hWnd);
                    }
					else if ( (adddata2->status & ECBT_CHECKED)
                            && (!(wParam & ECBT_CHECKED)) )
                    {
                        adddata2->status &= ~ECBT_CHECKED;
                    }
                break;        
            }
                
            if (dwOldState != adddata2->status)
                InvalidateRect (hWnd, NULL, TRUE);
        }
        break;
        
        case ECBM_SETSTATE:
        {
            DWORD dwOldState = adddata2->status & ECBT_CHECKED;
            if (wParam)
                adddata2->status |= ECBT_CHECKED;
            else
                adddata2->status &= ~ECBT_CHECKED;
            
            if (dwOldState != (adddata2->status & ECBT_CHECKED))
                InvalidateRect (hWnd, NULL, TRUE);
        }
        break;
		
        case MSG_CHAR:
            if (HIBYTE(wParam) == 0 && ((dwStyle & ECBS_TYPEMASK) == ECBS_CHECKBOX))                       
            {
                DWORD dwOldState = adddata2->status;
                
                if (LOBYTE(wParam) == '+' || LOBYTE(wParam) == '=')
                    adddata2->status |= ECBT_CHECKED;
                else if (LOBYTE(wParam) == '-')
                    adddata2->status &= ~ECBT_CHECKED;
                    
                if (dwOldState != adddata2->status)
                    InvalidateRect (hWnd, NULL, TRUE);
            }
        break;
        
        case MSG_ENABLE:
            if (wParam && (dwStyle & WS_DISABLED))
				ExcludeWindowStyle(hWnd, WS_DISABLED);
            else if (!wParam && !(dwStyle & WS_DISABLED))
				IncludeWindowStyle(hWnd, WS_DISABLED);
            else
                return 0;
            InvalidateRect (hWnd, NULL, TRUE);
        	return 0;

        case MSG_GETDLGCODE:
            switch (dwStyle & ECBS_TYPEMASK) 
			{
                case ECBS_CHECKBOX:
                return DLGC_WANTCHARS | DLGC_BUTTON;
                
                case ECBS_RADIOBOX:
                return DLGC_RADIOBUTTON | DLGC_BUTTON;
				
                default:
                return 0;
            }
        break;

        case MSG_NCHITTEST:
        {
            int x, y;
            RECT	clientrect;
			
            x = (int)wParam;
            y = (int)lParam;
			
        	GetWindowRect(hWnd, &clientrect);
			
            if (PtInRect (&clientrect, x, y))
                return HT_CLIENT;
            else  
                return HT_OUT;
        }
        	break;
 
        case MSG_KEYDOWN:
		{
			int id = LOWORD (wParam);
            if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
                break;

            if (GetCapture () == hWnd)
                break;
            
            SetCapture (hWnd);
            NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
        }
		break;
        
        case MSG_KEYUP:
        {
            DWORD dwState;
            
            if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
                break;
                
            if (GetCapture () != hWnd)
                break;
			
            ReleaseCapture ();
            
            InvalidateRect (hWnd, NULL, TRUE);

            switch (dwStyle & ECBS_TYPEMASK)
            {
                case ECBS_RADIOBOX:
                    if (!(adddata2->status & ECBT_CHECKED))
                        SendMessage (hWnd, ECBM_SETCHECK, ECBT_CHECKED, 0);
                	break;
                    
                case ECBS_CHECKBOX:
                    if (adddata2->status & ECBT_CHECKED)
                        dwState = ECBT_UNCHECKED;
                    else
                        dwState = ECBT_CHECKED;
                                
                    SendMessage (hWnd, ECBM_SETCHECK, (WPARAM)dwState, 0);
                	break;
                default:
					break;
            }
            NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
        }
        break;
      
        case MSG_LBUTTONDBLCLK:
            if ( (dwStyle & ECBS_TYPEMASK) == ECBS_RADIOBOX)
                NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_DBLCLK);
        break;
        
        case MSG_LBUTTONDOWN:
            if (GetCapture () == hWnd)
                break;           
            SetCapture (hWnd);
			break;
    
        case MSG_LBUTTONUP:
        {
            int 	x, y;
            DWORD 	dwState;
			RECT	winrect;
		
            if (GetCapture() != hWnd)
                break;

            ReleaseCapture ();

            x = LOSWORD(lParam);
            y = HISWORD(lParam);
            ScreenToClient (GetParent (hWnd), &x, &y);
			
			GetWindowRect (hWnd, &winrect);
            if (PtInRect (&winrect, x, y))
            {
                switch (dwStyle & ECBS_TYPEMASK)
                {
                    case ECBS_RADIOBOX:
                        if (!(adddata2->status & ECBT_CHECKED))
                        {	
                            SendMessage (hWnd, ECBM_SETCHECK, ECBT_CHECKED, 0);
                        }
                    	break;
                    
                    case ECBS_CHECKBOX:
                        if (adddata2->status & ECBT_CHECKED)
                            dwState = ECBT_UNCHECKED;
                        else
                            dwState = ECBT_CHECKED;
                                
                        SendMessage (hWnd, ECBM_SETCHECK, (WPARAM)dwState, 0);
                    	break;
                    
                    default:
						break;
                }

				InvalidateRect (hWnd, NULL, TRUE);

                NotifyParent(hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
            }
        }
        return 0;
        case MSG_FONTCHANGED:
        {
        	InvalidateRect (hWnd, NULL, FALSE);
        	return 0;
        }
		break;
		//case MSG_FONTCHANGING:
		//	return -1;
		case MSG_NCPAINT:
		case MSG_ERASEBKGND:
			return 0;
        case MSG_PAINT:
		{
			char* 		spCaption;
			RECT		rect;
			BITMAP 		bmp;
			char 		bmpfile[MAX_PATH + 1];
			PLOGFONT 	pfont = GetWindowFont(hWnd);
			DWORD		adddata=GetWindowAdditionalData(hWnd);//为图片文件名
			HDC         hdc=BeginPaint (hWnd);;

			GetClientRect(hWnd, &rect);
			
			//edit by tjb 2004-4-21
			//修改原因:当设置了用户自定义的字体后,会不能正常显示
			if (pfont)
				SelectFont(hdc, pfont);
			//end edit
			
			if (adddata != 0 && (dwStyle & ECBS_BMPFILE))
			{					
        		memset(&bmp,0,sizeof(BITMAP));         		      		  	

				if (adddata2->status & ECBT_CHECKED)
					PrefixFileName((char*)adddata, "ck", bmpfile, MAX_PATH);
				else
					PrefixFileName((char*)adddata, "nm", bmpfile, MAX_PATH);
								
         		if(!LoadBitmap( HDC_SCREEN, &bmp, bmpfile))
        		{
        			if(dwStyle & ECBS_BKALPHA)
        			{
        				unsigned char r,g,b,a;
        				Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hWnd),&r,&g,&b,&a);
        				bmp.bmType |= BMP_TYPE_ALPHACHANNEL;
        				bmp.bmAlpha = a;
					}
					
					//add by tjb 2004-4-21
					//当位图的高度不与控件高度一样时,需要把位图居中显示
					if (RECTH(rect) > bmp.bmHeight)
					{
						int y1;
						y1 = (RECTH(rect)-bmp.bmHeight)/2;
						FillBoxWithBitmap(hdc, 0, y1, 0, 0,&bmp);
					}
					else
					{
						FillBoxWithBitmap(hdc, 0, 0, 0, 0,&bmp);
					}
        			SetBkMode(hdc,BM_TRANSPARENT);
        			UnloadBitmap(&bmp);
        		}
        	}
			
			spCaption = GetWindowCaption (hWnd);
    	    if(spCaption)
    	    {				
				rect.left += bmp.bmWidth + 2;
				rect.top += 1;
				rect.right -= 1;
				rect.bottom -= 1;
				
				PaintContent(hWnd, hdc, dwStyle, &rect);
    	    }
			
            EndPaint (hWnd, hdc);
			break;
        }	
        default:
        break;
    }
    return DefaultControlProc (hWnd, uMsg, wParam, lParam);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -