Q:
Как на Visual C++ 6.0 в Главном окне отключить системное меню
(в левом верхнем углу) и кнопки(в правом верхнем углу) ?
A:При создании окна нужно убрать стиль WS_SYSMENU
(теперь пользователь корректно может закрыть окно только Alt+F4 ,
ну или если вы предоставите ему дополнительную возможность сделать это )
Пример 1. (для SDI, MDI)
//этот обработчик уже добавлен визардом
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
///////////////////////////////
//добавленная часть
{
//убираем стиль
cs.style&=~WS_SYSMENU;
}
///////////////////////////////
return TRUE;
}
Пример 2. (для диалога)
Если диалог описан в ресурсах, то в свойствах диалога убрать галочки
"System menu"
"Minimize box"
"Maximize box"
Q:Хочу сделать так, чтобы пользователь не мог нажать на кнопку,
пока программа не разрешит.
A:Нужно применить метод класса CWnd::EnableWindow(...) для кнопки.
Значение параметра 0 делает кнопку неактивной, 1 - делает активной.
(кстати, не только для кнопки можно, а для любого класса, производного
от класса CWnd)
Пример 1. Пусть имеется некий диалог, на нём лежит кнопка c ID == IDC_1.
в любом месте кода диалога (кроме конструктора и деструктора , хотя, если
проверить наличие валидного хендла диалога, как в примере, то ничего
страшного не будет и там)
//делаем кнопку неактивной
if(m_hWnd)
{
CWnd* pw=0;
pw=GetDlgItem(IDC_1);
if(pw)pw->EnableWindow(0);
}
Q:Что означают сообщения, которые студия выводит при компиляции,
вроде таких :
Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found.
A:Это строка говорит о том, что студия не смогла найти отладочные
символы для WSOCK32.DLL. В этом нет ничего страшного, просто при наличии
отладочных символов в процессе отладки можно получить доступ к именам
функции из системных DLL. Например, вместо
KERNEL32! 0x77E8B184() -
увидим
KERNEL32!CreateThread.
Q:Как обработать сообщения , которое приходит к некому
контролу (скажем CEdit) ?
A:Нужно произвести от CEdit свой класс, и в виртуальной процедуре
класса WindowProc перехватить нужные сообщения.
virtual LRESULT WindowProc(
UINT message,
WPARAM wParam,
LPARAM lParam
);
Пример. Полностью выключаем, скажем, обработку сообщения WM_CHAR
LRESULT CMyEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CHAR:
{
return 0;
}
break;
}
return CEdit::WindowProc(message, wParam, lParam);
}
Чтобы связать экземпляр класса с контролом на форме, добавьте визардом для
контрола переменную класса (выбрав не Value а Control).
Q:Как настроить количество пробелов в табуляции?
A:Tools->Options->Tabs->Insert Spaces
(или правой кнопкой мыши по тексту-> properties)
Q:Как автоматически расставить отступы?
A: Выделить текст для форматирования, нажать Alt+F8
Есть ещё программа Artistic Style, которая занимается
переформатированием кода
http://sourceforge.net/projects/astyle/
Q:Поиск границ блока
A:"CTRL+ }" ищет парную фигурную скобку в тексте и переходит на неё
Q:Вертикальное выделение текста
A:"Alt + выделение мышкой" - позволяет выделять вертикальные фрагменты текста
Q:Как узнать количество установленных в CListCtrl столбцов ?
A:CListCtrl* pL=...; //указатель на переменную-контрол
int count=pL->GetHeaderCtrl()->GetItemCount();
Q:Как получить иконку приложения?
A:Если приложение запущено, то нужно найти его главное окно и
послать ему сообщение WM_GETICON.
//функция возвращант хендл иконки
LRESULT SendMessage(hWnd, WM_GETICON, wParam, 0);
//hWnd == хендл окна приложения
//wParam ==
// 1)==ICON_BIG - получить большую иконку
// 2)==ICON_SMALL - получить маленькую иконку
// 3)==ICON_SMALL2 - получить маленькую иконку, если она определена
// в приложении. Если её нет, то маленькую иконку,
// сгенерированную системой из большой иконки
Q:Как в CString можно найти или вырезать часть строки?
A:есть такие методы в CString :
//вырезает кусок строки
CString Mid(int nFirst) const;
CString Mid(int nFirst, int nCount) const;
//возвращает кусок строки (сначала или с конца)
CString Left(int nCount ) const;
CString Right(int nCount ) const;
//возвращает начальный кусок строки, в котором есть только
//символы из набора,представленного в lpszCharSet
CString SpanIncluding(LPCTSTR lpszCharSet ) const;
//возвращает начальный кусок строки, в котором нет
//символов из набора,представленного в lpszCharSet
CString SpanExcluding(LPCTSTR lpszCharSet ) const;
//убирает "пробелоподобные" символы из самого начала строки
//(то есть - пробел, табуляцию (\t) , возврат каретки, перевод строки (/r/n))
void TrimLeft();
//убирает все повторы символа из самого начала строки
void TrimLeft(TCHAR chTarget );
//убирает из самого начала строки все символа из набора lpszTargets
void TrimLeft(LPCTSTR lpszTargets );
void TrimRight();
void TrimRight(TCHAR chTarget );
void TrimRight(LPCTSTR lpszTargets );
//поиск в строке
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR pstr, int nStart ) const;
//поиск, начиная с конца
int ReverseFind( TCHAR ch ) const;
//поиск позиции первого символа, одного из набора,
// представленного в lpszCharSet
int FindOneOf( LPCTSTR lpszCharSet ) const;
Q:
Есть у меня CListBox и я в ходе выполнения программы добавляю
в него строки. Но я не могу посмотреть что именно добавляется.
Вывод результатов происходит в конце выполнения процедуры...
A:Если нужно делать принудительную перерисовку окна во время
длительных вычислений, то нужно вызывать для окна, которое
надо перерисовать метод
RedrawWindow()
с параметрами по умолчанию, или пару
Invalidate(0);
UpdateWindow();
Это приводит к пометке всего окна к перерисовке и отправлению
сообщения WM_PAINT в оконную процедуру в обход очереди
сообщений, вызывая немедленную перерисовку окна.
CWnd* pw=...;//окно , которое надо перерисовывать
for(int i=0;i<10000)
{
//меняется содержимое окна
//...
//немедленная перерисовка
pw->Invalidate(0);
pw->UpdateWindow();
}
Q:Я написал DLL , которую используют несколько приложений.
Всё вроде работает, но когда происходит очередной вызов функции
из DLL , почему то данные в функции обнуляются.
С чем это связано ?
A:Переменные и массивы в DLL, содержимое которых должно использоваться
несколькими процессами, должны объявляться статическими.
Статическая переменная или массив инициализируются только
один раз в момент загрузки DLL.
Пример:
DWORD calltest()
{
//будет выполнено только при первом вызове
static DWORD callcount=0;
static DWORD str[1000]={0};
//будет выполняться каждый раз
return ++callcount;
}
Q: Как открыть проекцию файла в память и как с ней работать?
A:Проекция файла в память (маппирование) создаётся процедурой API
HANDLE CreateFileMapping(
HANDLE hFile, //хендл уже открытого файла
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect, //способ открытия проекции
DWORD dwMaximumSizeHigh, //размер файла (старшие 4 байта , обычно==0)
DWORD dwMaximumSizeLow, //размер файла (младшие 4 байта)
LPCTSTR lpName
);
Доступ к созданной проекции производится процедурой
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, //хендл проекции
DWORD dwDesiredAccess, //способ работы с проекцией
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow, //смещение от начала файла (младшие 4 байта)
SIZE_T dwNumberOfBytesToMap //длина в байтах (если ==0 - то весь файл)
);
далее с файлом можно работать как с обычным массивом в памяти.
После работы с проекцией , её надо освободить процедурой
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress //адрес, который вернула процедура MapViewOfFile
);
Пример.
HANDLE hMapFile=0;//для проекции
HANDLE hFile=...;//хендл уже открытого файла
DWORD dwdFileLen=...;//размер открытого файла
//создаём проекцию "только для чтения"
hMapFile=::CreateFileMapping(hFile,0,PAGE_READONLY,0,dwdFileLen,0);
//хендл hFile можно закрыть уже здесь, в принципе,
//но мы сделаем это позже
//получаем доступ к проекции (тоже только для чтения)
BYTE* pbyFile=(BYTE*)::MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
///////////////////
//тут работаем с массивом pbyFile[dwdFileLen] как с обычным,
//только не забываем, что он открыт только для чтения
//...
//...
//...
///////////////////
//отключаем файл данных от адресного пространства
UnmapViewOfFile(pbyFile);
//освобождаем хендл проекции
CloseHandle(hMapFile)
//освобождаем хендл открытого файла
CloseHandle(hFile);