Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 45

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 39 40 41 42 43 44 < 45 > 46 47 48 49 50 51 .. 173 >> Следующая

в рабочей области Windows может отображаться только один курсор, и он должен отображаться внутри окна с текущим фокусом ввода, чтобы показать место вставки текста (фактически, приложению доступен только один курсор, даже если оно имеет несколько окон).
Для установки курсора необходимо модифицировать функции OnChar и OnEditClear. Добавьте операторы, выделенные полужирным шрифтом, в функцию OnChar:
void CEchoView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: здесь добавьте собственный код обработчика // и/или вызов стандартного обработчика
if (nChar < 32) {
::MessageBeep (МВ_ОК); // генерация стандартного звука
return;
}
CEchoDoc* PDoc = GetDocument(); PDoc->m_TextLine += nChar;
CClierltDC ClientDC (this);
ClientDC.SetTextColor (::GetSysColor (COLOR_WINDOWTEXT)); ClientDC.SetBkMode (TRANSPARENT); HideCaret ();
ClientDC.TextOut (0, 0, PDoc->m_TextLine); CSize Size = ClientDC.GetTextExtent
(PDoc->m_TextLine ,
PDoc->m_TextLine.GetLength ()); m_CaretPos.x = Size.cx; SetCaretPos (m_CaretPos) ; ShowCaret ();
CView::OnChar(nChar, nRepCnt, nFlags);
}
После вставки нового символа в конец строки добавленный код вызывает функцию GetTextExtent для определения новой длины строки, а затем — функцию SetCaretPos, чтобы переместить курсор в конец строки (в место вставки следующего символа).
Добавленный код вызывает функцию CWnd: :HideCaret, чтобы сделать курсор невидимым. После вывода текста и перемещения курсора он вызывает функцию CWnd: : ShowCaret, чтобы снова сделать курсор видимым. Это делается потому, что запись в окно при видимом курсоре может вызывать искажение экрана в позиции курсора. Обратите внимание: вы не должны скрывать курсор при рисовании функцией OnDraw, потому что Windows автоматически скрывает курсор до вызова этой функции и восстанавливает после возврата из нее. По той же причине не нужно скрывать курсор в функции OnPaint, которая рисует в окне, не являющемся окном представления. Поэтому функцию OnDraw не нужно изменять.
Совет
Вызовы функции HideCaret кумулятивные, т.е. при вызове функции HideCaret более одного раза без последующих вызовов функции ShowCaret будет необходимо столько же раз вызвать функцию ShowCaret, чтобы снова сделать курсор видимым.
Добавьте в конец функции OnEditClear два оператора.
void CEchoView::OnEditClear() {
// TODO: здесь добавьте собственный код обработчика
CEchoDoc* PDoc = GetDocument() ; PDoc->m__TextLine.Empty (); PDoc->UpdateAllViews (NULL); m_CaretPos.x = 0; SetCaretPos (m_CaretPos);
)
Добавленные операторы снова устанавливают курсор в левый край окна после удаления текста командой Clear из меню Edit.
В заключение откройте файл Echo.cpp и добавьте обычное обращение CWnd::SetWindowText в функцию Initlnstance.
// Единственное окно приложения отображается и обновляется mjpMainWnd->ShowWindow(SWJ3HOW) ; m_pMainWnd->UpdateWindow() ;
m_pMainWnd->SetWindowText ("Echo");
return TRUE;
)
Теперь программу Echo можно скомпилировать и выполнить. Ее текст приведен в листингах 18.9 — 18.16.
Текст программы TextDemo_
В листингах с 18.1 по 18.8 приведен исходный код программы TextDemo. Исходные файлы программы находятся в каталоге \TextDemo прилагаемого компакт-диска.
Листинг 18.1.
// TextDemo.h : главный файл заголовков приложения TEXTDEMO //
#if !defined
(AFX_TEXTDEMO_H_3E126285_A392_11D1_80FC_00C0F6A83B7F_INCLUDED J
#define AFX TEXTDEMO H 3E126285 A392 11D1 80FC 00C0F6A83B7F INCLUDED
#if _MSC_VER > 1000 #pragma once
#endif // _MSC_VER > 1000
#ifndef _AFXWIN_H_
#error include 'stdafx.h' before including this file for PCH #endif
iinclude "resource.h" // Основные символические константы
111111111111111111111111111111111111111111111111111111111111111111111 I/ Класс CTextDemoApp:
// реализация этого класса в файле TextDemo.cpp
//
class CTextDemoApp : public CWinApp {
public:
CTextDemoApp();
// Переопределения
// Переопределения виртуальных функций, сгенерированные
// мастером ClassWizard
//{{AFX_VIRTUAL(CTextDemoApp)
public:
virtual BOOL Initlnstance(); //)}AFX_VIRTUAL
// Реализация
//((AFX_MSG(CTextDemoApp) afx_msg void OnAppAbout();
// ПРИМЕЧАНИЕ - Мастер ClassWizard будет добавлять
// и удалять здесь функции-члены класса
// НЕ РЕДАКТИРУЙТЕ текст в этих блоках сгенерированного кода!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
);
11/111111111IIIIII111/1/II1111111IIII11IIIIIII111/1 III 111111111/11111 /1((AFX_INSERT_LOCATION}}
// Visual С++ вставит дополнительные объявления // сразу перед предыдущей строкой
#endif
// !defined(
// AFX TEXTDEMO H 3E126285 A392 11D1 80FC 00C0F6A83B7F INCLUDED )
Листинг 18.2.
// TextDemo.срр : Определяет работу класса приложения
//
finclude "stdafx.h" #include "TextDemo.h"
#include "MainFrm.h" finclude "TextDemoDoc.h" #include "TextDemoView.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = _FILE_;
#endif
П1111111111111/11/1111/111II1111111/111111111II1111/111III/II111 1I Класс CTextDemoApp
BEGIN_MESSAGE_MAP(CTextDemoApp, CWinApp)
Предыдущая << 1 .. 39 40 41 42 43 44 < 45 > 46 47 48 49 50 51 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100