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

📄 bmpbutton.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
            GetWindowRect(hWnd,&cl);
            //只有发消息才能改变其状态
		    //add by tjb 2004-5-13
		    if((dwStyle & BBS_TYPEMASK) == BBS_PUSHDOWNBNT)
		    {
			    if(PtInRect (&cl, x, y))     //add by hejian 2004-5-16
			    {
			    	NotifyParent (hWnd, id, BBN_CLICKED);
			    }
			    else
			    {
			    	ReleaseCapture ();
			    }
			    break;
		    }
            if (PtInRect (&cl, x, y))
            {   
                pData->status &= ~BBST_PUSHED;
                if (!( pData->status & BBST_CHECKED))
                	SendMessage (hWnd, BBM_SETCHECK, BBST_CHECKED, 0); 
                //else
                if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
                	((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
            	{
            		RefreshChildInParent(hWnd);
            	} 
            	  
                InvalidateRect (hWnd, NULL, TRUE);
                	
                NotifyParent (hWnd, id, BBN_CLICKED);
            }
            else if (pData->status & BBST_PUSHED) 
			{
            	ReleaseCapture ();
                pData->status &= ~BBST_PUSHED;
                pData->status &= ~BBST_FOCUS;
                InvalidateRect (hWnd, NULL, TRUE);
            }
        }
        return 0;
		
		case MSG_NCMOUSEMOVE:
        {
            if (pData->status & BBST_FOCUS) 
	    	{
            	pData->status &= ~BBST_FOCUS;
            	if (GetCapture () == hWnd)
            	{
            		ReleaseCapture (); 
               	}
               	if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
                	((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
            	{
            		RefreshChildInParent(hWnd);
            	} 
            	
            	InvalidateRect (hWnd, NULL, TRUE);       
            }
        }
        break;
		
        case MSG_MOUSEMOVE:
        {
	  	    int x, y;
		    RECT cl;
		    
		    if (GetCapture () != hWnd)
		    {
            	SetCapture (hWnd);
                pData->status |= BBST_FOCUS;
                InvalidateRect (hWnd, NULL, TRUE);
				NotifyParent (hWnd, id, BBN_SETFOCUS);
            	break;
	        }
              
            x = LOSWORD(lParam);
            y = HISWORD(lParam);
            ScreenToWindow(GetParent (hWnd), &x, &y);
            GetWindowRect(hWnd,&cl);
            if (PtInRect ((PRECT)&cl, x, y))
            {
                if (GetCapture () == hWnd)
               		break;
             	SetCapture (hWnd);
                pData->status |= BBST_FOCUS;                 
                InvalidateRect (hWnd, NULL, TRUE);
				NotifyParent (hWnd, id, BBN_SETFOCUS);
            }
            else if (pData->status & BBST_FOCUS) 
			{
            	pData->status &= ~BBST_FOCUS;
            	if (GetCapture () == hWnd)
            	{
            		ReleaseCapture (); 
               	}
               	
               	if( ((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON) ||
                	((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE) )
            	{
            		RefreshChildInParent(hWnd);
            	}
            //	InvalidateRect (hWnd, NULL, TRUE);
            	//postmessage 处理不及时,造成控键重叠时在Paint时的顺序不确定
            	SendMessage(hWnd, MSG_PAINT, 0, 0);
				NotifyParent (hWnd, id, BBN_KILLFOCUS);
            }
        }
        break;
    
        case MSG_PAINT:
        {
            RECT rcBounds;
			PLOGFONT pfont = GetWindowFont(hWnd); 
			
            hdc = BeginPaint (hWnd);
			
            GetClientRect (hWnd, &rcClient);
							
			if (pfont)
				SelectFont (hdc, pfont);
			
            SetBrushColor (hdc, GetWindowBkColor(hWnd));
            SetBkColor (hdc, GetWindowBkColor(hWnd)); 
			
            //if(pData)
            //   	SetTextColor (hdc, pData->textcolor);
            /************************add by hj  2004-97-14******************************/
            if(pData)
            {
            	if(pData->status & BBST_PUSHED)
            	{
            		//按钮被点击时的文字颜色
            		SetTextColor (hdc, pData->pstextcolor);    
            	}
            	else if(pData->status & BBST_FOCUS)
            	{
            		//按钮被鼠标经过时的文字颜色
            		SetTextColor (hdc, pData->fstextcolor);
            	}
            	else
            	{
            		//按钮常态下的文字颜色
            		SetTextColor (hdc, pData->textcolor);
            	}
            }
            /*****************************************************/
   	                
            if(((dwStyle & BBS_TYPEMASK) == BBS_THREESTATE))
            {
            	if(dwStyle & BBS_BMPFILE)
            	{
	            	BITMAP bmp;
	            	char bmpfile[MAX_PATH+1]; 
	            	char * pbmpfile;
	            	pbmpfile = &bmpfile[0]; 
	            	    	
	            	memset(&bmp,0,sizeof(BITMAP));
	            	 		 		
	            	if(pData && pData->data)
	            	{
            			if (pData->status & BBST_PUSHED)
			        	{
			           		PrefixFileName((const char *)(pData->data),"ps",pbmpfile,MAX_PATH);
			        	}
			        	else if(pData->status & BBST_FOCUS)
			       		{
			        		PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
			        	}
			        	else
			        	{
			         		PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
			        	}
#if 1//edit by tjb 2004-9-29
						if (dwStyle & BBS_BKALPHARED)
						//	FillWithAlphaBmpfile(hWnd, hdc, bmpfile, dwStyle & BBS_BKALPHA);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
						else if(dwStyle & BBS_BKALPHA)			
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
						else
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);

						SetBkMode(hdc,BM_TRANSPARENT);
 #endif 						
	            	}   					
                }
            }
            else if((dwStyle & BBS_TYPEMASK) == BBS_PUSHBUTTON)
            {
            }
            else if((dwStyle & BBS_TYPEMASK) == BBS_MOTIVEBUTTON)
            {
            	if(dwStyle & BBS_BMPFILE)
            	{
	            	BITMAP bmp;
	            	char bmpfile[MAX_PATH+1]; 
	            	char * pbmpfile;
	            	int x,y;  
	            	  
	            	pbmpfile = &bmpfile[0]; 	
	            	memset(&bmp,0,sizeof(BITMAP));
	            	x = y = 0 ; 		 		
	            	if(pData && pData->data)
	            	{
            			if (pData->status & BBST_PUSHED)
            			{
            				PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
            				x = 0;
            				y = 2;
            			}
            			else if(pData->status & BBST_FOCUS)
			        	{
			           		PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
			        	}
				        else
				        {
				         	PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
				        }
			        
#if 1//edit by tjb 2004-3-29
						if (dwStyle & BBS_BKALPHARED)
						//	FillWithAlphaBmpfile(hWnd, hdc, pbmpfile, dwStyle & BBS_BKALPHA);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
						else if(dwStyle & BBS_BKALPHA) 
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
						else
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);

						SetBkMode(hdc,BM_TRANSPARENT);
#endif
	            	}
                }
            	
       	    }
       	    else if((dwStyle & BBS_TYPEMASK) == BBS_TWOSTATE)//add by tjb 2004-4-22
       	    {
       	    	if(dwStyle & BBS_BMPFILE)
            	{
	            	BITMAP bmp;
	            	char bmpfile[MAX_PATH+1]; 
	            	char * pbmpfile;
	            	pbmpfile = &bmpfile[0]; 
	            	    	
	            	memset(&bmp,0,sizeof(BITMAP));
	            	 		 		
	            	if(pData && pData->data)
	            	{
			        	if(pData->status & BBST_FOCUS)
			       		{
			        		PrefixFileName((const char *)(pData->data),"fs",pbmpfile,MAX_PATH);
			        	}
			        	else
			        	{
			         		PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
			        	}
						if (dwStyle & BBS_BKALPHARED)
						//	FillWithAlphaBmpfile(hWnd, hdc, bmpfile, dwStyle &BBS_BKALPHA);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
						else if (dwStyle & BBS_BKALPHA)				
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
						else
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);

						SetBkMode(hdc,BM_TRANSPARENT);
	            	}   					
                }
       	    }
       	    else if((dwStyle & BBS_TYPEMASK) == BBS_SUNSTYLE)
       	    {
       	    	if(dwStyle & BBS_BMPFILE)
            	{
	            	BITMAP bmp;
	            	char bmpfile[MAX_PATH+1]; 
	            	char * pbmpfile;
	            	int x,y;  
	            	  
	            	pbmpfile = &bmpfile[0]; 	
	            	memset(&bmp,0,sizeof(BITMAP));
	            	x = y = 0 ; 
	            	if (pData->status & BBST_PUSHED)
	            		x = y = 2;
	            				 		
	            	if(pData && pData->data)
	            	{     	            	
						HDC mem_dc;
						int bmemdc = 0;
						
						strncpy(bmpfile,(char*)(pData->data),MAX_PATH);
						
						if ((pData->status & BBST_PUSHED) || (pData->status & BBST_FOCUS))
						{
							int oldbrush;
							mem_dc = CreateCompatibleDC (hdc);
							oldbrush = SetBrushColor (mem_dc, 0x00000000);
							FillBox(mem_dc,rcClient.left,rcClient.top,RECTW(rcClient),RECTH(rcClient));    			
							SetBrushColor(mem_dc,oldbrush);
							
							FillRectWithAlpha(mem_dc,&rcClient,"res/sunning.tga");
							
							bmemdc = 1;
						}
				
	             		if(!LoadBitmap( HDC_SCREEN, &bmp, bmpfile))
	            		{
	            			if(dwStyle &BBS_BKALPHA)
	            			{
	            				unsigned char r,g,b,a;
	            				Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hWnd),&r,&g,&b,&a);
	            				bmp.bmType |= BMP_TYPE_ALPHACHANNEL;
	            				bmp.bmAlpha = a;
	 						}
			 				if (bmemdc)
							{
	          					FillBoxWithBitmap(mem_dc, 0, 0, 0, 0,&bmp);
	          				}
	          				else
	          					FillBoxWithBitmap(hdc, x, y, 0, 0,&bmp);
	            			
	            			UnloadBitmap(&bmp);
	            		}
	            		if(bmemdc)
	            		{
	            			BitBlt (mem_dc, 0, 0, rcClient.right, rcClient.bottom, hdc, x, y, 0);
							DeleteCompatibleDC (mem_dc);
						}
						SetBkMode(hdc,BM_TRANSPARENT);
	            	}
                }
       	    }
            else if((dwStyle & BBS_TYPEMASK) == BBS_PUSHDOWNBNT)//add by tjb 2004-5-13
       	    {
       	    	if(dwStyle & BBS_BMPFILE)
            	{
	            	BITMAP bmp;
	            	char bmpfile[MAX_PATH+1]; 
	            	char * pbmpfile;
	            	pbmpfile = &bmpfile[0]; 
	            	    	
	            	memset(&bmp,0,sizeof(BITMAP));
	            	 		 		
	            	if(pData && pData->data)
	            	{
			        	if(pData->status & BBST_PUSHED)
			       		{
			        		PrefixFileName((const char *)(pData->data),"ps",pbmpfile,MAX_PATH);
			        	}
			        	else
			        	{
			         		PrefixFileName((const char *)(pData->data),"nm",pbmpfile,MAX_PATH);
			        	}
						
						if (dwStyle & BBS_BKALPHARED)
						//	FillWithAlphaBmpfile(hWnd, hdc, bmpfile, dwStyle & BBS_BKALPHA);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHARED, dwStyle&BBS_BKALPHA);
						else if (dwStyle &BBS_BKALPHA)
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, TRUE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, TRUE);
						else
						//	FillWithBmpAlphaValue(hWnd, hdc, bmpfile, FALSE);
							FillWithPicture(hWnd, hdc, bmpfile, NULL, BMP_TYPE_ALPHAVALUE, FALSE);

						SetBkMode(hdc,BM_TRANSPARENT);
	            	}   					
                }
       	    }
			
      	    rcClient.right--;
    	    rcClient.bottom--;
      	    spCaption = GetWindowCaption (hWnd);
    	    if((dwStyle & BBS_TEXT) && spCaption)
    	    {
    	    	int valigntype = (dwStyle & BBS_ALIGNMASK) >> 12;
    	    	int haligntype = ((dwStyle & BBS_ALIGNMASK) >> 8) & 3;
    	    	int textWidth,textHeight,x,y;
    
    	    	
    	    	textHeight = GetSysCharHeight();

                textHeight = pfont->size;
            
                textWidth = GetStrDispWidth(hWnd,spCaption,strlen(spCaption));
                	
                switch(valigntype)
                {
                 	case 2:
                	{
                		y = rcClient.bottom-textHeight-1;
                	}
                	break;
                	case 3:
                	{
                		y = rcClient.top +1 + 
                			(rcClient.bottom-rcClient.top - textHeight)/2;
                	}
                	break;
                	default:
                	 y = rcClient.top + 1;
                	break;
                }
                
                switch(haligntype)
                {
                 	case 2:
                	{
                		x = rcClient.right-textWidth-1;
                	}
                	break;
                	case 3:
                	{
                		x = rcClient.left +1 + 
                			(rcClient.right-rcClient.left - textWidth)/2;
                	}
                	break;
                	default:
                	 x = rcClient.left + 1;
                	break;
                }
                
    	    	btnPaintText(hWnd,hdc,spCaption,dwStyle,&rcClient);  
    	    }
    	    //btnGetTextBoundsRect(spCaption,hdc,dwStyle,&rcClient,&rcBounds);
            EndPaint (hWnd, hdc);
        }
        break;
	 case MSG_FONTCHANGED:
     {
		InvalidateRect (hWnd, NULL, FALSE);
		return 0;
     }
     default:
        break;
    }
    
    return DefaultControlProc (hWnd, uMsg, wParam, lParam);
}

⌨️ 快捷键说明

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