Работа с текстови контроли.

Създаване на Windows GUI диалогово приложение, показващо информация за системата.

 



В това упражнение ще разгледаме спецификата на контролите за работа с текст в едно Windows приложение. Използвайки наученото, ще създадете програма, която дава информация за наличната и използваната памет на съответната система.


 

Контроли за работа с текст:

  1. Статичен текст (static text): в този контрол се изобразява текст с максимална дължина 255 символа. Когато искаме да зададем текста по време на проектиране на приложението, то текста се въвежда в полето 'Caption' в прозореца 'Properties'. Отново в този прозорец може да зададете различни настройки на изобразявания текст като вертикално/хоризонтално центриране, рамки и пр.
  2. Едноредово поле за текст (Edit box): в него може както да се извежда, така и да се въвежда текст от потребителя. В свойствата на този контрол могат да се зададат различни стилове, по полезни от които са: 'password' – показва въведените символи със звездички, 'uppercase'/'lowercase' – показва въведените символи само със главни/малки букви.
  3. Многоредово поле за текст (Rich Edit): Въпреки, че в настройките на Edit Box контола има опция за много редове, то по-естествения избор при необходимост от въвеждане на текст, който ще заеме повече от един ред е Rich Edit контрола. Характерно за него е, че има възможност да се зададе и вертикален скрол, когато изобразявания текст ще надхвърли размерите на полето.

Една от най-честите употреби на статичния текст е като етикет за EditBox. Можем да зададем мнемоничен символ в статичния текст, което ще позволи фокусиране на дадения EditBox чрез клавиатурата. Мнемоничният символ е символ, който натиснат в комбинация с Alt фокусира съответния контрол. Задаването на мнемоничен символ става като поставим знака амперсанд '&' пред символа, който желаем да бъде мнемоничен. Статичния текст не може да взаимодейства с потребителя, следователно той не може и да получава фокус. Така, ако асоциираме мнемоничен символ със статичен текст, то фокуса ще се прехвърли върху контрола следващ непосредствено.

Пример 1: Текстови контроли в диалогово базирано приложение:

  1. Създайте нов проект: File=>New=>Projects=>MFC AppWizard (exe) и задайте за име на проекта 'Edits'.
  2. Добавете следните контроли и ги подредете, така че да получите диалог подобен на следната фигура:

layout

Контролите са :

Действието, което ще изпълнява бутона Get Text е взимане на въведеното име в първия EditBox преобръщане на реда на буквите и изписването им обратно в контрола. За целта е необходимо да се асоциира променлива с IDC_EDIT_NAME. Стъпките са:

  1. Отваряме ClassWizard с десен клик върху диалога или с CTRL+W.
  2. Избираме таба Member Variables.
  3. В списъка Control Ids селектираме IDC_EDIT_NAME
  4. Натискаме бутона Add Variable.
  5. Задаваме: име – strName, категория – Value, тип – CString.
  6. Потвърждаваме с OK.

Обработването на събитието натискане на бутон Get Text ше се извършва от функцията OnGetText, която създаваме отново с помощта на ClassWizard : избираме таба Message Maps, селектираме IDC_GET_TEXT от списъка с контроли, а във списъка със събития (Messages) маркираме BN_CLICKED. Натискаме Add Function за да се създаде функцията, а чрез Edit Code се отваря редактора на код за новосъздадената функция.

Кода, който трябва да въведем в тялото й е следният:

// Взимане на въведения в EditBox-a текст и записването му в променливата strName:
UpdateData(TRUE);
// проверка дали е въведен текст:
if(strName.IsEmpty() == FALSE)
{
// преобръщане на буквите в низа:
strName.MakeReverse();
// изписване на стойността на strName в EditBox-а:
UpdateData(FALSE);

}

Събития свързани с EditBox контрол:

Събитията, наричани още съобщения (messages), които се прихващат от Windows за едно поле с текст са :

EN_CHANGE - изпраща се, когато текста в контрола е променен след като е показан.

EN_UPDATE - изпраща се, когато текста в контрола е променен преди да е показан.

EN_SETFOCUS - когато контрола получава фокус.

EN_KILLFOCUS - когато контрола губи фокус.

EN_MAXTEXT - когато текста надхвърля размера на полето и е бил отрязан.

EN_HSCROLL - когато е натисната хоризонталната скролираща лента (за многоредови полета).

EN_VSCROLL - когато е натисната вертикалната скролираща лента (за многоредови полета).

EN_ERRSPACE - изпраща се, когато не може да се задели памет за дадения контрол.

За показания по-горе пример 1, ще използваме съобщението EN_CHANGE, така че, когато потребителя въвежда текст във полето за Nick Name, този текст едновременно да се изписва и в съседното поле. За целта ще е необходимо да създадем функция, която да обработва съобщението EN_CHANGE за контрола IDC_EDIT_NICK. В тялото й добавяме следния код:

// взимаме указатели за всеки един от давата Edit Box-а:
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_NICK);
CEdit* pEditShow = (CEdit*)GetDlgItem(IDC_EDIT_SHOW);

// Дефинираме променлива, в която ще съхраняваме въведения текст:
CString strText;

// записваме текста от IDC_EDIT_NICK в променливата strText:
pEdit->GetWindowText(strText);

// показваме текста във контрола IDC_EDIT_SHOW:
pEditShow->SetWindowText(strText);