Subj : Using Prf* routines in window procs
To   : Vitus Jensen
From : Herbert Rosenau
Date : Sat Jun 03 2000 03:53 pm

Am 30.05.00 00:04 schrieb Vitus Jensen

VJ> Hej!

VJ> Does anybody know whether Prf* routines are usable from inside a
VJ> window proc? Do they block or violate the 1/10s rule in any other
VJ> way?

Use them when you need them!

VJ> Currently I'm using my own Profile routines which are working on
VJ> memory structures and dump the new contents to disk whenever
VJ> WM_SAVEAPPLICATION is called.  If PrfReadProfileData /
VJ> PrfWriteProfileData routines use the same scheme (i.e no file
VJ> access) it would double the memory requirements without need.

All Prf functions have ony one thing to do: read/write to given profile file.

General hints:

1. create you windows hidden!
  Means Let the frame window miss! the WS_VISIBLE
  But let all its childs have the WS_VISIBLE set!
2. fill in all data you have to fill
3. if all is done change the visible state!

During process:

Whenever you have al lot of work on your vsible window do the steps
1. WinSetWindowUpdate(hwnd, FALSE)
2. upate all of them - there is absolutly nothing drawn yet! (saves a lot of
time)
3. if all work done: WinSetWindowUpdate(hwnd, TRUE)
  does the real drawing - once one!
  OWNERDRAWing is done now!

Another trick for LISTBOX, COMBOBOX, CONTAINER:
Use always the style OWNERDRAW - and insert ONLY a (shorthand to text
converted) Pointer to the real data you would draw. This would save a lot of
memory inside PM - Nobody says that you have to fill the items with all real
data you have to show! But only GPI has to draw them right. And for that you
need a pointer or index inside the item that says YOU what data is to display.
Draw it by yourself. You can't insert any binary data into your Items - for
that you must convert them to anything that looks like text.

One of the tuning effects in sqed 2.0:

1. save a lot of memory by holding only a minimum bytes inside the listbox
  and not all data needed to draw
2. save a lot of time in
  - copying only a minimum bytes into listbox
  - compare indirectly - and not the whole data


/* Fuction P2X                                                             */
/*                                                                         */
/* Convert a (previous to string converted) pointer back to its binary     */
/* representation. See P2X() for details.                                  */
/*                                                                         */
/* Parameter:                                                              */
/*                                                                         */
/*           PCHAR p                pointer to external representation     */
/*                                  to a pointer.                          */
/*                                                                         */
/* Return:                                                                 */
/*                                                                         */
/*           PVOID                  the binary pointer                     */
/*                                                                         */
/*                                                                         */

PVOID X2P(PCHAR p) {
  ULONG u = 0;
  ULONG i;

  for (i = 0; i < (2 * sizeof(PVOID)); i++) {
     u <<= 4;                      /* make room for next digit            */
     u |= (*p++ & 0x0f);           /* only the lower digit of that byte   */
  } /* endfor */
  return (PVOID) u;                /* return as pointer to void           */
}

/* Fuction P2X                                                             */
/*                                                                         */
/* Convert a pointer to external format.                                   */
/* This isn't a real hex but seems so. This function is needed to convert  */
/* the binary pointer into a printable format. Because a PM control        */
/* (e.g. listbox) can't handle binary data and we will use often a simple  */
/* pointer to a data struct instead of real data - and then in ownerdraw   */
/* display the real data.                                                  */
/*                                                                         */
/* This is done to save a lot of memory.                                   */
/*                                                                         */
/* Parameter:                                                              */
/*                                                                         */
/*           PVOID   a              the pointer to convert                 */
/*           PCHAR   p              points to a buffer of 9 bytes.         */
/*                                  It's on caller to hold that buffer     */
/*                                  in size of 9 bytes or bigger.          */
/*                                                                         */
/* Return:                                                                 */
/*                                                                         */
/*           PCHAR                  a pointer to converted string          */
/*                                  The lower digits are the info we got   */
/*                                  This is identical with p.              */
/*                                  We'll return it to become a fuction    */
/*                                  ready as parameter for printf(),       */
/*                                  strcpy() or so.                        */
/*                                                                         */
PCHAR P2X(PVOID a, PCHAR p) {
  PCHAR v = a;                  /* treate the pointer as pointer to CHAR  */
  ULONG i;
  PCHAR p2 = p:

  for (i = 0; i < sizeof(PVOID); i++) {
     *p2++ = (*v >> 4) | 0x30;     /* high digit -> ASCII                 */
     *p2++ = (*v & 0x0f) | 0x30;   /* low digit -> ASCII                  */
  } /* endfor */
  *p2 = '\0';
  return(p);
}

/* Fuction AreaFillArea                                                    */
/*                                                                         */
/* Fill an Listbox with all areas                                          */
/*          only the pointer to AREA is stored, the draw action has        */
/*          to draw the real content.                                      */
/*                                                                         */
/* Parameter:                                                              */
/*                                                                         */
/*          HWND   hwnd             HWND of Window containing the listbox  */
/*          ULONG  id               ID of Listbox                          */
/*                                                                         */
/* return: -                                                               */
/*                                                                         */
VOID AreaFillArea(HWND hwnd, ULONG id) {
  HWND hwndLB = WinWindowFromID(hwnd, id);     /* get the listbox itself  */
  PAREA pArea = Areas->pNext;
  CHAR  areaName[9];

  WinEnableWindowUpdate(hwnd, FALSE);
  WinSendMsg(hwndLB, LM_DELETEALL, NULL, NULL);   /* make the LB empty    *T
*/
  for (; pNext; pNext = pNext->pNext) {
      WinSendMsg(hwndLB, LM_INSERTITEM, (MPARAM) LIT_END,
                                        (MPARAM) P2X(pNext, areaName));
  } /* endfor */
  WinEnableWindowUpdate(hwnd, TRUE);
}


/* Fuction AreaPaintLBItemName                                             */
/*                                                                         */
/* Paint an item of AREA listbox. The listbox itself contains only a       */
/* pointer to the area description. We have to get all info to paint from  */
/* the AREA member. Here we paint only the areaname.                       */
/*                                                                         */
/* See AreaPaintLBItem() for a more complex painting                       */
/*                                                                         */
/* Parameter:                                                              */
/*                                                                         */
/*           POWNERITEM poiItem     the item to draw                       */
/*                                                                         */
/* return: -                                                               */
/*                                                                         */

VOID AreaPaintLBItemName(POWNERITEM poiItem) {
  COLOR clrForeGround;
  COLOR clrBackGround;
  RECTL rcl;
  CHAR achpArea[9];
  PAREA pArea;

  GpiCreateLogColorTable(poiItem->hps, 0L, LCOLF_RGB, 0L, 0L, (PLONG) NULL);

  clrForeGround = GetPresParam(poiItem->hwnd,
         poiItem->fsState ? PP_HILITEFOREGROUNDCOLOR : PP_FOREGROUNDCOLOR,
                            poiItem->fsState ? PP_HILITEFOREGROUNDCOLORINDEX
                                             : PP_FOREGROUNDCOLORINDEX,
         poiItem->fsState ? SYSCLR_HILITEFOREGROUND : SYSCLR_OUTPUTTEXT);
  clrBackGround = GetPresParam(poiItem->hwnd,
         poiItem->fsState ? PP_HILITEBACKGROUNDCOLOR : PP_BACKGROUNDCOLOR,
                            poiItem->fsState ? PP_HILITEBACKGROUNDCOLORINDEX
                                             : PP_BACKGROUNDCOLORINDEX,
         poiItem->fsState ? SYSCLR_HILITEBACKGROUND : SYSCLR_ENTRYFIELD);

  rcl.xLeft = poiItem->rclItem.xLeft;
  rcl.xRight = poiItem->rclItem.xRight;
  rcl.yTop = poiItem->rclItem.yTop;
  rcl.yBottom = poiItem->rclItem.yBottom;

  /* which area is to draw? */
  WinQueryWindowText(poiItem->hwnd, sizeof(achpArea), achpArea);
  pArea = X2P(achpArea);  /* real pointer, please */
  WinDrawText(poiItem->hps, -1l, pArea->pszName, &rcl, clrForeGround,
              clrBackGround, DT_LEFT | DT_VCENTER | DT_ERASERECT);
  poiItem->fsState = poiItem->fsStateOld = FALSE;
}


--- Sqed/32 1.15/development  1089:
* Origin: Gegenden ohne Landschaft nennt man Staedte (2:2476/493)