|
|
| На центральну | Що нового | Що цікавого | Структура сайту... |
| ПРО ЦЕ... | Що тут нового | Що тут цікавого |
Загалом, на середину 2004-го року, я пропрацював з Microsoft Visual C++ 6.0 більше 5 років... Гм! Таки перевірив: почалася моя робота з дуже хорошої книжки "Visual C++ 6 та MFC" (російською мовою), а книжку датовано 2000-м роком. Хоча, з іншого боку, зараз я вже й не пригадаю, чи працював я з Visual C++ без MFC... Ну добре: нехай буде "більше 4-х років"! Але досвід який не який, а є...
CString при передачі параметрів аргументу char* лається. Слід писати const char*.
А як на те вже пішло, то непогано було б узагалі писати LPSTR і LPCSTR відповідно. А ще краще: LPTSTR и LPCTSTR! У чому різниця? Те, що з буквою "T" - це потенційні строки UNICODE. Не знаю як ви, а я вже звик усі строкові константи записувати у макросі _T()...
І взагалі, використання скрізь де прийдеться аргументів char* сильно збиваю з пантелику: незрозуміло, чи то вхідний аргумент функції, чи то буфер для результату. Особливо, якщо саму функцію писав не ти. Приведення "в лоб" (LPSTR) (LPCSTR) strSomeParam - спроба передачі CString як параметру char* - може призвести и скоріше за все призведе до помилки, якщо це як раз саме буфер для результату. От такі от проблеми інтеграції "гетеропрограммістського" початкового тексту (source code)... :)
Для програмного вибору радіокнопки використовуйте функцію
BOOL CheckRadioButton(
HWND hDlg, // handle to dialog box
int nIDFirstButton, // identifier of first radio button in group
int nIDLastButton, // identifier of last radio button in group
int nIDCheckButton // identifier of radio button to select
);
Якщо вам необхідно описати набір якихось значень, який буде використано для означення декількох станів будь-чого та передачі цього в діалог etc., використовуйте enum у невеличкому заголовочному файлі типу:
#if !defined(AFD_YOURVALNAME_H__INCLUDED_)
#define AFD_YOURVALNAME_H__INCLUDED_
enum eYourValName
{
VAL_UNDEFINE = 0,
VAL_FIRST = 1,
VAL_SECOND,
...
};
#endif // !defined(AFD_YOURVALNAME_H__INCLUDED_)
що дозволяє включати його коли буде потрібно та де буде потрібно, не хвилюючись про помилки переозначення, та використовувати єдині символічні імена на протязі усього проекту.
Доречі, AFD_... - це просто від назви моєї компанії. Так MS Visual C++ використовує на цьому місці AFX_... Дозволяє неявно трішечки так дещо підкреслити авторство.
Для отримання немодального діалогу можна додати вказівник (pointer) на необхідний клас в яке-небудь місце, наприклад клас "батьківського" (parent) вікна, та ініціалізувати його один раз. Це можна зробити або у конструкторі "батька", або в функції, яка призначена для відображення цього діалогу. Для відображення викликається функція Create(), котру для зручності роботи необхідно переpевизначити. Для повторних викликів діалогу Create викликати немає потреби, необхідно використовувати ShowWindow(SW_SHOW). Функція виклику цього діалогу може бути такою:
void CYourOwner::OnProjectSettings()
{
if(m_pDlg == NULL)
{
m_pDlg = new CProjectDlg;
m_pDlg->Create();
}else
m_pDlg->ShowWindow(SW_SHOW);
}
При цьому на весь час існування "батька" відкривається один діалог. Для кожного екземпляру "батька" (або хазяїна).
І не забудьте при цьому у деструкторі хазаїна знищити вказівник (pointer) на клас діалогу.
... delete m_pDlg; ...Ну взагалі-то напевне зручніше у конструкторі хазяїна ініціювати вказівник не NULL, а створювати діалог. Це дозволить здихатися постійної перевірки наявності відсутності відмінності вказівника (pointer) від NULL в усіх можливих місцях його використання.
Для коментарів "по тексту" у C та C++ варто використовувати варіант "//" - тоді буде можливість коментувати велики ділянки коду варіантом "/* */" і аж ніяк не турбуватися про те, що десь може зустрітися символ "*/", що призведе до порушення послідовності.
Геть недоречна зауваження "C та C++", позаяк коментарі у вигляді "//" використовуються тільки у C++, а "/* */" зазвичай називають "коментарі у стилі C".
|
|