appclasses.cpp
上传用户:smh666999
上传日期:2007-01-14
资源大小:553k
文件大小:9k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #include "appclasses.h"
  2. #include "AEEStdLib.h"
  3. //--------------------------------------------------------------------------
  4. // Writer class constructor
  5. //--------------------------------------------------------------------------
  6. Writer::Writer(IShell* pIShell)
  7. {
  8.     int charHeight, pnAscent, pnDescent;
  9.     ISHELL_CreateInstance(pIShell, AEECLSID_DISPLAY, (void **)&m_pIDisplay);
  10.     // Determine the amount of available screen space
  11.     ISHELL_GetDeviceInfo(pIShell,&m_di);
  12.     // Determine the height of a line of text
  13.     charHeight = IDISPLAY_GetFontMetrics (m_pIDisplay, AEE_FONT_NORMAL,
  14.       &pnAscent, &pnDescent);
  15.     // Number of available lines equals the available screen
  16.     // space divided by the height of a line, minus 3 for the
  17.     // lines we always print at the top and bottom of the screen
  18.     m_cMaxLine = (m_di.cyScreen / charHeight) - 3;
  19.     m_cLineNum = 1;
  20.     IDISPLAY_EraseRgn(m_pIDisplay, 0, 0, m_di.cxScreen, m_di.cyScreen);
  21.     // WriteLine("Writer Constructor");
  22. }
  23. //--------------------------------------------------------------------------
  24. // Writer class desctuctor
  25. //--------------------------------------------------------------------------
  26. Writer::~Writer()
  27. {
  28.     // WriteLine("Writer Destructor");
  29.     IDISPLAY_Release(m_pIDisplay);
  30. }
  31. /*===========================================================================
  32. FUNCTION: Writer::WriteLine
  33. DESCRIPTION
  34.     This function displays lines of text on the screen, taking into account
  35. the number of text lines printed so far and the number of lines available
  36. for output.
  37.     If all available lines are exhausted, this function returns without doing
  38. anything.
  39.     If the last available line of the screen is reached, this function prints
  40. "..." to indicate that some lines may not have been printed due to lack
  41. of space.
  42.     Otherwise, this function prints the line on the screen by calling DisplayOutput,
  43. and updates the count of lines printed based on how many lines DisplayOutput
  44. used to print the text.
  45.  
  46.     
  47. PROTOTYPE:
  48.    static void WriteLine(char *pszStr)
  49. PARAMETERS:
  50.    pszStr:    [in]: The character string to be displayed on the screen.
  51. DEPENDENCIES
  52.   Assumes the m_cLineNum gets initialized to the starting line for text display
  53.   on the screen, and that m_cMaxLine contains the last available line for 
  54.   output on the screen.
  55. RETURN VALUE
  56.   None.
  57. SIDE EFFECTS
  58.   None
  59. ===========================================================================*/
  60. void Writer::WriteLine(const char *pszStr)
  61. {
  62.     char ellipsis[4];
  63.     STRCPY(ellipsis, "...");
  64. // If all available lines used, return
  65. if (m_cLineNum > m_cMaxLine)
  66. return;
  67. // If we've reached last available line, print an
  68. // ellipsis indicator
  69. if (m_cLineNum == m_cMaxLine)
  70. {
  71. DisplayOutput(m_cLineNum++, ellipsis);
  72.     return;
  73. }
  74. // There are lines available for printing.  Print the string passed as
  75. // input and update the count of lines available
  76.     m_cLineNum += DisplayOutput(m_cLineNum, pszStr);
  77.     IDISPLAY_UpdateEx(m_pIDisplay, TRUE);
  78. return;
  79. } // End of WriteLine
  80. void Writer::WriteLine(int i)
  81. {
  82. char ch[12];
  83. SPRINTF(ch, "%ld", i);
  84. WriteLine(ch);
  85. } //
  86. //--------------------------------------------------------------------------
  87. // Writer class operator <<
  88. //--------------------------------------------------------------------------
  89. //--------------------------------------------------------------------------
  90. // Writer class operator new
  91. //--------------------------------------------------------------------------
  92. /*===========================================================================
  93. FUNCTION: Writer::DisplayOutput
  94. DESCRIPTION
  95.     This function displays an output string at a given line number on the
  96.     screen. If the nline parameter is a negative value (-1) the string
  97.     is displayed in the middle of the screen. If the "nline" value is larger
  98.     than or equal to zero the "nline" value is multiplied by 15 and the 
  99.     resulting value in pixels is set to the y-coordinate of the start of 
  100.     the string display on the screen. If the string does not fit on one line
  101.     the string wraps around to the next line (spaced rougly 10-15 pixels apart).
  102.     By default 5 is used as the starting the x-coordinate of a displayed 
  103.     string.
  104.     How many characters that fit on one line is calculated for each line 
  105.     that is wrapped around to the next line.
  106.     Note: depending on the phone screen size and the fonts used for characters 
  107.           the output might differ on different handsets (devices). Where some 
  108.           handsets will have a smaller screen and large default fonts which will 
  109.           cause partial overlapping of lines. This function does not try to address
  110.           these issues (this is meant as a simple display function).
  111.     
  112. PROTOTYPE:
  113.    int DisplayOutput(int nline, char *pszStr)
  114. PARAMETERS:
  115.    nline:     [in]: Contains the line number to start displaying the text. The line
  116.         numbers are by default spaced 15 pixels apart along the y-axis.
  117.    pszStr:    [in]: The character string to be displayed on the screen.
  118. DEPENDENCIES
  119.   None
  120. RETURN VALUE
  121.   Number of lines written to the screen.
  122. SIDE EFFECTS
  123.   None
  124. ===========================================================================*/
  125. int Writer::DisplayOutput(int nline, const char *pszStr)
  126. {
  127.    AECHAR * szBuf;     // a buffer that supports 200 char string
  128.    AECHAR * psz = NULL;
  129.    int charHeight = 0;      // Stores the char height in pixels for given font
  130.    int pnAscent = 0;        // Stores the ascent in number of pixels
  131.    int pnDescent = 0;       // Stores the descent in number of pixels
  132.    int pixelWidth;
  133.    AEEFont font = AEE_FONT_NORMAL;
  134.    int pnFits = 0, dy;
  135.    int totalCh = 0;
  136.    int numLinesPrinted = 0;
  137.    // Make sure the pointers we'll be using are valid
  138.    if (m_pIDisplay == NULL)
  139.    return 0;
  140.    if ((szBuf = (AECHAR *) MALLOC(TEXT_BUFFER_SIZE)) == NULL)
  141.    return 0;
  142.    // Get the font metrics info
  143.    charHeight = IDISPLAY_GetFontMetrics (m_pIDisplay, AEE_FONT_NORMAL,
  144.       &pnAscent, &pnDescent);
  145.    // Convert to wide string (unicode)
  146.    STR_TO_WSTR ((char *)pszStr, szBuf, TEXT_BUFFER_SIZE);
  147.    // If nlines is zero then print this string starting around the middle of 
  148.    // the screen. Or else multiply nlines by charheight to decide the y coordinate of
  149.    // the start of the string.
  150.    if (nline < 0) {
  151.       dy = m_di.cyScreen*2/5;
  152.    }
  153.    else{
  154.       dy = nline * charHeight + 5;
  155.    }
  156.    // psz keeps track of the point from which to write from the string buffer
  157.    // in case the string does not fit one line and needs to wrap around in the
  158.    // next line.
  159.    psz = szBuf;
  160.       
  161.    // Need to calculate the lotal string length to decide if any wrapping
  162.    // around is needed.
  163.    totalCh = STRLEN ((char *)pszStr);
  164.    // Keep displaying text string on multiple lines if the string can't be displayed
  165.    // on one single line. Lines are spaced 15 pixels apart.
  166.    while ((totalCh > 0) && (*psz != NULL))
  167.    { 
  168.       // Get information on how many characters will fit in a line.
  169.       // Give the pointer to the buffer to be displayed, and the number of
  170.       // pixels along the x axis you want to display the string in (max number)
  171.       // pnFits will have the max number of chars that will fit in the maxWidth
  172.       // number of pixels (given string can't fit in one line), or the number of 
  173.       // chars in the string (if it does fit in one line). pnWidth gives the
  174.       // number of pixels that will be used to display pnFits number of chars.
  175.       pixelWidth = IDISPLAY_MeasureTextEx(m_pIDisplay,
  176.                       font, 
  177.                       (AECHAR *) psz,  // Start of the buffer to display,
  178.                       -1,
  179.                       m_di.cxScreen - 5, // maxWidth
  180.                       &pnFits);         // Number of chars that will fit a line
  181.       // If pnFits is zero there is something wrong in the input to above function. 
  182.       // Normally this scenario should not occur. But, have the check anyway.
  183.       if (pnFits == 0)
  184.   {
  185.  FREE(szBuf);
  186.          return 0;
  187.   }
  188.       IDISPLAY_DrawText(m_pIDisplay, AEE_FONT_NORMAL, psz, pnFits, 5 /*start dx*/, 
  189.          dy, 0 /* use default rectangle coordinates */, 0);
  190.       psz += pnFits;      // move pointer to the next segment to be displayed
  191.       totalCh -= pnFits;  // reduce the total number of characters to still display
  192.       dy += charHeight;   // Place next line charHeight pixels below the 
  193.                           // previous line.
  194.   ++numLinesPrinted;
  195.       IDISPLAY_Update(m_pIDisplay); //, TRUE);
  196.       if (totalCh < pnFits)
  197.          pnFits = totalCh;  // if total number is less than pnFits, adjust pnFits
  198.    }
  199.    FREE(szBuf);
  200.    return numLinesPrinted;   
  201. } // End of DisplayOutput