[comp.os.os2.programmer] OWNERDRAW hItem/Changing control window's output

ie15@vaxb.acs.unt.edu (09/02/90)

Hey Adam,          
   List boxes do have settable fonts. So do most all PM controls now in 1.2
Using WinSetPresParams() you can tell a control to set his colors as well
as his font.

for example

HWND   hControl;
ULONG  color;
CHAR   font[20];

   hControl =WinWindowFromID( hwnd, LB_ITEMS);
   /* Assuming a window with a listbox with an ID of LB_ITEMS */
   strcpy( font, "12.Courier");
   WinSetPresParams( hC, PP_FONTNAMESIZE, sizeof( font), font);

   This is a cheap way to get the columns of a listbox to line up, but hey.
   
   color =CLR_YELLOW;
   WinSetPresParams( hC, PP_FOREGROUNDCOLORINDEX, sizeof( ULONG), &color);
   color =CLR_BLUE;  
   WinSetPresParams( hC, PP_BACKGROUNDCOLORINDEX, sizeof( ULONG), &color);

   This will change the listbox to do all its output in yellow on blue.
   Pretty useful. But remember, the user changed his system colors with the
   control panel. We should use these APIs with a clear head and proper
   judgement else we fall prey to congression regulators regulating our 
   user-interface code.
Ken Tabor
University of North Texas                                     

hill@evax.arl.utexas.edu (Col. Ames and Pixel) (09/03/90)

In article <33603.26e0f210@vaxb.acs.unt.edu> ie15@vaxb.acs.unt.edu writes:
>
>Hey Adam,          
>   List boxes do have settable fonts. So do most all PM controls now in 1.2
>Using WinSetPresParams() you can tell a control to set his colors as well
>as his font.
>
>for example
>
>HWND   hControl;
>ULONG  color;
>CHAR   font[20];
>
>   hControl =WinWindowFromID( hwnd, LB_ITEMS);
>   /* Assuming a window with a listbox with an ID of LB_ITEMS */
>   strcpy( font, "12.Courier");
>   WinSetPresParams( hC, PP_FONTNAMESIZE, sizeof( font), font);
>
>   This is a cheap way to get the columns of a listbox to line up, but hey.

    Yeah.... But I wouldn't wish Courier on my worst enemy :-) :-)

  Here is some of the code I used to do the ownerdraw.
Enjoy....

----------------- Begin Code -----------------

MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
     {
    // Lots of variable I probably dont need...
    // Where is my LINT???


       int sort;
       int currentslots;
       int i;

       SHORT	   sIndex;
       SHORT	   sFontHeight;
       SHORT	   sFontWidth;
       MRESULT	   mresFound;
       USHORT	   usFound;
       POINTL	   ptlTextStart;
       POINTL	   ptlTextOrig;
       USHORT	   idLB;
       POWNERITEM  poiLB;
       HPS	   hpsLB;


       static CHAR szBuffer[41];
       static CHAR szRBuffer[41];

       static CHAR szNumBuffer[3];

       static CHAR szNameBuffer[16];
       static CHAR szAMBuffer[9];
       static CHAR szGroupBuffer[4];
       static CHAR szSlotsBuffer[3];

       static CHAR szName[16];
       static CHAR szTemp[41];
       static CHAR szIt[] ="Hello";
       FONTMETRICS fm;

       pointer	   pptr;





     switch (msg)
	  {
	  case WM_DRAWITEM:
	     {

	       idLB   = (USHORT) SHORT1FROMMP(mp1);
	       poiLB  = (POWNERITEM) PVOIDFROMMP(mp2);



	       if (poiLB->fsState == poiLB->fsStateOld)

		/* Draw into the list box */

		  {

                    // Must clear a rectangle the HPS you get is for the 
                   // Whole LB

		    WinFillRect(poiLB->hps, &(poiLB->rclItem), CLR_BACKGROUND);


		    DrawProfItem (hwnd, poiLB, idLB);


		    return 1;
		  }
	       else if ( (poiLB->fsState == TRUE)
                      && (poiLB->fsStateOld == FALSE) )

		      /* Hilite Item */

		      {

			WinFillRect(poiLB->hps, &(poiLB->rclItem), CLR_BLACK);
			GpiSetColor(poiLB->hps, CLR_YELLOW);


			DrawProfItem (hwnd, poiLB, idLB);


			poiLB->fsState	  = FALSE;
			poiLB->fsStateOld = FALSE;

			return 1;
		      }

	       else if ( (poiLB->fsState == FALSE)
    		    && (poiLB->fsStateOld == TRUE) )

		     {

			/* UNHILITE */

			WinFillRect(poiLB->hps, &(poiLB->rclItem), 
				    CLR_BACKGROUND);

			DrawProfItem (hwnd, poiLB, idLB);



			poiLB->fsState	  = FALSE;
			poiLB->fsStateOld = FALSE;

			return 1;
		      }
	     }

	  case WM_INITDLG:

	    hpsLB = WinGetPS(hwnd);
	    EzfQueryFonts(hpsLB);


	    EzfCreateLogFont(hpsLB,DIALOG_FONT, FONTFACE_SYSTEM,
				     FONTSIZE_12, 0);

	    GpiSetCharSet(hpsLB, DIALOG_FONT);
	    GpiQueryFontMetrics(hpsLB, sizeof(FONTMETRICS), &fm);

	    sFontHeight = (SHORT)fm.lMaxBaselineExt;

	    // YOU MUST SET THIS or the system will try to 
           //  render into a randomly tall space

	    WinSendDlgItemMsg (hwnd,IDD_GENERAL, LM_SETITEMHEIGHT,
				MPFROMSHORT (sFontHeight),
				0L);
	    WinSendDlgItemMsg (hwnd,IDD_PROFCHOOSE, LM_SETITEMHEIGHT,
				MPFROMSHORT (sFontHeight),
				0L);

	    GpiSetCharSet(hpsLB, LCID_DEFAULT);
	    GpiDeleteSetId(hpsLB, DIALOG_FONT);
	    WinReleasePS(hpsLB);
			.
			.
            (Random message handling code)
			.
			.


MRESULT EXPENTRY DrawProfItem(HWND hwnd, POWNERITEM poiLB, USHORT idLB)

{



SHORT	    sIndex;
SHORT	    sFontWidth;
POINTL	    ptlTextStart;
POINTL	    ptlTextOrig;

HPS		hpsLB;


static CHAR szBuffer	 [41];
static CHAR szRBuffer	 [41];
static CHAR szNumBuffer  [3];

static CHAR szNameBuffer [16];
static CHAR szAMBuffer	 [9];
static CHAR szGroupBuffer[4];
static CHAR szSlotsBuffer[3];

static CHAR szName	 [16];
static CHAR szTemp	 [41];

FONTMETRICS fm;




    hpsLB = poiLB->hps;

// Massage the rectangle in OWNERITEM

    ptlTextStart.x = poiLB->rclItem.xLeft;
    ptlTextStart.y = poiLB->rclItem.yBottom + 4	;

    ptlTextOrig.x = ptlTextStart.x ;
    ptlTextOrig.y = ptlTextStart.y ;

// Do the FONT SHUFFLE

    EzfQueryFonts(hpsLB);

    EzfCreateLogFont(hpsLB,DIALOG_FONT, FONTFACE_SYSTEM,
				     FONTSIZE_12, 0);


    GpiSetCharSet(hpsLB, DIALOG_FONT);

    GpiQueryFontMetrics(hpsLB, sizeof(FONTMETRICS), &fm);

// Use 'M' width for a quantum of width

    sFontWidth	= (SHORT)fm.lEmInc;

// Send the LB LM_QUERY... to get the test you sent it in the WM_INITDLG
// Use the idItem in the OWNERITEM

    WinSendDlgItemMsg(hwnd, idLB,
		      LM_QUERYITEMTEXT,
		      MPFROM2SHORT(poiLB->idItem, sizeof (szRBuffer)),
		      MPFROMP (szRBuffer));

    sscanf (szRBuffer, "%s %s %s %s", szNameBuffer,  szAMBuffer,
	    szGroupBuffer, szSlotsBuffer);

// Put pieces of text where I want it

    GpiCharStringAt (hpsLB, &ptlTextStart,
		    (LONG)strlen (szNameBuffer),
		    (PSZ)szNameBuffer);

    ptlTextStart.x = ptlTextOrig.x + ( sFontWidth * 11);

    GpiCharStringAt (hpsLB,&ptlTextStart,
		    (LONG)strlen (szAMBuffer),
		    (PSZ)szAMBuffer);

    ptlTextStart.x = ptlTextOrig.x + ( sFontWidth * 15)+11;

                    ..... do this alot more


// Clean up the font and return it to System Default

    GpiSetCharSet(hpsLB, LCID_DEFAULT);
    GpiDeleteSetId(hpsLB, DIALOG_FONT);



}
_______________________ (end code) _________________
      
    And that is how I put text whereever I wanted to in a ListBox. Hope someone
gains some use from it out there.
 
-- 
 adam hill                                   Everybody lies about sex.     
 hill@evax.arl.utexas.edu    BOING!4Ever     Rub HER feet!
                                             It's better to copulate than never
 AmigaDos2.0 - A VW with $10,000 in options.         --Robert A. Heinlein