basic_string, string and wstring


Tip
The following codes illustrates how to navigate character by character in a wstring variable.
Los códigos siguientes ilustran como navegar letra por letra in una variable wstring.

Program.cpp
wstring info = L"Hola Ben";
//__________________________________ Method 1
size_t i;
const size_t len = info.size();
for (i = 0; i < len; i++)
{
     if (info[i] == ' ') break;
}
//__________________________________ Method 2
std::wstring::iterator p;
const std::wstring::iterator pend = info.end();
for (p = info.begin(); p != pend; p++)
{
     if (*p == ' ') break;
}


Parsing

As computers use text to store and send information, strings and string manipulation are very important. Parsing is the process of extracting values from a string.
Como las computadoras usan texto para almacenar y enviar información, las cadenas de texto y su manipulación son muy importantes. Parsing es el proceso de extraer valores desde una cadena de texto.

Portable Gray Map (PGM)

A PGM file is a format to store images using bitmaps (pixel by pixel information). The PGM file has only ASCII text. This format is oriented to ease image processing, because it is possible to represent a low resolution image using a matrix.
Una archivo PGM es un formato para guardar imágenes en mapa de bits (información a pixel por pixel). El archivo PGM contiene sólo texto en ASCII. Este formato está orientado para facilitar el procesamiento de imágenes, ya es posible tener una matriz representando la imagen principal con muy poca resolución.

PGM file

The format of this file is:
  1. A number describing the format (known as magic number), this value can be: P1 (black and white), P2 (gray levels), ... , P5
  2. A comment of one line that start with a #
  3. The image size: width followed of an space, the height and a line return
  4. The color resolution. Por instance for P2 there is a number that represents the maximum gray value (the minimum value is zero)
  5. A sequence of numeric values. The values go from zero to the maximum value. The number of values is equal to the product of the width by the height. The values can be organized in rows, but this is not a requirement. Each value must be separated by: a space, several spaces, one tab, several tabs, a line return

    El formato de estos archivos es:
  1. Un número describiendo el formato (conocido como número mágico) que puede tomar los valores de: P1 (negro y blanco), P2 (escala de grises), ..., P5
  2. Un comentario de una sola línea que comienza con el símbolo de #
  3. El tamaño de la imagen: el ancho seguido de un espacio, el alto y un retorno de carro
  4. Descripción de la resolución o profundidad de color. Por ejemplo para P2 se coloca un número que representa el máximo valor de gris (el mínimo valor es implícito y vale 0)
  5. Una secuencia de valores numéricos. Donde los valores van de 0 hasta el máximo valor. Y la cantidad de valores es igual al producto del ancho por el alto. Los valores pueden estar organizados en renglones, pero no es requerido. Se requiere que cada valor este separado por: espacio, espacios, tabulador, tabuladores, retorno de carro

Tip
Because computers work with UNICODE, it is necessary to convert the file text from ASCII (string) to UNICODE (wstring) using Sys::Convert::StringToWstring so that the computer can process the text. In the same way, to write a PGM file the generated text by the computer (UNICODE) must be converted to ASCII before storing the text in the file. To save and load text you may use: Sys::FileAssistant::TextLoad and Sys::FileAssistant::TextSave.
Debido a que las computadoras trabajan con UNICODE es necesario convertir el texto de este archivo de ASCII (string) a UNICODE (wstring) usando Sys::Convert::StringToWstring para que la computadora pueda procesar el archivo. De igual forma, para escribir un archivo PGM el texto generado por la computadora (UNICODE) se debe convertir a ASCII antes de ser almacenado en el archivo. Para guardas y cargar texto usted puede usar: Sys::FileAssistant::TextLoad and Sys::FileAssistant::TextSave.

pgmFile

Problem 1
Create a Wintempla Dialog Application called EditorPgm to create, open and save PGM files. Create a class called ImagenPgm to manipulage PGM images: create a new image, save a image to a file, load an existing image and edit an existing image. Insert a ScrollControl using Wintempla to visualize the image. The ImagenPgm class is responsible to draw the rectangle of the respective color in each cell of the ScrollControl.
Cree una aplicación de Diálogo de Wintempla llamada EditorPgm para crear, abrir y guardar archivos PGM. Crear la clase ImagenPgm para manipular imágenes PGM: crear una nueva, guardar en archivo, cargar desde un archivo y editar una imagen existente. Inserte un ScrollControl usando Wintempla para visualizar la imagen. La clase ImagenPgm es reponsable de dibujar el rectángulo del color respectivo en cada celda del ScrollControl.

EditorPgmRun

ImagenPgm.h
#pragma once
#define PGM_ST_INIT 0
#define PGM_ST_MAGIC_NUMBER 1
#define PGM_ST_COMMENT 2
#define PGM_ST_WIDTH 3
#define PGM_ST_HEIGHT 4
#define PGM_ST_MAXGRAY 5
#define PGM_ST_PIXELS 6

class ImagenPgm
{
public:
     ImagenPgm(void);
     ~ImagenPgm(void);
     bool CreateP2(int width, int height, int colorResolution, const wchar_t* comment);
     bool Save(const wchar_t* filename);
     wchar_t* Load(const wchar_t* filename);
     int GetWidth();
     int GetHeight();
     int GetPixel(int x, int y);
     bool SetPixel(int x, int y, int value);
     int GetColorResolution();
     void DrawPixel(CG::Gdi& gdi, int x, int y, RECT& rcCell);
private:
     inline bool IsSeparator(wchar_t c);
     inline bool IsDigit(wchar_t c);
     MATRIX pixel;
     int colorResolution;
     wstring comment;
     bool ExtractInt(wstring& text, int& position, int& out_int);
};

EditorPgm.h
#pragma once //______________________________________ EditorPgm.h
#include "resource.h"
#include "ImagenPgm.h"

class EditorPgm: public Win::Dialog
{
public:
     EditorPgm()
     {
     }
     ~EditorPgm()
     {
     }
     ImagenPgm imagenPgm;
protected:
     ...
};


EditorPgm.cpp
...

void EditorPgm::Window_Open(Win::Event& e)
{
     //________________________________________________________ scrollPgm
     scrollPgm.RowHeight = 4;
     scrollPgm.ColumnWidth = 4;
     scrollPgm.RefreshAll();
}

void EditorPgm::scrollPgm_RequestInfo(Win::Event& e)
{
     Win::ITable::Info& info = *((Win::ITable::Info*)(e.lParam));
     info.rowCount = imagenPgm.GetHeight();
     info.columnCount = imagenPgm.GetWidth();
}

void EditorPgm::scrollPgm_PaintCellsBegin(Win::Event& e)
{
     //Win::ITable::PaintEvent& pe = *((Win::ITable::PaintEvent*)(e.lParam));
     //CG::Gdi& gdi = *pe.gdi;
}

void EditorPgm::scrollPgm_PaintCell(Win::Event& e)
{
     Win::ITable::PaintEvent& pe = *((Win::ITable::PaintEvent*)(e.lParam));
     CG::Gdi& gdi = *pe.gdi;
     imagenPgm.DrawPixel(gdi, pe.col, pe.row, pe.cell);
}

void EditorPgm::scrollPgm_PaintCellsEnd(Win::Event& e)
{
     //Win::ITable::PaintEvent& pe = *((Win::ITable::PaintEvent*)(e.lParam));
     //CG::Gdi& gdi = *pe.gdi;
}


Tip
The following code illustrates how to reverse a string of text.
El código de abajo ilustra cómo invertir las letras de una cadena de texto.

Program.cpp
wstring a(L"Hello");
std::reverse(a.begin(), a.end());

© Copyright 2000-2021 Wintempla selo. All Rights Reserved. Jul 22 2021. Home