На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Selecting a Line of Text



The example in this section is taken from a simple word-processing application. It includes code that enables the user to set the position of the caret by clicking anywhere on a line of text, and to select (highlight) a line of text by double-clicking anywhere on the line.

LRESULT APIENTRY MainWndProc(hwndMain, uMsg, wParam, lParam)
HWND hwndMain;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
HDC hdc; /* handle of device context */
TEXTMETRIC tm; /* font size data */
int i, j; /* loop counters */
int cCR = 0; /* count of carriage returns */
char ch; /* character from input buffer */

static int nBegLine; /* beginning of selected line */
static int nCurrentLine = 0; /* currently selected line */
static int nLastLine = 0; /* last text line */
static int nCaretPosX = 0; /* x-coordinate of caret */
static int cch = 0; /* number of characters entered */
static int nCharWidth = 0; /* exact width of a character */
static char szHilite[128]; /* text string to highlight */

static DWORD dwCharX; /* average width of characters */
static DWORD dwLineHeight; /* line height */
static POINTS ptsCursor; /* coordinates of mouse cursor */
static COLORREF crPrevText; /* previous text color */
static COLORREF crPrevBk; /* previous background color */
static PTCHAR pchInputBuf; /* address of input buffer */
static BOOL fTextSelected = FALSE; /* text-selection flag */



switch (uMsg) {
case WM_CREATE:

/* Get the metrics of the current font. */

hdc = GetDC(hwndMain);
GetTextMetrics(hdc, &tm);
ReleaseDC(hwndMain, hdc);

/* Save the average character width and height. */

dwCharX = tm.tmAveCharWidth;
dwLineHeight = tm.tmHeight;

/* Allocate a buffer to store keyboard input. */

pchInputBuf = (LPSTR) GlobalAlloc(GPTR,

BUFSIZE * sizeof(TCHAR));

return 0;

case WM_CHAR:
switch (wParam) {
case 0x08: /* backspace */
case 0x0A: /* linefeed */
case 0x1B: /* escape */
MessageBeep(0xFFFFFFFF);
return 0;

case 0x09: /* tab */

/* Convert tabs to four consecutive spaces. */

for (i = 0; i < 4; i++)

SendMessage(hwndMain, WM_CHAR, 0x20, 0);
return 0;

case 0x0D: /* carriage return */

/*
* Record the carriage return, and position the
* caret at the beginning of the new line.
*/

pchInputBuf[cch++] = 0x0D;
nCaretPosX = 0;
nCurrentLine += 1;
break;


default: /* displayable character */

ch = (char) wParam;
HideCaret(hwndMain);

/*
* Retrieve the character's width, and display the
* character.
*/

hdc = GetDC(hwndMain);
GetCharWidth32(hdc, (UINT) wParam, (UINT) wParam,
&nCharWidth);
TextOut(hdc, nCaretPosX,

nCurrentLine * dwLineHeight, &ch, 1);
ReleaseDC(hwndMain, hdc);

/* Store the character in the buffer. */

pchInputBuf[cch++] = ch;

/*
* Calculate the new horizontal position of
* the caret. If the new position exceeds the
* maximum, insert a carriage return and
* reposition the caret at the beginning of

* the next line.
*/

nCaretPosX += nCharWidth;
if ((DWORD) nCaretPosX > dwMaxCharX) {
nCaretPosX = 0;
pchInputBuf[cch++] = 0x0D;
++nCurrentLine;
}

ShowCaret(hwndMain);

break;
}
SetCaretPos(nCaretPosX, nCurrentLine * dwLineHeight);

nLastLine = max(nLastLine, nCurrentLine);
break;

.
. /* Process other messages. */
.

case WM_LBUTTONDOWN:

/*
* If a line of text is currently highlighted, redraw
* the text to remove the highlighting.
*/

if (fTextSelected) {
hdc = GetDC(hwndMain);
SetTextColor(hdc, crPrevText);
SetBkColor(hdc, crPrevBk);

TextOut(hdc, 0, nCurrentLine * dwLineHeight,
szHilite, lstrlen(szHilite));
ReleaseDC(hwndMain, hdc);
ShowCaret(hwndMain);
fTextSelected = FALSE;
}

/* Save the current mouse-cursor coordinates. */

ptsCursor = MAKEPOINTS(lParam);

/*
* Determine which line the cursor is on, and save
* the line number. Do not allow line numbers greater

* than the number of the last line of text. The
* line number is later multiplied by the average height
* of the current font. The result is used to set the
* y-coordinate of the caret.
*/

nCurrentLine = min((int)(ptsCursor.y / dwLineHeight),
nLastLine);

/*
* Parse the text input buffer to find the first
* character in the selected line of text. Each

* line ends with a carriage return, so it is possible
* to count the carriage returns to find the selected
* line.
*/

cCR = 0;
nBegLine = 0;
if (nCurrentLine != 0) {
for (i = 0; (i < cch) &&
(cCR < nCurrentLine); i++) {
if (pchInputBuf[i] == 0x0D)
++cCR;
}
nBegLine = i;

}

/*
* Starting at the beginning of the selected line,
* measure the width of each character, summing the
* width with each character measured. Stop when the
* sum is greater than the x-coordinate of the cursor.
* The sum is used to set the x-coordinate of the caret.
*/

hdc = GetDC(hwndMain);
nCaretPosX = 0;
for (i = nBegLine;

(pchInputBuf[i] != 0x0D) && (i < cch); i++) {
ch = pchInputBuf[i];
GetCharWidth32(hdc, (int) ch, (int) ch, &nCharWidth);
if ((nCaretPosX + nCharWidth) > ptsCursor.x)
break;
else
nCaretPosX += nCharWidth;
}
ReleaseDC(hwndMain, hdc);

/* Set the caret to the user-selected position. */

SetCaretPos(nCaretPosX, nCurrentLine * dwLineHeight);

break;

case WM_LBUTTONDBLCLK:

/* Copy the selected line of text to a buffer. */

for (i = nBegLine, j = 0; (pchInputBuf[i] != 0x0D) &&
(i < cch); i++)
szHilite[j++] = pchInputBuf[i];
szHilite[j] = '\0';

/*
* Hide the caret, invert the background and foreground
* colors, and then redraw the selected line.
*/


HideCaret(hwndMain);
hdc = GetDC(hwndMain);
crPrevText = SetTextColor(hdc, RGB(255, 255, 255));
crPrevBk = SetBkColor(hdc, RGB(0, 0, 0));
TextOut(hdc, 0, nCurrentLine * dwLineHeight, szHilite,
lstrlen(szHilite));
SetTextColor(hdc, crPrevText);
SetBkColor(hdc, crPrevBk);
ReleaseDC(hwndMain, hdc);

fTextSelected = TRUE;
break;

.
. /* Process other messages. */
.
default:
return DefWindowProc(hwndMain, uMsg, wParam, lParam);
}
return NULL;
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Выбор СТРОКИ текста



Пример в этой секции взят из простого текстового-обрабатывающего приложения. Это включает код, который позволяет потребителя, чтобы устанавливать позицию символа ^ щелкая везде в строке текста, и, чтобы выбираться (световой) строка текста двойным-щелчком везде на линии.

LRESULT APIENTRY MainWndProc(hwndMain, uMsg, wParam, lParam) HWND hwndMain;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
hdc HDC; /* ручка контекста устройства */ tm TEXTMETRIC; /* шрифтовые данные размера */ int я, j; /* счетчики цикла */ int cCR = 0; /* счет переводов строки */ символ ch; /* символ из входного буфера */

статический int nBegLine; /* начало выбранной строки */ статический int nCurrentLine = 0; /* к настоящему времени выбранная строка */ статический int nLastLine = 0; /* последняя текстовая строка */ статический int nCaretPosX = 0; /* x-coordinate символа ^ */ статический int cch = 0; /* количество символов входило */ статический int nCharWidth = 0; /* точная ширина символа */ статический символ szHilite[128]; /* текстовая строка, чтобы выделяться */

статический DWORD dwCharX; /* средняя ширина символов */ статический DWORD dwLineHeight; /* высота строки */ статический ptsCursor ТОЧЕК; /* координаты курсора мыши */ статический COLORREF crPrevText; /* предшествующий текстовый цвет */ статический COLORREF crPrevBk; /* предшествующий цвет фона */ статический PTCHAR pchInputBuf; /* адрес входного буфера */ статический BOOL fTextSelected = ЛОЖЬ; /* текстовый выбор флага */



ключ (uMsg) { случай WM_CREATE:

/* Получите метрику течения font. */

hdc = GetDC(hwndMain);
GetTextMetrics(hdc, &tm);
ReleaseDC(hwndMain, hdc);

/* Сохраните среднюю символьную ширину и height. */

dwCharX = tm.tmAveCharWidth;
dwLineHeight = tm.tmHeight;

/* Распределите буфер, чтобы загружать клавиатуру input. */

pchInputBuf = (LPSTR) GlobalAlloc(GPTR,

BUFSIZE * sizeof(TCHAR));

возврат 0;

случай WM_CHAR: ключ (wParam) { случай 0x08: /* возврат */ случай 0x0A: /* перевод строки */ случай 0x1B: /* переход */ MessageBeep(0xFFFFFFFF);
возврат 0;

случай 0x09: /* таб. */

/* Преобразовайте таб. в четыре последовательных spaces. */

для (i = 0; я < 4; я++)

SendMessage(hwndMain, WM_CHAR, 0x20, 0);
возврат 0;

случай 0x0D: /* перевод строки */

/*
* Запишите перевод строки и позиционируйте the
* символ ^ в начале новой строки.
*/

pchInputBuf[cch++] = 0x0D;
nCaretPosX = 0;
nCurrentLine += 1;
прерывание;


умолчание: /* воспроизводимый символ */

ch = (символ) wParam;
HideCaret(hwndMain);

/*
* Извлеките символьную ширину и отображайте the
* символ.
*/

hdc = GetDC(hwndMain);
GetCharWidth32(hdc, (UINT) wParam, (UINT) wParam, &nCharWidth);
TextOut(hdc, nCaretPosX,

nCurrentLine * dwLineHeight, &ch, 1);
ReleaseDC(hwndMain, hdc);

/* Загрузите символ в буфер. */

pchInputBuf[cch++] = ch;

/*
* Вычислите новую горизонтальную позицию
* символ ^. Если новая позиция превышает the
* максимум, включает перевод строки и
* reposition символ ^ в начале

* следующая строка.
*/

nCaretPosX += nCharWidth;
если ((DWORD) nCaretPosX > dwMaxCharX) { nCaretPosX = 0;
pchInputBuf[cch++] = 0x0D;
++nCurrentLine;
}

ShowCaret(hwndMain);

прерывание;
}
SetCaretPos(nCaretPosX, nCurrentLine * dwLineHeight);

nLastLine = max(nLastLine, nCurrentLine);
прерывание;

.
. /* Обработайте другой messages. */
.

случай WM_LBUTTONDOWN:

/*
* Если строка текста к настоящему времени выделена, перерисовывать
* текст, чтобы удалять выделять.
*/

если (fTextSelected) { hdc = GetDC(hwndMain);
SetTextColor(hdc, crPrevText);
SetBkColor(hdc, crPrevBk);

TextOut(hdc, 0, nCurrentLine * dwLineHeight, szHilite, lstrlen(szHilite));
ReleaseDC(hwndMain, hdc);
ShowCaret(hwndMain);
fTextSelected = ЛОЖЬ;
}

/* Сохраните текущую мышь-курсор coordinates. */

ptsCursor = MAKEPOINTS(lParam);

/*
* Определите какую строку, что курсор находится на, и сохраняемый
* линия номера. Не допускайте номера строки больше

* чем номер последней строки текста. The
* номер строки позже умножен на среднюю высоту
* текущего шрифта. Результат использован, чтобы устанавливать the
* y-coordinate символа ^.
*/

nCurrentLine = min((int)(ptsCursor.y / dwLineHeight), nLastLine);

/*
* Выполните грамматический разбор текстовый входной буфер, чтобы находить первый
* символ в выбранной строке текста. Каждый

* строка заканчивается с переводом строки, так что возможно
*, чтобы считать переводами строки, чтобы находить выбранный
* строка.
*/

cCR = 0;
nBegLine = 0;
если (nCurrentLine != 0) { для (i = 0; (я < cch) && (cCR < nCurrentLine); я++) { если (pchInputBuf[i] == 0x0D) ++cCR;
}
nBegLine = Я;

}

/*
* Запускаясь в начале выбранной строки,
* измерьте ширину каждого символа, суммирования .Jчемjтем
* ширина с каждым символом измерялась. Стоп когда the
* сумма больше, чем x-coordinate курсора.
* Сумма использована, чтобы устанавливать x-coordinate символа ^.
*/

hdc = GetDC(hwndMain);
nCaretPosX = 0;
для (i = nBegLine;

(pchInputBuf[i] != 0x0D) && (я < cch); я++) { ch = pchInputBuf[i];
GetCharWidth32(hdc, (int) ch, (int) ch, &nCharWidth);
если прерывание ((nCaretPosX + nCharWidth) > ptsCursor.x);
еще
nCaretPosX += nCharWidth;
}
ReleaseDC(hwndMain, hdc);

/* Установите символ ^ в выбранную позицию пользователя. */

SetCaretPos(nCaretPosX, nCurrentLine * dwLineHeight);

прерывание;

случай WM_LBUTTONDBLCLK:

/* Скопируйте выбранную строку текста в buffer. */

для (i = nBegLine, j = 0; (pchInputBuf[i] != 0x0D) && (я < cch); я++) szHilite[j++] = pchInputBuf[я];
szHilite[j] = '\0;

/*
* Спрячьте символ ^, инвертируйте фон и передний план
* цвета, затем перерисовывают выбранную строку.
*/


HideCaret(hwndMain);
hdc = GetDC(hwndMain);
crPrevText = SetTextColor(hdc, RGB(255, 255, 255));
crPrevBk = SetBkColor(hdc, RGB(0, 0, 0));
TextOut(hdc, 0, nCurrentLine * dwLineHeight, szHilite, lstrlen(szHilite));
SetTextColor(hdc, crPrevText);
SetBkColor(hdc, crPrevBk);
ReleaseDC(hwndMain, hdc);

fTextSelected = ИСТИНА;
прерывание;

.
. /* Обработайте другой messages. */
.
умолчание:
возвращайте DefWindowProc(hwndMain, uMsg, wParam, lParam);
}
возвращайте НЕДЕЙСТВИТЕЛЬНЫЙ;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz