FAQ:WinAPI, VCPP Part 2 — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
(тег pre -> code , &, < ,&gt -> $, <, >)
Строка 6: Строка 6:
  
 
Без помощи визарда (Wizard) это можно сделать переопределением виртуальной функции OnCommand() :
 
Без помощи визарда (Wizard) это можно сделать переопределением виртуальной функции OnCommand() :
<syntaxhighlight>BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam)  
+
<syntaxhighlight>
 +
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam)  
 
{
 
{
WORD wMess=(wParam>>16);//командное сообщение
+
WORD wMess=(wParam>>16);//командное сообщение
int nID=(int)(wParam &0x0000ffff));//ID контрола
+
int nID=(int)(wParam &0x0000ffff));//ID контрола
HWND hW=(HWND)lParam;//хендл контрола
+
HWND hW=(HWND)lParam;//хендл контрола
+
//смотрим, какой контрол
+
//смотрим, какой контрол
switch(nID)
+
switch(nID)
{
+
{
  //кнопки
+
//кнопки
  case ID_BN1:
+
case ID_BN1:
  case ID_BN2:
+
case ID_BN2:
  case ID_BN3:
+
case ID_BN3:
  {
+
{
  //смотрим, какое сообщение
+
//смотрим, какое сообщение
  switch(wMess)
+
switch(wMess)
  {
+
{
    case BN_CLICKED:{ ... }break;
+
case BN_CLICKED:{ ... }break;
  }
+
}
  }
+
}
  break;
+
break;
+
  //едиты
+
//едиты
  case ID_ED1:
+
case ID_ED1:
  case ID_ED2:
+
case ID_ED2:
  case ID_ED3:
+
case ID_ED3:
  case ID_ED4:
+
case ID_ED4:
  {
+
{
  //смотрим, какое сообщение
+
//смотрим, какое сообщение
  switch(wMess)
+
switch(wMess)
  {
+
{
    case EN_CHANGE:{ ... }break;
+
case EN_CHANGE:{ ... }break;
    case EN_KILLFOCUS:{ ... }break;
+
case EN_KILLFOCUS:{ ... }break;
  }
+
}
  }
+
}
  break;
+
break;
}
+
}
+
return CDialog::OnCommand(wParam, lParam);
+
return CDialog::OnCommand(wParam, lParam);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
=== Когда запускаю программу, то все надписи на русском языке теряются - показываются вопросики. Что делать?  ===
 
  
Лечится так: непосредственно после создания проекта открываем дерево ресурсов и в свойствах каждого элемента дерева ставим язык Russian. Если этого не сделать сразу, то все русские буквы при компиляции ресурсов потеряются.  
+
=== Когда я запускаю программу, все надписи на русском языке теряются - показываются вопросики. Что делать?  ===
  
=== Как в проекте VC6 MFC получить путь, откуда запущен ЕХЕ?  ===
+
Лечится проблема так: непосредственно после создания проекта открываем дерево ресурсов и в свойствах каждого элемента дерева ставим язык Russian. Если этого не сделать сразу, то все русские буквы при компиляции ресурсов потеряются.
  
Использовать GetModuleFileName():  
+
=== Как в проекте VC6 MFC программно получить путь, откуда был запущен экзешник (исполняемый модуль) самой программы?  ===
<syntaxhighlight> TCHAR pszFileName[MAX_PATH];
+
 
pszFileName[0]=0;
+
Нужно использовать функцию GetModuleFileName():  
GetModuleFileName(NULL, pszFileName, MAX_PATH);
+
<syntaxhighlight>
CString stModulePath =  pszFileName;
+
TCHAR pszFileName[MAX_PATH];
//ищем первый слеш с конца и удаляем
+
pszFileName[0]=0;
//его вместе с именем файла EXE
+
GetModuleFileName(NULL, pszFileName, MAX_PATH);
int nEnd = stModulePath.ReverseFind('\\');
+
CString stModulePath =  pszFileName;
stModulePath.Delete(nEnd, stModulePath.GetLength()-nEnd);
+
//ищем первый слеш с конца и удаляем
+
//его вместе с именем файла EXE
//stModulePath - содержит путь
+
int nEnd = stModulePath.ReverseFind('\\');
 +
stModulePath.Delete(nEnd, stModulePath.GetLength()-nEnd);
 +
 
 +
//stModulePath - содержит путь
 
</syntaxhighlight>
 
</syntaxhighlight>
=== Как получить доступ к контролам на панели CReBar, принадлежащей классу MainFrame?  ===
+
 
<syntaxhighlight>#include "MainFrm.h"
+
=== Как получить доступ к элементам управления панели CReBar, принадлежащей классу MainFrame?  ===
+
 
 +
<syntaxhighlight>
 +
#include "MainFrm.h"
 +
 
 
//CMyApp - класс вашего приложения. theApp - глобальная переменная,
 
//CMyApp - класс вашего приложения. theApp - глобальная переменная,
 
//поэтому для доступа к ней используем extern
 
//поэтому для доступа к ней используем extern
Строка 74: Строка 80:
 
void CMyView::F()
 
void CMyView::F()
 
{
 
{
//Получаем главное окно приложения в любом месте программы
+
//Получаем главное окно приложения в любом месте программы
CMainFrame* pMainFrame=(CMainFrame*)(theApp.m_pMainWnd);
+
CMainFrame* pMainFrame=(CMainFrame*)(theApp.m_pMainWnd);
pMainFrame->m_wndDlgBar ....//Делаем что хотим
+
 
...
+
pMainFrame->m_wndDlgBar ....//Делаем что хотим
 +
...
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
=== Как загрузить и показать один из стандартных курсоров?  ===
 
=== Как загрузить и показать один из стандартных курсоров?  ===
<syntaxhighlight>HCURSOR hCursor;
+
 
 +
<syntaxhighlight>
 +
HCURSOR hCursor;
 
hCursor=AfxGetApp()->LoadStandardCursor(IDC_UPARROW);
 
hCursor=AfxGetApp()->LoadStandardCursor(IDC_UPARROW);
 
if(hCursor)SetCursor(hCursor);
 
if(hCursor)SetCursor(hCursor);
 
</syntaxhighlight>
 
</syntaxhighlight>
идентификаторы стандартных курсоров: IDC_ARROW IDC_IBEAM IDC_WAIT IDC_CROSS IDC_UPARROW IDC_SIZENWSE IDC_SIZENESW IDC_SIZEWE IDC_SIZENS IDC_SIZEALL  
+
идентификаторы стандартных курсоров:
 +
IDC_ARROW
 +
IDC_IBEAM
 +
IDC_WAIT
 +
IDC_CROSS
 +
IDC_UPARROW
 +
IDC_SIZENWSE
 +
IDC_SIZENESW
 +
IDC_SIZEWE
 +
IDC_SIZENS
 +
IDC_SIZEALL  
  
=== Как запретить пользователю закрыть программу нажатием на крестик?  ===
+
=== Как запретить пользователю закрыть программу нажатием на кнопку с крестиком?  ===
  
Нужно добавить обработчик сообщений WM_CLOSE - OnClose() - в главное окно программы. Для диалоговых приложений - это главный диалог, для одно- и много-документных - это CMainFrame.  
+
Для этого нужно добавить обработчик сообщения WM_CLOSE ( функция OnClose() в MFC) в главное окно программы. Для диалоговых приложений такое окно - это главный диалог, для одно- и много-документных приложений - это CMainFrame.  
<syntaxhighlight>void CMainFrame::OnClose()
+
<syntaxhighlight>
 +
void CMainFrame::OnClose()
 
{
 
{
if(......)
+
if(......)
{
+
{
  //не разрешаем закрыть
+
//не разрешаем закрыть
  return;
+
return;
}
+
}
+
CFrameWnd::OnClose();
+
CFrameWnd::OnClose();
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
=== Как создать на диалоге группу RadioButton-ов и как задать порядок их обхода клавишей Tab?  ===
 
  
Кладём на форму N контролов RadioButton. Затем у первого из группы ставим свойство Group, у остальных в группе - убираем это свойство. Порядок обхода (Tab Order) задаётся так: нажимаем Ctrl+D (загораются номера таб-порядка). Затем щёлкаем элементы в группе в таком порядке, который требуется.
+
=== Как создать на диалоге группу элементов "RadioButton" и как задать порядок их обхода клавишей Tab?  ===
  
=== Где лучше устанавливать начальные значения CComboBox?  ===
+
Последовательность действий следующая:
 +
1) кладём на форму нужное количество элементов RadioButton.
 +
2) у первого элемента из группы ставим свойство Group, у остальных в группе - убираем это свойство.
 +
3) порядок обхода (Tab Order) задаётся так: нажимаем Ctrl+D (загораются номера таб-порядка). Затем щёлкаем элементы в группе в таком порядке, который требуется.
  
1) В визарде (новая строка данных - Ctrl+Enter)
+
=== Где лучше устанавливать начальные значения элемента CComboBox?  ===
  
2) В функции OnInitDialog (для диалога) или OnInitialUpdate (для CView)  
+
Это можно сделать парой способов:
 +
 
 +
1) В редакторе форм - открыть свойства элемента CComboBox , "данные" (для ввода очередной строки данныхых нажать Ctrl+Enter)
 +
2) В функции OnInitDialog (в случае диалога) или в функции OnInitialUpdate (для CView)  
  
 
=== Как перевести RichEdit в режим замены символов?  ===
 
=== Как перевести RichEdit в режим замены символов?  ===
  
1) Программно, зная хендл контрола (hWnd):
+
Имеется несколько способов.
  
::PostMessage(hWnd,WM_KEYDOWN,VK_INSERT,1);
+
1) Программно, если известен хендл элемента (hWnd), это делается так:
 +
<syntaxhighlight>
 +
//помещаем в конец очереди сообющений контрола сообщение WM_KEYDOWN
 +
//с нужными параметрами
 +
::PostMessage(hWnd,WM_KEYDOWN,VK_INSERT,1);
 +
</syntaxhighlight>
  
2) Пользователь может нажать Insert.  
+
2) Пользователь во время работы может нажать клавишу Insert.
  
=== Как вызвать метод класса CMainFrame (главное окно) из любого места программы?  ===
+
=== Как вызвать метод главного окна (если используется класс CMainFrame) из любого места программы?  ===
  
AfxGetApp()->m_pMainWnd-> ...;
+
Это можно сделать так:
  
=== Как запретить появление полос прокруток на CFormView, когда пользователь делает размер главного окна меньше размера окна CFormView ?  ===
+
<syntaxhighlight>
 +
AfxGetApp()->m_pMainWnd-> ...;
 +
</syntaxhighlight>
  
методом SetScaleToFitSize():  
+
или так
<syntaxhighlight>void CMyView::OnInitialUpdate()
+
<syntaxhighlight>
 +
extern CMyAppXXX theApp;//здесь CMyAppXXX - название класса вашего приложения
 +
theApp.m_pMainWnd-> ...;
 +
</syntaxhighlight>
 +
 
 +
=== Как запретить появление полос прокруток на форме класса CFormView, когда пользователь делает размер главного окна меньше размера формы ?  ===
 +
 
 +
Это можно сделать методом SetScaleToFitSize():
 +
<syntaxhighlight>
 +
void CMyView::OnInitialUpdate()
 
{
 
{
CFormView::OnInitialUpdate();
+
CFormView::OnInitialUpdate();
/////////
+
 
GetParentFrame()->RecalcLayout();
+
//скрываем полосы прокрутки
ResizeParentToFit();
+
GetParentFrame()->RecalcLayout();
SIZE s={0,0};
+
ResizeParentToFit();//это уберёт полосы прокрутки со вьюхи
SetScaleToFitSize(s);
+
SIZE s={0,0};
/////////
+
SetScaleToFitSize(s);
...
+
//далее вызовется обработчик OnPaint(), о котором ниже
...
+
/////////
 +
...
 +
...
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
Также обратите внимание на одну особенность: в дебаг-версии программы вызов OnPaint после выполнения SetScaleToFitSize() с параметром s={0,0} происходит с ошибкой (программа при этом завершается).
 +
Обходится это так:
 +
<syntaxhighlight>
 +
void CMyView::OnPaint()
 +
{
 +
#ifdef _DEBUG
 +
CPaintDC dc(this);
 +
#else
 +
CFormView::OnPaint();
 +
#endif
 +
}
 +
</syntaxhighlight>
 +
 +
или даже вообще так:
 +
<syntaxhighlight>
 +
void CMyView::OnPaint()
 +
{
 +
CPaintDC dc(this);
 +
}
 +
</syntaxhighlight>
 +
 
=== Как нарисовать прямоугольник с вертикальным цветовым градиентом?  ===
 
=== Как нарисовать прямоугольник с вертикальным цветовым градиентом?  ===
  
pdc - указатель на контекст устройства pSize - указатель на структуру SIZE с размером прямоугольника dwdColor1, dwdColor2 - начальный и конечный цвет bySteps - количество шагов градиента (1...255)  
+
Нужно задасться граничными значениями цветов, затем равномерно нарисовать несколько прямоугольников постепенно меняющегося цвета. Количество прямоугольников (а, значит, плавность гралдиента) задаётся точностью.
<syntaxhighlight>//вертикальный градиент
+
Пример:
 +
<syntaxhighlight>
 +
//вертикальный градиент
 +
//pdc - указатель на контекст устройства
 +
//pSize - указатель на структуру
 +
//SIZE с размером прямоугольника
 +
// dwdColor1, dwdColor2 - начальный и конечный цвет
 +
//bySteps - количество шагов градиента (1...255)  
 
void sFillVertGradientRect(CDC* pdc,SIZE *pSize, COLORREF dwdColor1, COLORREF dwdColor2,BYTE bySteps)
 
void sFillVertGradientRect(CDC* pdc,SIZE *pSize, COLORREF dwdColor1, COLORREF dwdColor2,BYTE bySteps)
 
{
 
{
if(!bySteps)bySteps=1;
+
if(!bySteps)bySteps=1;
WORD i;
+
WORD i;
+
long W,H,x1,x2;
+
long W,H,x1,x2;
BYTE R1,G1,B1,R2,G2,B2;
+
BYTE R1,G1,B1,R2,G2,B2;
float dh,dR,dG,dB,y1,y2,Rc,Gc,Bc;
+
float dh,dR,dG,dB,y1,y2,Rc,Gc,Bc;
+
//ширина и высота
+
//ширина и высота
W=pSize->cx;
+
W=pSize->cx;
H=pSize->cy;
+
H=pSize->cy;
+
//раскладываем цвета на их составляющие
+
//раскладываем цвета на их составляющие
R1=(BYTE)((dwdColor1&0x000000ff));
+
//для удобства дальнейших вычислений
G1=(BYTE)((dwdColor1&0x0000ff00)>>8);
+
R1=(BYTE)((dwdColor1&0x000000ff));
B1=(BYTE)((dwdColor1&0x00ff0000)>>16);
+
G1=(BYTE)((dwdColor1&0x0000ff00)>>8);
R2=(BYTE)((dwdColor2&0x000000ff));
+
B1=(BYTE)((dwdColor1&0x00ff0000)>>16);
G2=(BYTE)((dwdColor2&0x0000ff00)>>8);
+
R2=(BYTE)((dwdColor2&0x000000ff));
B2=(BYTE)((dwdColor2&0x00ff0000)>>16);
+
G2=(BYTE)((dwdColor2&0x0000ff00)>>8);
+
B2=(BYTE)((dwdColor2&0x00ff0000)>>16);
//высота разноцветных прямоугольников
+
dh=((float)H)/((float)bySteps);
+
//высота разноцветных прямоугольников
//величина шагов составляющих цветов
+
dh=((float)H)/((float)bySteps);
dR=(((float)R2)-((float)R1))/((float)bySteps);
+
//величина шагов составляющих цветов
dG=(((float)G2)-((float)G1))/((float)bySteps);
+
dR=(((float)R2)-((float)R1))/((float)bySteps);
dB=(((float)B2)-((float)B1))/((float)bySteps);
+
dG=(((float)G2)-((float)G1))/((float)bySteps);
//выводим прямоугольники
+
dB=(((float)B2)-((float)B1))/((float)bySteps);
x1=0;x2=W;y1=0;y2=dh;
+
//выводим прямоугольники
Rc=R1;Gc=G1;Bc=B1;
+
x1=0;x2=W;y1=0;y2=dh;
for(i=0;i<bySteps;i++)
+
Rc=R1;Gc=G1;Bc=B1;
{
+
for(i=0;i<bySteps;i++)
  //текущий цвет
+
{
  pdc->FillSolidRect(x1,(int)y1,x2-x1,(int)(y2-y1),RGB((BYTE)Rc,(BYTE)Gc,(BYTE)Bc));
+
//текущий цвет
  //следующий цвет и координаты
+
pdc->FillSolidRect(x1,(int)y1,x2-x1,(int)(y2-y1),RGB((BYTE)Rc,(BYTE)Gc,(BYTE)Bc));
  y1+=dh;y2+=dh;
+
//следующий цвет и координаты
  Rc+=dR;Gc+=dG;Bc+=dB;
+
y1+=dh;y2+=dh;
}
+
Rc+=dR;Gc+=dG;Bc+=dB;
 +
}
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
пример вызова:  
 
пример вызова:  
<syntaxhighlight> SIZE Size={100,100};
+
<syntaxhighlight>
sFillGradientRect(&dc,&Size, RGB(200,0,0), RGB(0,200,0),10);
+
SIZE Size={100,100};
 +
sFillGradientRect(&dc,&Size, RGB(200,0,0), RGB(0,200,0),10);
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
=== Как под Windows отслеживать изменение файла?  ===
 
=== Как под Windows отслеживать изменение файла?  ===
  
Использовать функции:  
+
Нужно использовать функции:  
  
 
   FindFirstChangeNotification
 
   FindFirstChangeNotification
Строка 195: Строка 272:
 
   FindCloseChangeNotification
 
   FindCloseChangeNotification
  
=== Есть массив char[], как конвертировать его в CString?  ===
+
  (подробности - в MSDN)
<syntaxhighlight> char buf[]="text";
+
 
+
=== Как конвертировать массив char[] в CString?  ===
//строка должна обязательно заканчиваться нулём.
+
Это можно сделать методами самого класса CString:
+
<syntaxhighlight>
//конвертируем так
+
char buf[]="text";
CString txt(buf);
+
 
+
//строка должна обязательно заканчиваться нулём!!!
//или так
+
 
CString txt;
+
//конвертируем так
txt=buf;
+
CString txt(buf);
 +
 
 +
//или так
 +
CString txt;
 +
txt=buf;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
=== Как зарезервировать в CString буфер нужной длины?  ===
 
=== Как зарезервировать в CString буфер нужной длины?  ===
  
при помощи методов класса:  
+
Это можно сделать при помощи методов класса:  
  
   CString::GetBuffer
+
<syntaxhighlight>
 +
   CString::GetBuffer(...)
 +
</syntaxhighlight>
 
   и
 
   и
   CString::GetBufferSetLength
+
<syntaxhighlight>
 +
   CString::GetBufferSetLength(...)
 +
</syntaxhighlight>
  
Разница между CString::GetBuffer(nLen) и CString::GetBufferSetLength(nLen) в том, что первый возвращает строку не меньше заданной длины, а второй возвращает строку точно равную заданной длине. Обе могут перераспределять память если надо. В обычных случаях лучше GetBuffer.  
+
Разница между GetBuffer(nLen) и GetBufferSetLength(nLen) в том, что первый возвращает строку НЕ МЕНЬШЕ заданной длины, а второй возвращает строку точно равную заданной длине. Обе могут перераспределять память если надо. В обычных случаях лучше использовать GetBuffer.  
  
 
Если содержимое буфера менялось, то после этого нужно вызвать CString::ReleaseBuffer с указанием новой длины. Значение -1 в вызове CString::ReleaseBuffer означает, что длина строки будет вычислена автоматом (функцией strlen) в методе."-1" удобно использовать, если известно, что строка заканчивается нулем.  
 
Если содержимое буфера менялось, то после этого нужно вызвать CString::ReleaseBuffer с указанием новой длины. Значение -1 в вызове CString::ReleaseBuffer означает, что длина строки будет вычислена автоматом (функцией strlen) в методе."-1" удобно использовать, если известно, что строка заканчивается нулем.  
Строка 221: Строка 307:
 
=== Как передать больше одного параметр в процедуру потока?  ===
 
=== Как передать больше одного параметр в процедуру потока?  ===
  
Определить структуру с указателями на всё любое, например:  
+
Для этого нужно определить структуру со всеми параметрами (или указателями на них), которые нужно передать. А в процедуру потока передать лишь указатель на заполненную структуру.
<syntaxhighlight>struct mystr
+
Пример:
 +
<syntaxhighlight>
 +
struct mystr
 
{
 
{
CEdit* pEd;
+
CEdit* pEd;
CDialog* pDlg;
+
CDialog* pDlg;
DWORD* pdwd;
+
DWORD* pdwd;
int *pn;
+
int *pn;
 
};
 
};
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
запуск потока:  
 
запуск потока:  
<syntaxhighlight>mystr *pparam=new mystr;//экземпляр не должен быть временным!!!
+
 
 +
<syntaxhighlight>
 +
mystr *pparam=new mystr;//экземпляр не должен быть временным!!!
 +
 
 
memset(pparam,0,sizeof(*pparam));
 
memset(pparam,0,sizeof(*pparam));
 
pparam->pEd=...;
 
pparam->pEd=...;
Строка 237: Строка 329:
  
 
::AfxBeginThread(thread,pparam);  
 
::AfxBeginThread(thread,pparam);  
//тут экземпляр *(pparam) уже нельзя использовать!!!
+
//тут экземпляр *(pparam) уже нельзя использовать в нашем примере, так как
//он удалиться в потоке
+
//он у нас удалиля в процедуре потока
 
</syntaxhighlight>
 
</syntaxhighlight>
в потоке:  
+
 
<syntaxhighlight>//поток:  
+
процедура потока:  
 +
<syntaxhighlight>
 +
//поток:  
 
UINT threadLoader(LPVOID pParam)  
 
UINT threadLoader(LPVOID pParam)  
 
{  
 
{  
mystr data=*((mystr*)pParam);
+
//копируем данные из структуры в локальную структуру
delete ((mystr*)pParam);//подчищаем память
+
mystr data=*((mystr*)pParam);
 +
//освобождаем память временной структуры
 +
delete ((mystr*)pParam);
 +
pParam=0;
 +
  
...
+
...
data.pDlg->...;
+
data.pDlg->...;
(*data.pdwd)=...;
+
(*data.pdwd)=...;
...
+
...
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
=== Как убрать главное меню из CMainFrame?  ===
+
 
<syntaxhighlight>BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
+
=== Как убрать главное меню из окна CMainFrame?  ===
 +
Это можно сделать в виртуальной функции PreCreateWindow:
 +
<syntaxhighlight>
 +
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 
{
 
{
//обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow
+
//обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow
cs.hMenu = 0;
+
cs.hMenu = 0;
+
if(!CFrameWnd::PreCreateWindow(cs))
+
if(!CFrameWnd::PreCreateWindow(cs))
return FALSE;
+
return FALSE;
...
+
...
...
+
...
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
=== Как работающая программа может определить, что юзер завершает работу Windows?  ===
 
  
В этот момент всем процессам посылается сообщение WM_QUERYENDSESSION - его и нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.  
+
=== Как работающая программа может определить, что пользователь завершает работу Windows?  ===
 +
 
 +
Когда пользователь завершает работу Windows, всем процессам посылается сообщение WM_QUERYENDSESSION. Его нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.
  
 
=== Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?  ===
 
=== Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?  ===
  
Допустим, имеется диалог класса CMyDlg. Делаем подсказки для контролов. (для CStatic контролов не забудьте поставить свойство Notify)  
+
Допустим, имеется диалог класса CMyDlg. Делаем подсказки для элементов управления (для CStatic контролов не забудьте поставить свойство Notify) :
<syntaxhighlight>class CMyDlg:puplic CDialog
+
<syntaxhighlight>
 +
class CMyDlg:puplic CDialog
 
{
 
{
CToolTipCtrl m_ToolTip;//мембер класса CMyDlg
+
CToolTipCtrl m_ToolTip;//мембер класса CMyDlg
//
+
 
};
 
};
 
   
 
   
Строка 282: Строка 384:
 
struct{int ID;const char* pch;} m_a_Tips[]=
 
struct{int ID;const char* pch;} m_a_Tips[]=
 
{
 
{
{IDC_BUTTON1,"КЫнопка"},
+
{IDC_BUTTON1,"Кнопка"},
{IDC_STATIC1,"Текст"},
+
{IDC_STATIC1,"Текст"},
//
+
//
{0,0},//признак конца массива
+
{0,0},//признак конца массива
 
};
 
};
 
   
 
   
Строка 292: Строка 394:
 
BOOL CMyDlg::OnInitDialog()  
 
BOOL CMyDlg::OnInitDialog()  
 
{
 
{
CDialog::OnInitDialog();
+
CDialog::OnInitDialog();
//
+
 
//создаём
+
//создаём элемент TOOLTIP
m_ToolTip.Create(this);
+
m_ToolTip.Create(this);
//Привязка подсказок
+
 
for(int i=0; m_a_Tips[i].ID; i++)
+
//Привязка подсказок
{
+
for(int i=0; m_a_Tips[i].ID; i++)
  m_ToolTip.AddTool(
+
{
  GetDlgItem(m_a_Tips[i].ID),
+
m_ToolTip.AddTool(
  m_a_Tips[i].pch);
+
GetDlgItem(m_a_Tips[i].ID),
}
+
m_a_Tips[i].pch
+
);
//включаем показ подсказок
+
}
m_ToolTip.Activate(1);
+
...
+
//включаем показ подсказок
...
+
m_ToolTip.Activate(1);
 +
...
 +
...
 
}
 
}
 
   
 
   
Строка 315: Строка 419:
 
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)  
 
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)  
 
{
 
{
//транслируем
+
//транслируем
if(m_ToolTip.m_hWnd)m_ToolTip.RelayEvent(pMsg);
+
if(m_ToolTip.m_hWnd)m_ToolTip.RelayEvent(pMsg);
+
...
+
return CDialog::PreTranslateMessage(pMsg);
...
+
return CDialog::PreTranslateMessage(pMsg);
+
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
=== Как в отладчике VС просмотреть содержимое std::vector<string> V  ===
 
  
В режиме отладки открываем окно "Watch" (ALT+3) и вставляем выражения:  
+
=== Как в отладчике Visual С++ просмотреть содержимое std::vector<string> ?===
  
V._Myfirst - будет показан первый элемент V._Myfirst+1 - второй V._Myfirst+2 - и т.д.
+
Это можно сделать так. К примеру, имеется
 +
<syntaxhighlight>
 +
std::vector<string> V;
 +
</syntaxhighlight>
  
=== Я вывожу на контекст устройства текст. Как определить в пикселах ширину и высоту выведенных символов текста?  ===
+
режиме отладки открываем окно "Watch" (ALT+3) и вставляем выражения:
  
использовать процедуру API:  
+
V._Myfirst  (-  будет показан первый элемент V)
<syntaxhighlight>BOOL GetTextExtentPoint32(
+
V._Myfirst+1  (- второй элемент V,)
HDC hdc,// хендл контекста
+
 
LPCTSTR lpString,// выводимая строка
+
и т.д.
int cbString,// длина строки в символах
+
 
LPSIZE lpSize// указатель на структуру SIZE, куда  
+
=== Как при выводе текста на контекст устройства определить ширину и высоту выведенных символов текста в пикселах?  ===
    //будут помещены размеры
+
 
 +
Для этого нужно использовать процедуру API:  
 +
<syntaxhighlight>
 +
BOOL GetTextExtentPoint32(
 +
  HDC hdc,// хендл контекста
 +
  LPCTSTR lpString,// выводимая строка
 +
  int cbString,// длина строки в символах
 +
  LPSIZE lpSize// указатель на структуру SIZE, куда  
 +
  //будут помещены размеры
 
);
 
);
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
Функция вычисляет длину лишь одной символов, оканчивающейся нулём. Поэтому, чтобы вычислить "размер" многострочнокго текста, текст вначале необходимо разбить на строки, разделённые символами '\r' и '\n', и определить ширину и высоту каждой отдельно взятой строки.
 +
 
[[Category:FAQ]]
 
[[Category:FAQ]]

Версия 20:10, 8 октября 2008



Содержание

Как сделать обработчик сообщения для нескольких контролов (элементов управления) сразу?

Без помощи визарда (Wizard) это можно сделать переопределением виртуальной функции OnCommand() :

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam) 
{
	WORD wMess=(wParam>>16);//командное сообщение
	int nID=(int)(wParam &0x0000ffff));//ID контрола
	HWND hW=(HWND)lParam;//хендл контрола
	
	//смотрим, какой контрол
	switch(nID)
	{
		//кнопки
		case ID_BN1:
		case ID_BN2:
		case ID_BN3:
		{
			//смотрим, какое сообщение
			switch(wMess)
			{
				case BN_CLICKED:{ ... }break;
			}
		}
		break;
		
			//едиты
		case ID_ED1:
		case ID_ED2:
		case ID_ED3:
		case ID_ED4:
		{
			//смотрим, какое сообщение
			switch(wMess)
			{
				case EN_CHANGE:{ ... }break;
				case EN_KILLFOCUS:{ ... }break;
			}
		}
		break;
	}
	
	return CDialog::OnCommand(wParam, lParam);
}

Когда я запускаю программу, все надписи на русском языке теряются - показываются вопросики. Что делать?

Лечится проблема так: непосредственно после создания проекта открываем дерево ресурсов и в свойствах каждого элемента дерева ставим язык Russian. Если этого не сделать сразу, то все русские буквы при компиляции ресурсов потеряются.

Как в проекте VC6 MFC программно получить путь, откуда был запущен экзешник (исполняемый модуль) самой программы?

Нужно использовать функцию GetModuleFileName():

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


TCHAR pszFileName[MAX_PATH];
pszFileName[0]=0;
GetModuleFileName(NULL, pszFileName, MAX_PATH);
CString stModulePath =  pszFileName;
//ищем первый слеш с конца и удаляем
//его вместе с именем файла EXE
int nEnd = stModulePath.ReverseFind('\\');
stModulePath.Delete(nEnd, stModulePath.GetLength()-nEnd);

//stModulePath - содержит путь

Как получить доступ к элементам управления панели CReBar, принадлежащей классу MainFrame?

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


#include "MainFrm.h"

//CMyApp - класс вашего приложения. theApp - глобальная переменная,
//поэтому для доступа к ней используем extern
extern CMyApp theApp;

void CMyView::F()
{
	//Получаем главное окно приложения в любом месте программы
	CMainFrame* pMainFrame=(CMainFrame*)(theApp.m_pMainWnd);

	pMainFrame->m_wndDlgBar ....//Делаем что хотим
	...
}

Как загрузить и показать один из стандартных курсоров?

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


HCURSOR hCursor;
hCursor=AfxGetApp()->LoadStandardCursor(IDC_UPARROW);
if(hCursor)SetCursor(hCursor);

идентификаторы стандартных курсоров: IDC_ARROW IDC_IBEAM IDC_WAIT IDC_CROSS IDC_UPARROW IDC_SIZENWSE IDC_SIZENESW IDC_SIZEWE IDC_SIZENS IDC_SIZEALL

Как запретить пользователю закрыть программу нажатием на кнопку с крестиком?

Для этого нужно добавить обработчик сообщения WM_CLOSE ( функция OnClose() в MFC) в главное окно программы. Для диалоговых приложений такое окно - это главный диалог, для одно- и много-документных приложений - это CMainFrame.

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


void CMainFrame::OnClose()
{
	if(......)
	{
		//не разрешаем закрыть
		return;
	}
	
	CFrameWnd::OnClose();
}

Как создать на диалоге группу элементов "RadioButton" и как задать порядок их обхода клавишей Tab?

Последовательность действий следующая: 1) кладём на форму нужное количество элементов RadioButton. 2) у первого элемента из группы ставим свойство Group, у остальных в группе - убираем это свойство. 3) порядок обхода (Tab Order) задаётся так: нажимаем Ctrl+D (загораются номера таб-порядка). Затем щёлкаем элементы в группе в таком порядке, который требуется.

Где лучше устанавливать начальные значения элемента CComboBox?

Это можно сделать парой способов:

1) В редакторе форм - открыть свойства элемента CComboBox , "данные" (для ввода очередной строки данныхых нажать Ctrl+Enter) 2) В функции OnInitDialog (в случае диалога) или в функции OnInitialUpdate (для CView)

Как перевести RichEdit в режим замены символов?

Имеется несколько способов.

1) Программно, если известен хендл элемента (hWnd), это делается так:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


	//помещаем в конец очереди сообющений контрола сообщение WM_KEYDOWN
	//с нужными параметрами
	::PostMessage(hWnd,WM_KEYDOWN,VK_INSERT,1);

2) Пользователь во время работы может нажать клавишу Insert.

Как вызвать метод главного окна (если используется класс CMainFrame) из любого места программы?

Это можно сделать так:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


	AfxGetApp()->m_pMainWnd-> ...;

или так

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


	extern CMyAppXXX theApp;//здесь CMyAppXXX - название класса вашего приложения
	theApp.m_pMainWnd-> ...;

Как запретить появление полос прокруток на форме класса CFormView, когда пользователь делает размер главного окна меньше размера формы ?

Это можно сделать методом SetScaleToFitSize():

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


void CMyView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

	//скрываем полосы прокрутки
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();//это уберёт полосы прокрутки со вьюхи
	SIZE s={0,0};
	SetScaleToFitSize(s);
	//далее вызовется обработчик OnPaint(), о котором ниже
	/////////
	...
		...
}

Также обратите внимание на одну особенность: в дебаг-версии программы вызов OnPaint после выполнения SetScaleToFitSize() с параметром s={0,0} происходит с ошибкой (программа при этом завершается). Обходится это так:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


void CMyView::OnPaint() 
{
	#ifdef _DEBUG
		CPaintDC dc(this);
	#else
		CFormView::OnPaint();
	#endif
}

или даже вообще так:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


void CMyView::OnPaint() 
{
	CPaintDC dc(this);
}

Как нарисовать прямоугольник с вертикальным цветовым градиентом?

Нужно задасться граничными значениями цветов, затем равномерно нарисовать несколько прямоугольников постепенно меняющегося цвета. Количество прямоугольников (а, значит, плавность гралдиента) задаётся точностью. Пример:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


//вертикальный градиент
//pdc - указатель на контекст устройства
//pSize - указатель на структуру
//SIZE с размером прямоугольника
// dwdColor1, dwdColor2 - начальный и конечный цвет
//bySteps - количество шагов градиента (1...255) 
void sFillVertGradientRect(CDC* pdc,SIZE *pSize, COLORREF dwdColor1, COLORREF dwdColor2,BYTE bySteps)
{
	if(!bySteps)bySteps=1;
	WORD i;
	
	long W,H,x1,x2;
	BYTE R1,G1,B1,R2,G2,B2;
	float dh,dR,dG,dB,y1,y2,Rc,Gc,Bc;
	
	//ширина и высота
	W=pSize->cx;
	H=pSize->cy;
	
	//раскладываем цвета на их составляющие
	//для удобства дальнейших вычислений
	R1=(BYTE)((dwdColor1&0x000000ff));
	G1=(BYTE)((dwdColor1&0x0000ff00)>>8);
	B1=(BYTE)((dwdColor1&0x00ff0000)>>16);
	R2=(BYTE)((dwdColor2&0x000000ff));
	G2=(BYTE)((dwdColor2&0x0000ff00)>>8);
	B2=(BYTE)((dwdColor2&0x00ff0000)>>16);
	
	//высота разноцветных прямоугольников
	dh=((float)H)/((float)bySteps);
	//величина шагов составляющих цветов
	dR=(((float)R2)-((float)R1))/((float)bySteps);
	dG=(((float)G2)-((float)G1))/((float)bySteps);
	dB=(((float)B2)-((float)B1))/((float)bySteps);
	//выводим прямоугольники
	x1=0;x2=W;y1=0;y2=dh;
	Rc=R1;Gc=G1;Bc=B1;
	for(i=0;i<bySteps;i++)
	{
		//текущий цвет
		pdc->FillSolidRect(x1,(int)y1,x2-x1,(int)(y2-y1),RGB((BYTE)Rc,(BYTE)Gc,(BYTE)Bc));
		//следующий цвет и координаты
		y1+=dh;y2+=dh;
		Rc+=dR;Gc+=dG;Bc+=dB;
	}
}

пример вызова:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


SIZE Size={100,100};
sFillGradientRect(&dc,&Size, RGB(200,0,0), RGB(0,200,0),10);

Как под Windows отслеживать изменение файла?

Нужно использовать функции:

  FindFirstChangeNotification
  FindNextChangeNotification
  FindCloseChangeNotification
  (подробности - в MSDN)

Как конвертировать массив char[] в CString?

Это можно сделать методами самого класса CString:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


char buf[]="text";

//строка должна обязательно заканчиваться нулём!!!

//конвертируем так
CString txt(buf);

//или так
CString txt;
txt=buf;

Как зарезервировать в CString буфер нужной длины?

Это можно сделать при помощи методов класса:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


   CString::GetBuffer(...)
  и

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


   CString::GetBufferSetLength(...)

Разница между GetBuffer(nLen) и GetBufferSetLength(nLen) в том, что первый возвращает строку НЕ МЕНЬШЕ заданной длины, а второй возвращает строку точно равную заданной длине. Обе могут перераспределять память если надо. В обычных случаях лучше использовать GetBuffer.

Если содержимое буфера менялось, то после этого нужно вызвать CString::ReleaseBuffer с указанием новой длины. Значение -1 в вызове CString::ReleaseBuffer означает, что длина строки будет вычислена автоматом (функцией strlen) в методе."-1" удобно использовать, если известно, что строка заканчивается нулем.

Как передать больше одного параметр в процедуру потока?

Для этого нужно определить структуру со всеми параметрами (или указателями на них), которые нужно передать. А в процедуру потока передать лишь указатель на заполненную структуру. Пример:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


struct mystr
{
	CEdit* pEd;
	CDialog* pDlg;
	DWORD* pdwd;
	int *pn;
};

запуск потока:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


mystr *pparam=new mystr;//экземпляр не должен быть временным!!!

memset(pparam,0,sizeof(*pparam));
pparam->pEd=...;
pparam->pdwd=...;

::AfxBeginThread(thread,pparam); 
//тут экземпляр *(pparam) уже нельзя использовать в нашем примере, так как
//он у нас удалиля в процедуре потока

процедура потока:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


//поток: 
UINT threadLoader(LPVOID pParam) 
{ 
	//копируем данные из структуры в локальную структуру
	mystr data=*((mystr*)pParam);
	//освобождаем память временной структуры
	delete ((mystr*)pParam);
	pParam=0;
	

	...
	data.pDlg->...;
	(*data.pdwd)=...;
	...
}

Как убрать главное меню из окна CMainFrame?

Это можно сделать в виртуальной функции PreCreateWindow:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	//обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow
	cs.hMenu = 0;
	
	if(!CFrameWnd::PreCreateWindow(cs))
		return FALSE;
	...
	...
}

Как работающая программа может определить, что пользователь завершает работу Windows?

Когда пользователь завершает работу Windows, всем процессам посылается сообщение WM_QUERYENDSESSION. Его нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.

Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?

Допустим, имеется диалог класса CMyDlg. Делаем подсказки для элементов управления (для CStatic контролов не забудьте поставить свойство Notify) :

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


class CMyDlg:puplic CDialog
{
	CToolTipCtrl m_ToolTip;//мембер класса CMyDlg
};
 
//массив, в котором перечислены идентификаторы
//контролов и тексты подсказок к ним
struct{int ID;const char* pch;} m_a_Tips[]=
{
	{IDC_BUTTON1,"Кнопка"},
	{IDC_STATIC1,"Текст"},
	//
	{0,0},//признак конца массива
};
 
//в инициализации диалога (хотя, в принципе,
//можно и не тут) создаём и привязываем подсказки
BOOL CMyDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	//создаём элемент TOOLTIP
	m_ToolTip.Create(this);

	//Привязка подсказок
	for(int i=0; m_a_Tips[i].ID; i++)
	{
		m_ToolTip.AddTool(
			GetDlgItem(m_a_Tips[i].ID),
			m_a_Tips[i].pch
			);
	}
	
	//включаем показ подсказок
	m_ToolTip.Activate(1);
	...
	...
}
 
//для того, чтобы подсказки отображались как реакция на движение
//курсора мыши, транслируем получаемые окнами сообщения в
//виртуальной PreTranslateMessage()
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
{
	//транслируем
	if(m_ToolTip.m_hWnd)m_ToolTip.RelayEvent(pMsg);
	
	return CDialog::PreTranslateMessage(pMsg);
}

Как в отладчике Visual С++ просмотреть содержимое std::vector<string> ?

Это можно сделать так. К примеру, имеется

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


std::vector<string> V;

режиме отладки открываем окно "Watch" (ALT+3) и вставляем выражения:

V._Myfirst (- будет показан первый элемент V) V._Myfirst+1 (- второй элемент V,)

и т.д. 

Как при выводе текста на контекст устройства определить ширину и высоту выведенных символов текста в пикселах?

Для этого нужно использовать процедуру API:

Указан неподдерживаемый язык.

Вы должны указать язык следующим образом: <source lang="html4strict">...</source>

Поддерживаемые языки:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, aimms, algol68, apache, applescript, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, caddcl, cadlisp, cfdg, cfm, chaiscript, chapel, cil, clojure, cmake, cobol, coffeescript, cpp, csharp, css, cuesheet, d, dart, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, ezt, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, ispfpanel, j, java, java5, javascript, jcl, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nginx, nimrod, nsis, oberon2, objc, objeck, ocaml, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, pic16, pike, pixelbender, pli, plsql, postgresql, postscript, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, qml, racket, rails, rbs, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, rust, sas, scala, scheme, scilab, scl, sdlbasic, smalltalk, smarty, spark, sparql, sql, standardml, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vbscript, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xpp, yaml, z80, zxbasic


BOOL GetTextExtentPoint32(
	  HDC hdc,// хендл контекста
	  LPCTSTR lpString,// выводимая строка
	  int cbString,// длина строки в символах
	  LPSIZE lpSize// указатель на структуру SIZE, куда 
	  //будут помещены размеры
);

Функция вычисляет длину лишь одной символов, оканчивающейся нулём. Поэтому, чтобы вычислить "размер" многострочнокго текста, текст вначале необходимо разбить на строки, разделённые символами '\r' и '\n', и определить ширину и высоту каждой отдельно взятой строки.