Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Языки программирования С, С++

.pdf
Скачиваний:
136
Добавлен:
01.05.2014
Размер:
1.43 Mб
Скачать

Тонкости и хитрости в вопросах и ответах

rc.right — rc.left,rc.bottom — rc.top, 0);

}

}

Вот теперь все. Откомпилируйте проект и убедитесь, что все работает.

Как использовать CTreeCtrl для построения дерева каталогов диска, как в Проводнике? Неужели необходимо рекурсивно просмотреть диск, а потом прописать ручками все Итемы данного контрола??

Это тормозно и глючно. На больших дисках это займет несколько минут. Если каталоги добавляются или удаляются другими приложениями во время работы твоего контрола, то будешь весь в проблемах. Все гораздо проще. Никаких рекурсий.

Просматриваем корневой каталог на предмет наличия подкаталогов и создаем итемы первого уровня, в которых создаем по одному фиктивному итему (чтобы крестик был и итем можно было раскрыть).

+Каталог 1

+Каталог 2

+Каталог 3

Как только юзер пытается раскрыть итем, соответствующий некому каталогу, мы удаляем из него фиктивный итем, просматриваем этот подкаталог и добавляем соответствующие итемы со своими фиктивными внутри.

Каталог 1

+Каталог 4

+Каталог 5

+Каталог 6

+Каталог 2

+Каталог 3

Как только юзер закрывает итем, мы удаляем из него все дочерние итемы и обратно добавляем фиктивный. Если структура каталогов изменилась, для обновления юзеру достаточно просто закрыть и открыть соответствующую ветку.

Именно так и работает «Проводник».

Есть класс — потомок CListView. Как изменить стиль у объекта CListCtrl, принадлежащего к этому *view (например установить стиль Report)?

Для этого пишите в OnInitialUpdate вашего вида:

void CMyListView::OnInitialUpdate()

{

627

Тонкости и хитрости в вопросах и ответах

......

CListView::OnInitialUpdate();

CListCtrl& theCtrl = GetListCtrl();

DWORD dwStyle=GetWindowLong(theCtrl.m_hWnd,GWL_STYLE);

SetWindowLong(theCtrl.m_hWnd,GWL_STYLE,dwStyle|LVS_REPORT);

....

Гораздо проще перекрыть PreCreateWindow (лучше всего воспользоваться ClassWizard ом) и поковырять переданный по ссылке CREATESTRUCT типа такого:

BOOL CMyListView::PreCreateWindow(CREATESTRUCT& cs)

{

cs.style|=LVS_REPORT;//так мы добавляем стиль cs.style&=LVS_REPORT;//а вот так снимаем

return CMyListView::PreCreateWindow(cs);

}

Как CString привести к char *?

#include <atlbase.h> USES_CONVERSION;

CString strData(_T("Some Data"));

char* lpszString = T2A((LPTSTR)(LPCTSTR)strData);

или

CString tmp_str; char* st;

st=tmp_str.GetBuffer(tmp_str.GetLength())

важно то, что если с tmp_str что либо сделать, то необходимо опять получить указатель на внутренний буфер CString.

Какие библиотеки Freeware/Commercial существуют для Visual C++?

1.BCG Control Library (freeware)

2.CJLibrary (freeware)

Фирма Stringray Software производит библиотеки для Visual C++ (MFC, ATL):

1. Stingray Objective Toolkit (PRO) — набор различных компонентов для MFC и ATL.

628

Тонкости и хитрости в вопросах и ответах

2.Stingray Objective Grid (PRO) — мощная сетка данных с возможностями, близкими к Excel. Дружит с базами данных (через DAO,ADO,ODBC). Можно использовать для ввода данных

втаблицы БД и для вывода/печати простых отчётов.

3.Stingray Objective Chart — средство для построения диаграмм.

4.Stingray Objective Views — средство для создания

Visio подобных интерфейсов (при помощи векторной графики).

5. Stingray Objective Edit — текстовый редактор с подсветкой синтаксиса.

Кроме этих, есть и другие продукты.

Фирма Dundas Software производит библиотеки для Visual C++ (MFC):

1.Dundas Ultimate Toolbox — набор компонентов для MFC, по составу несколько отличающийся от Stingray Objective Toolkit.

2.Dundas Ultimate Grid — сетка данных, конкурент Stingray Objective Grid.

3.Dundas TCP/IP — реализация протоколов POP3, NEWS

ит.п.

4.Dundas Chart — диаграммы и другие продукты.

А можно пример консольной программы?

#include <windows.h> #include <stdlib.h>

void main()

{

HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT srct;

CHAR_INFO chiBuffer[160]; COORD coord1, coord2; char ddd[666];

CharToOem("2:5095/38 — злобный ламеpюга", ddd); DWORD cWritten;

coord1.Y = 0; coord1.X = 0;

hStdout = GetStdHandle(STD_OUTPUT_HANDLE); WriteConsoleOutputCharacter(hStdout, ddd, lstrlen(ddd),

coord1, cWritten);

629

Тонкости и хитрости в вопросах и ответах

for (int i = 0; i {

WORD wColors = 1 + i * 3; coord1.X = i;

WriteConsoleOutputAttribute(hStdout, , 1, coord1, cWritten);

}

srct.Top = 0; srct.Left = 0; srct.Bottom = 1; srct.Right = 79;

coord1.Y = 0; coord1.X = 0; coord2.Y = 1; coord2.X = 80;

ReadConsoleOutput(hStdout, chiBuffer, coord2, coord1, ); for (i = 0; i {

srct.Left = (SHORT)((double)(79 — lstrlen(ddd)) * rand() / RAND_MAX);

srct.Top = (SHORT)((double)25 * rand() / RAND_MAX); srct.Bottom = srct.Top + 1;

WriteConsoleOutput(hStdout, chiBuffer, coord2, coord1, );

}

Пытаюсь из своей программы вызвать Word97, для это делаю несколько импортов и в результате имею кучу ошибок. Как правильно?

// Office.h

#define Uses_MSO2000_

#ifdef

Uses_MSO2000

// for

Office 2000

#import

<mso9.dll>

#import

<vbe6ext.olb>

#import <msword9.olb> rename("ExitWindows","_ExitWindows") #import <excel9.olb> rename("DialogBox","_DialogBox") \ rename("RGB","_RGB") \

exclude("IFont","IPicture")

#import <dao360.dll> rename("EOF","EndOfFile") rename("BOF","BegOfFile")

#import <msacc9.olb>

#else

// for Office 97 #import <mso97.dll> #import <vbeext1.olb>

#import <msword8.olb> rename("ExitWindows","_ExitWindows") #import <excel8.olb> rename("DialogBox","_DialogBox") \

630

Тонкости и хитрости в вопросах и ответах

rename("RGB","_RGB") \ exclude("IFont","IPicture") #import <DAO350.DLL> \

rename("EOF","EndOfFile") rename("BOF","BegOfFile") #import <msacc8.olb>

#endif

Как отредактировать ресурсы .exe файла?

Это возможно лишь под NT.

Как программно получить номер билда своего приложения в VC++?

Штатной возможности нет, поскольку не все одинаково трактуют понятие «номер билда» и не все одинаково его используют. Однако большинство людей используют для хранения номера билда конкретного файла ресурсы типа VERSIONINFO, откуда эту информацию можно потом получить (для отображения в диалоге «О программе») с помощью функций из version.dll.

Упрощенно говоря, информация о версии файла хранится в VERSIONINFO в виде четырех чисел, значимость которых убывает слева направо. Например, для mfc42.dll из поставки Win2k версия файла выглядит как 6.0.8665.0. Здесь первая цифра совпадает с версией продукта (MSVC 6), вторая означает подверсию (MSVC 6.0), третья — номер билда. В своих dll ках и exe шниках Microsoft постоянно использует эту схему.

Обычно для автоматического увеличения номера версии используются макросы Visual Studio (== скрипты на VBScript), ковыряющие файл ресурсов проекта. Эти макросы либо связываются с кнопкой на тулбаре MSDev, либо вызываются из обработчика события Application_BeforeBuildStart в файле макросов. Исходник, реализующий номер билда, приведен ниже (должен работать на MSVC6SP3):

Sub IncVersion()

'DESCRIPTION: Increments file version Dim oDoc

Dim iVer

Set oDoc = Documents.Open (Application.ActiveProject &".rc", "Text")

if oDoc Is Nothing Then Exit Sub

631

Тонкости и хитрости в вопросах и ответах

End If

oDoc.Selection.FindText "FILEVERSION", dsMatchCase if Len(oDoc.Selection) = 0 Then

oDoc.Close dsSaveChangesNo Set oDoc = Nothing

Exit Sub End If

oDoc.Selection.EndOfLine oDoc.Selection.FindText ",", dsMatchBackward oDoc.Selection.CharLeft oDoc.Selection.WordLeft dsExtend

iVer = oDoc.Selection iVer = iVer + 1 oDoc.Selection = iVer

oDoc.Selection.FindText """FileVersion""", dsMatchCase if Len(oDoc.Selection) = 0 Then

oDoc.Close dsSaveChangesNo Set oDoc = Nothing

Exit Sub End If

oDoc.Selection.EndOfLine oDoc.Selection.FindText ",", dsMatchBackward oDoc.Selection.CharLeft oDoc.Selection.WordLeft dsExtend

iVer = oDoc.Selection iVer = iVer + 1 oDoc.Selection = iVer

oDoc.Close dsSaveChangesYes Set oDoc = Nothing

End Sub

Какой функцией можно переключить видеорежим?

Этим занимается ChangeDisplaySettings(...);

Вот пpимеp, котоpый yстанавливает pазpешение 640x480 (24 bit):

=== Cut ===

DEVMODE md;

632

Тонкости и хитрости в вопросах и ответах

ZeroMemory(&md, sizeof(md)); md.dmSize = sizeof(md);

md.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; md.dmBitsPerPel = 24;

md.dmPelsWidth = 640; md.dmPelsHeight = 480; ChangeDisplaySettings(&md, 0);

=== Cut ===

Как вызвать окно выбора папки?

Воспользуйтесь следующей функцией:

BOOL FGetDirectory(LPTSTR szDir) { BOOL fRet;

TCHAR szPath[MAX_PATH]; LPITEMIDLIST pidl; LPITEMIDLIST pidlRoot; LPMALLOC lpMalloc; BROWSEINFO bi =

{

NULL,

NULL,

szPath,

"Выберите папку", BIF_RETURNONLYFSDIRS, NULL,

0L,

0

};

if (0 != SHGetSpecialFolderLocation(HWND_DESKTOP, CSIDL_DRIVES, &pidlRoot))

return FALSE;

if (NULL == pidlRoot) return FALSE;

bi.pidlRoot = pidlRoot;

pidl = SHBrowseForFolder(&bi); if (NULL != pidl)

fRet = SHGetPathFromIDList(pidl, szDir); else

fRet = FALSE; // Get the shell's allocator to free

PIDLs

if (!SHGetMalloc(&lpMalloc) && (NULL != lpMalloc))

633

Тонкости и хитрости в вопросах и ответах

{

if (NULL != pidlRoot)

{

lpMalloc >Free(pidlRoot);

}

if (NULL != pidl)

{

lpMalloc >Free(pidl);

}

lpMalloc >Release();

}

return fRet;

}

LPTSTR PszAlloc(int cch)

{

return (LPTSTR) LocalAlloc(LMEM_FIXED, sizeof(TCHAR) * (cch+1));

}

bool PszDeAlloc(HLOCAL mem_ptr)

{

return (LocalFree(mem_ptr)==NULL) ? true : false;

}

Затем, при необходимости предложить пользователю выбрать папку используйте примерно такой код:

....

LPTSTR fname; fname=PszAlloc(250); FGetDirectory(fname);

......

PszDeAlloc((HLOCAL)fname);

634

Тонкости и хитрости в вопросах и ответах

Приложения

Средства для разработчиков

Каталог средств для разработчиков, программирующих на языках C/C++

http://www.progsource.com/ c_development.html

Inprise Borland C++

Узел, посвященный компилятору Inprise Borland C++. http://www.inprise.com/borlandcpp/

IBM VisualAge for C++

Узел, посвященный компилятору IBM VisualAge for C++. http://www.software.ibm.com/ad/ visualage_c++/

Inprise C++Builder

Узел, посвященный компилятору Inprise C++Builder. http://www.inprise.com/bcppbuilder/

Metrowerks CodeWarrior

Узел, посвященный CodeWarrior фирмы Metrowerks. http://www.metrowerks.com/

Powersoft Power++

Узел, посвященный компилятору Powersoft Power++ фирмы

Powersoft/Sybase.

http://www.sybase.com/products/powerpp/

Symantec C++

Узел, посвященный компилятору Symantec C++. http://www.symantec.com/scpp/index_product.html

635

Приложения

Watcom C/C++

Узел, посвященный компилятору Watcom C/C++ фирмы

Powersoft/Sybase.

http://www.sybase.com/products/languages/watccpl.html

MetaWare High C++

Узел, посвященный компилятору High C++ фирмы

MetaWare.

http://www.metaware.com/techno/ techno.html

Visual C++

Узел, посвященный компилятору Visual C++ фирмы

Microsoft.

http://msdn.microsoft.com/visualc/

Базовые алгоритмы на C++

Примеры реализации различных алгоритмов на языке C++.

http://people.we.mediaone.net/stanlipp/ generic.html

Ссылки на ресурсы по C++

Различные ссылки на ресурсы по C++.

http://www.enteract.com/~bradapp/links/ cplusplus links.html

Ссылки на ресурсы по C++

Множество ссылок на различные ресурсы по C++. http://webnz.com/robert/cpp_site.html

Ссылки на ресурсы по C++

Множество ссылок на различные ресурсы по C++. http://www.cs.bham.ac.uk/~jdm/cpp.html

Ссылки на ресурсы по C++

Множество ссылок на различные ресурсы по C++. http://www.kfa juelich.de/zam/cxx/extern.html

636