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

📄 eblistview.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
	    		FillBoxWithBitmap(hdc,rcClient.left-pLVInternalData->nOriginalX, 

					(rows - 1) * pLVInternalData->nItemHeight + off +

		            pLVInternalData->nHeadHeight-pLVInternalData->nOriginalY, 0, 0, &bmp);

	    		UnloadBitmap(&bmp);

	  	    }

		}

	}

}



//获得

int lvGetRowsChecked(HWND hWnd, int iRows)

{

	PEBLSTVWDATA pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hWnd);

	PEBITEMDATA pitem;

	int nPosition= iRows;

	

	if (iRows > pLVInternalData->nRows)

		return 0;

	

	if (nPosition == 1)

		pitem = pLVInternalData->pItemHead;

  	else

    {

		pitem = pLVInternalData->pItemHead;

      	while (nPosition != 1)

        {

          nPosition = nPosition - 1;

          pitem = pitem->pNext;

        }

    }

	

	if (pitem->bChecked)

	{

		return 1;

	}

	return 0;

}



static lvFillRectWithBitmap(HDC hdc,RECT * rect,PBITMAP pbmp)

{

	int x,y;

	int xend=0,yend=0;

	if(RECTW((*rect)) < pbmp->bmWidth || RECTH((*rect)) < pbmp->bmHeight)

	{

		FillBoxWithBitmap(hdc,0,

 			0,RECTW((*rect)),RECTH((*rect)),pbmp);

 		return;

	}

	

	for(y = rect->top; y < rect->bottom;)

	{

		if(y + pbmp->bmHeight > rect->bottom)

		{

			y = rect->bottom - pbmp->bmHeight;

		}

		

		for(x = rect->left; x < rect->right; )

		{

			if(x + pbmp->bmWidth > rect->right)

			{

				x = rect->right-pbmp->bmWidth;

			}

			FillBoxWithBitmap(hdc,x,

 			y,0,0,pbmp);

 			x+=pbmp->bmWidth;

		

		}

		y += pbmp->bmHeight;

	}

}





static void lvDrawBKBitmap(HWND hwnd,HDC hdc,PBITMAP pbmp)

{

  RECT rcClient;

  DWORD dwStyle = GetWindowStyle (hwnd);

  

  PEBLSTVWDATA pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);

  

  if(!pbmp)

  	return;

  	

  GetClientRect (hwnd, &rcClient);

  if(dwStyle &ELVS_BKALPHA)

  {

  	unsigned char r,g,b,a;

        Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hwnd),&r,&g,&b,&a);

        pbmp->bmType |= BMP_TYPE_ALPHACHANNEL;

        pbmp->bmAlpha = a;

  }

  switch(dwStyle & ELVS_BKIMAGEALIGNMASK)

  {

 	case ELVS_BKIMAGEFLAT:

 	{

 		lvFillRectWithBitmap(hdc,&rcClient,pbmp);

 		/*FillBoxWithBitmap(hdc,0,

 			0,RECTW(rcClient),RECTH(rcClient),pbmp);

 			*/

 	}

 	break;

 	case ELVS_BKIMAGECENTER:

 	{

 		int x0,y0;

 		x0 = rcClient.left + (rcClient.right-rcClient.left-pbmp->bmWidth)/2;

 		y0 = rcClient.top + (rcClient.bottom-rcClient.top-pbmp->bmHeight)/2;

 		SetBkColor (hdc, GetWindowBkColor(hwnd));

  		SetBrushColor (hdc, GetWindowBkColor(hwnd));

  		FillBox (hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,

           		rcClient.bottom - rcClient.top);

           	FillBoxWithBitmap(hdc, x0, y0, 0, 0,pbmp);

           				

 	}

 	break;

 	case ELVS_BKIMAGELEFTTOP:

 	{

 		SetBkColor (hdc, GetWindowBkColor(hwnd));

  		SetBrushColor (hdc, GetWindowBkColor(hwnd));

  		FillBox (hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,

           		rcClient.bottom - rcClient.top);

 		FillBoxWithBitmap(hdc, 0, 

 			0, 0, 0,pbmp);

 	}

 	break;

 	default:

  	break;

   }

}



static void lvDrawGlobalBK(HWND hwnd,HDC hdc)

{

  RECT rcClient;

  DWORD dwStyle = GetWindowStyle (hwnd);

  

  PEBLSTVWDATA pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);

   

  GetClientRect (hwnd, &rcClient);

 

  switch(dwStyle & ELVS_BKMASK)

  {

  	case ELVS_BKBRUSH:

  	{

  		SetBkColor (hdc, GetWindowBkColor(hwnd));

  		SetBrushColor (hdc, GetWindowBkColor(hwnd));

  		FillBox (hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,

  			rcClient.bottom - rcClient.top); 

  	}

  	break;

  	case ELVS_BKBITMAP:

  	{

  		lvDrawBKBitmap(hwnd,hdc,(PBITMAP)(pLVInternalData->nBKImage));

  	}

  	break;

  	case ELVS_BKBMPFILE:

  	{

  		BITMAP bmp;

		

        memset(&bmp,0,sizeof(BITMAP));

  		if(pLVInternalData->nBKImage && 

  			(!LoadBitmap( HDC_SCREEN, &bmp, (char*)(pLVInternalData->nBKImage))))

    	{

    		lvDrawBKBitmap(hwnd,hdc,&bmp);         		

       		UnloadBitmap(&bmp);

    	}

    	else

    	{

    		SetBkColor (hdc, GetWindowBkColor(hwnd));

				SetBrushColor (hdc, GetWindowBkColor(hwnd));

				FillBox (hdc, rcClient.left, rcClient.top,rcClient.right - rcClient.left, 

					rcClient.bottom - rcClient.top);

		}

  	}

  	break;

	case ELVS_BKNONE:

		break;

  	default:

  	break;

  }

	

}



//edit by tjb 2005-6-29

static void  SetItemSelected(WORD dwStyle, int nItem, PEBLSTVWDATA pLVInternalData)

{

	int i;

	PEBITEMDATA p2 = NULL;

	

	if(pLVInternalData->nRows <=0)

		return ;

	p2= pLVInternalData->pItemHead;



	if(pLVInternalData->pItemSelected != NULL && pLVInternalData->nItemSelected !=nItem)

	{

		pLVInternalData->pItemSelected->bSelected = FALSE;

		pLVInternalData->pItemSelected = NULL;

		pLVInternalData->nItemSelected =0;

	}

	

	if(nItem == 1)

	{

		p2->bSelected = TRUE;

	}

	else if(nItem == 0)

	{

		if(pLVInternalData->pItemSelected != NULL)

		{

			pLVInternalData->pItemSelected->bSelected = FALSE;

			pLVInternalData->pItemSelected = NULL;

			pLVInternalData->nItemSelected =0;

		}

		p2 = NULL;

	}

	for(i=2;(i<=nItem && p2 != NULL);i++)

	{

		p2 = p2->pNext;

	}

	if(p2 != NULL)

	{

		if (dwStyle & ELVS_USECHECKBOX)//edit by tjb 2005-6-29

		{

			if (p2->bChecked)

				p2->bChecked = FALSE;

			else

				p2->bChecked = TRUE;

		}

		p2->bSelected = TRUE;

		pLVInternalData->pItemSelected = p2;

		pLVInternalData->nItemSelected = nItem;

		p2 = NULL;

	}

}





static void  SetItemMouseOver(int nItem, PEBLSTVWDATA pLVInternalData)

{

	int i;

	PEBITEMDATA p2 = NULL;

	

	if(nItem >pLVInternalData->nRows || pLVInternalData->nRows <=0)

		return ;

	p2= pLVInternalData->pItemHead;



	if(pLVInternalData->pItemMouseOver != NULL && pLVInternalData->nItemMouseOver !=nItem)

	{

		pLVInternalData->pItemMouseOver->bMouseOver = FALSE;

		pLVInternalData->pItemMouseOver = NULL;

		pLVInternalData->nItemMouseOver =0;

	}

	

	if(nItem == 1)

	{

		p2->bMouseOver = TRUE;

	}

	else if(nItem == 0)

	{

		if(pLVInternalData->pItemMouseOver != NULL)

		{

			pLVInternalData->pItemMouseOver->bMouseOver = FALSE;

			pLVInternalData->pItemMouseOver = NULL;

			pLVInternalData->nItemMouseOver =0;

		}

		p2 = NULL;

	}

	for(i=2;(i<=nItem && p2 != NULL);i++)

	{

		p2 = p2->pNext;

	}

	if(p2 != NULL)

	{

		p2->bMouseOver = TRUE;

		pLVInternalData->pItemMouseOver = p2;

		pLVInternalData->nItemMouseOver = nItem;

		p2 = NULL;

	}

}





//为了能快速处理状态改变(如鼠标移动、选中)而创建的函数

//itemnum1,itemnum2:要处理的行编号,一个是失去焦点的行,一个是获得焦点的行,当然,两者都可能为0

//创建于:2004-07-13 创建者:何剑

static void  lvStatusChangeProcess(HWND hwnd, HDC hdc, int itemnum1, int itemnum2)

{

	RECT rcClient;

	PEBLSTHDR p1 = NULL;

	PEBSUBITEMDATA p2 = NULL;

	PEBITEMDATA p3 = NULL;

	int i, j;

	int nOldBkColor, nOldBrushColor;

	int temp;

	unsigned char red,green,blue,alpha;

	BITMAP bmp[3],*pbmp[3];

	BITMAP twobmp[2],*ptwobmp[2];//add by tjb

	DWORD pbitmap = 0;

	DWORD dwStyle;



	PEBLSTVWDATA pLVInternalData;

	PLOGFONT pfont = GetWindowFont(hwnd);



	GetClientRect (hwnd, &rcClient);

	pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);

	dwStyle = GetWindowStyle(hwnd);



	//画全局背景;

	//lvDrawGlobalBK(hwnd,hdc);

	p3 = pLVInternalData->pItemHead;

	

	//装载条目背景位图;

	memset(&bmp,0,sizeof(BITMAP)*3);

	memset(&pbmp,0,sizeof(BITMAP*)*3);

	Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hwnd),&red,&green,&blue,&alpha);



	switch(dwStyle & ELVS_ITEMBKMASK)

	{

  		case ELVS_ITEMBKICON:

  		{

  			pbitmap = pLVInternalData->nItemBKImage;

  		}

  		break;

    		case ELVS_ITEMBKBITMAP:

  		{

  			pbitmap = pLVInternalData->nItemBKImage;

  		}

  		break;

  		case ELVS_ITEMBKBMPFILE:

  		{

  			if(dwStyle & ELVS_TYPE3STATE)

  			{

  				char * tmpfile,*str1;  

  				char bmpfile1[MAX_PATH+1],bmpfile2[MAX_PATH+1],bmpfile3[MAX_PATH+1];      		  	



				tmpfile = (char *)(pLVInternalData->nItemBKImage);        	

        		str1 = rindex(tmpfile,'/'); 

	

        		if(str1)

        		{

        			int rpath;

        			rpath = (int)(str1-tmpfile)+1;

        			strncpy(bmpfile1,tmpfile,MAX_PATH);

        			bmpfile1[rpath] = 0;

        			strncpy(bmpfile2,bmpfile1,MAX_PATH);

        			strncpy(bmpfile3,bmpfile1,MAX_PATH);

        		

        			strncat(bmpfile1,"nm",MAX_PATH);

        			strncat(bmpfile2,"ov",MAX_PATH);

        			strncat(bmpfile3,"st",MAX_PATH);

          			

          			strncat(bmpfile1,str1+1,MAX_PATH);

          			strncat(bmpfile2,str1+1,MAX_PATH);

          			strncat(bmpfile3,str1+1,MAX_PATH);

          		}

          		else

          		{

          			strncpy(bmpfile1,"nm",MAX_PATH);

          			strncpy(bmpfile2,"ov",MAX_PATH);

          			strncpy(bmpfile3,"st",MAX_PATH);

          		

          			strncat(bmpfile1,tmpfile,MAX_PATH);

          			strncat(bmpfile2,tmpfile,MAX_PATH);

          			strncat(bmpfile3,tmpfile,MAX_PATH);

          		}

            		

	  			if(!LoadBitmap( HDC_SCREEN, &bmp[0], bmpfile1))

	        	{

	        		alpha =(unsigned char)((pLVInternalData->nItemBKColor >>24) &0xff);

		        	bmp[0].bmType |= BMP_TYPE_ALPHAVALUE;    //BMP_TYPE_ALPHACHANNEL;

		        	bmp[0].bmAlpha = alpha;

					pbmp[0] = &bmp[0];

	  	    	}

  	        	if(!LoadBitmap( HDC_SCREEN, &bmp[1], bmpfile2))

         		{

         			alpha =(unsigned char)((pLVInternalData->nMouseOverBkColor >>24) &0xff);

	        		bmp[1].bmType |= BMP_TYPE_ALPHAVALUE;    //BMP_TYPE_ALPHACHANNEL;

	        		bmp[1].bmAlpha = alpha;

					pbmp[1] = &bmp[1];

  	        	}

  	        	if(!LoadBitmap( HDC_SCREEN, &bmp[2], bmpfile3))

           		{

           			alpha =(unsigned char)((pLVInternalData->nSelectBKColor >>24) &0xff);

	        		bmp[2].bmType |= BMP_TYPE_ALPHAVALUE;    //BMP_TYPE_ALPHACHANNEL;

	        		bmp[2].bmAlpha = alpha;

					pbmp[2] = &bmp[2];

  	        	}

  	        	pbitmap = (DWORD)&pbmp;

  			

  			}

  			else if (dwStyle & ELVS_TYPE2STATE)//??

  			{

//edit by tjb 2004-3-11

//修改原因:若不是ELVS_TYPE3STATE,则没有获得焦点一态

				char * twotmpfile,*twostr1;  

	  			char twobmpfile1[MAX_PATH+1],twobmpfile2[MAX_PATH+1];

				

	    		twotmpfile = (char *)(pLVInternalData->nItemBKImage);

				PrefixFileName(twotmpfile, "nm", twobmpfile1, MAX_PATH);

				PrefixFileName(twotmpfile, "ov", twobmpfile2, MAX_PATH);

	  			if(!LoadBitmap( HDC_SCREEN, &twobmp[0], twobmpfile1))

	        	{

        			alpha =(unsigned char)((pLVInternalData->nItemBKColor >>24) &0xff);

        			twobmp[0].bmType |= BMP_TYPE_ALPHAVALUE;   //BMP_TYPE_ALPHACHANNEL;

        			twobmp[0].bmAlpha = alpha;

					ptwobmp[0] = &twobmp[0];

	  	   		}

	  	        if(!LoadBitmap( HDC_SCREEN, &twobmp[1], twobmpfile2))

	         	{

	         		alpha =(unsigned char)((pLVInternalData->nMouseOverBkColor >>24) &0xff);

        			twobmp[1].bmType |= BMP_TYPE_ALPHAVALUE;    //BMP_TYPE_ALPHACHANNEL;

        			twobmp[1].bmAlpha = alpha;

					ptwobmp[1] = &twobmp[1];

	  	        }

	

		  	    pbitmap = (DWORD)&ptwobmp;

  			}

	  		else if(dwStyle & ELVS_SPECIAL2STATE)//????

	  		{

	  			char * twotmpfile,*twostr1;  

	  			char twobmpfile1[MAX_PATH+1],twobmpfile2[MAX_PATH+1];

				

        		twotmpfile = (char *)(pLVInternalData->nItemBKImage);        	

        		twostr1 = rindex(twotmpfile,'/');

				

        		if(twostr1)

        		{

        			int rpath;

        			rpath = (int)(twostr1-twotmpfile)+1;

        			strncpy(twobmpfile1,twotmpfile,MAX_PATH);

        			twobmpfile1[rpath] = 0;

        			strncpy(twobmpfile2,twobmpfile1,MAX_PATH);

        		

        			strncat(twobmpfile1,"ov",MAX_PATH);

        			strncat(twobmpfile2,"st",MAX_PATH);

          			

          			strncat(twobmpfile1,twostr1+1,MAX_PATH);

          			strncat(twobmpfile2,twostr1+1,MAX_PATH);

          		}

          		else

          		{

          			strncpy(twobmpfile1,"ov",MAX_PATH);

          			strncpy(twobmpfile2,"st",MAX_PATH);

          		

          			strncat(twobmpfile1,twotmpfile,MAX_PATH);

          			strncat(twobmpfile2,twotmpfile,MAX_PATH);

          		}

	            		

		  		if(!LoadBitmap( HDC_SCREEN, &twobmp[0], twobmpfile1))

	        	{

	        		alpha =(unsigned char)((pLVInternalData->nMouseOverBkColor >>24) &0xff);

	        		twobmp[0].bmType 

⌨️ 快捷键说明

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