Programming: Visual C++ - FAQ по Visual C++
Часть 1
Как сделать так, чтобы при редактировании были видны комментарии для своих методов или переменных?
1. Надо отметить, если не отмечено, все опции флажками в Tools/Options/Statement completion options;
2. Оставлять комментарии перед объявлением, как например:
//Minimize to tray
//Надо ли минимизировать в System Tray
BOOL bTrayMin;
Как сделать так, чтобы показывалось только имя приложения?
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
cs.style &= ~(FWS_PREFIXTITLE|FWS_ADDTOTITLE);
return TRUE;
}
Как в консольной программе выводить цветные надписи и менять палитру?
=== Hачало CTEST.CPP ===
#include
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);
for (int i = 0; i < 50; 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, &srct);
}
Sleep(10000);
}
=== Конец CTEST.CPP ===
Как подгрузить Riched32.dll в InitInstance()?
BOOL CTestApp::InitInstance()
{
HMODULE hmod = LoadLibrary("Riched32.dll"); // Загружаем
if(hmod == NULL){
AfxMessageBox("RichEdit пахать не будет");
return false;
}
CTestDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal(); // в TestDlg нарисован RichEdit
FreeLibrary(hmod); // Выгружаем
return false;
}
Как программно определить тип файловой системы?
Используйте Win32 API - функцию GetVolumeInformation(...)
Как на VC5.0 создать окошко на full-screen?
BOOL CMyWnd::Create()
{
...
CRect rect(0, 0, GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
strClass - заpегистpиpованный оконный класс.
CreateEx(WS_EX_APPWINDOW, strClass, AfxGetAppName(), WS_SYSMENU | WS_POPUP |
WS_VISIBLE, 0, 0, rect.right, rect.bottom, NULL, NULL, 0);
...
}
или
hwnd=CreateWindowEx(0, "Name", "Title",
WS_POPUP|WS_SYSMENU, 0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
0, 0, hInstance, 0);
Как занести строку из CEdit'a в CListBox?
m_Edit.SetWindowText("aaa\r\nbbb\r\nccc");
// в Edit теперь три строки. Ловим первую
char buffer[100]; // Выделяем буфер
int count = m_Edit.GetLine(0, // индекс строки
buffer, // указатель на буфер
sizeof(buffer)); // размер буфера
// Если OK, то возвращает кол-во скопированных символов
buffer[count] = 0; // Скопированная строка не заканчивается \0
m_ListBox.AddString(buffer); // В данном случае "aaa"
или с помощью MFC:
CTreeCtrl *list = (CTreeCtrl*)GetDlgItem(IDC_TREE);
list->InsertItem( string, NULL, TVI_LAST );
Почему функция CreateProcess не запускает *.lnk-файлы?
Потому что она создает процессы только для запускаемых файлов. *.lnk-файлы не являются запускаемыми. Чтобы это сделать используйте ShellExecute.
Как поменять указатель мыши со стрелки на часики и обратно?
Используйте функции BeginWaitCursor() и EndWaitCursor(). Есть еще один (из многих) путь:
void CTest::MyBiiiiigFunc()
{
CWaitCursor wait;
for(int j=0; j<0x7ffffff; j++){ //...... Sleep(1000);
// И тут все время крутятся часики
}
}
// А вот тут их уже нет.
При создании объекта курсор заменяется на часики дефолтным конструктором. Деструктором - восстанавливается прежний.
Как заставить CHttpFile принудительно передавать файлы в бинарном виде?
По умолчанию незвестным типам файлов MFC присваивает тип text/plain. Чтобы принудительно установить бинарный режим передачи, укажите тип как application/x-ofc.
Как сграбить экран?
1. Клавиша Alt+Print Screen (не забывайте, что эффект распространяется только на текущее окно)
2. С помощью MFC это делается командами GetDC(GetDesktopWindow), затем BitBlt куда надо. RTFM: BitBlt, CreateCompatibleDC, CreateCompatibleBitmap:
hDc = GetDC(hWndScr);
hMemDc = CreateCompatibleDC(hDc);
hBmpNew = CreateCompatibleBitmap(hDc, 500, 500);
hBmpOld = SelectObject(hMemDc, hBmpNew);
BitBlt(hMemDc, 0, 0, 500, 500, hDc, 0, 0, SRCCOPY);
Как сделать надпись перевернутую на 90 градусов?
Все как обычно, только в структуре LOGFONT установить (только TrueType шрифты):
lfOrientation = lfEscapement =900 // угол, в десятых долях град.
Кстати, Escapement приводит к повороту строки на 90 градусов, а Orientation - каждой буквы.
lfClipPrecision = CLIP_LH_ANGLES; // не забудьте установить этот флаг
// (под NT можно без него, а под 95/98 - никак)
Как, например, сетевую карту "отключить в данной конфигурации" через Win32 API?
Мой компьютеp->Свойства->Устpойства->NetCard->Отключено в данной конфигypации, можно сделать программно:
Если в Win95
DiChangeState(lpdi, DICS_DISABLE, DICS_FLAG_CONFIGSPECIFIC);
// только yчтите, что setupx.dll 16-битовая
Если в Win98 или WinNT
SetupDiChangeState
Как сделать так, чтобы ресурсы dll были видны в пользующей его программе?
HGLOBAL LoadResource(
HMODULE hModule, // хэндл модуля, откуда гpузишь pесуpс
HRSRC hResInfo // идентификатоp pесуpса.);
То есть для того, чтобы загpузить pесуpсы из DLL, тебе надо загpузить DLL, а полученный хэндл использовать в LoadRecource
Как запустить текущего e-mail клиента?
ShellExecute(NULL,NULL,"mailto:any@mail.ru?subject=how",NULL,NULL,SW_SHOWNORMAL);
Как сделать, чтобы некотоpое пpиложение не показывалось в Task Bar, System Tray и в списке по Ctrl+Alt+Del?
/*apphider.cpp*/
/* Alexey Chubar & Paul Ishenin*/
#pragma hdrstop
#include
#include
#include
#include
#include
USELIB("KERNEL32.lib");
#pragma argsused
extern "C" __stdcall DWORD RegisterServiceProcess(DWORD dwProcessID, DWORD
dwType);
char * ExtractFilePath(const char *Name)
{
int i = strlen(Name), l = strlen(Name);
char *res="\0";
while ((i > 0)&&(Name[i] != '\\')) i--;
if (i)
{
res = (char *)malloc(l - i);
strcpy(res, Name + i + 1);
res[l-i-1] = '\0';
}
return res;
}
void HideApp(DWORD dwProcessID)
{
HWND MyHandle = GetTopWindow(0);
DWORD WindowProcess;
while (MyHandle != NULL)
{
if ((GetWindowThreadProcessId(MyHandle, &WindowProcess) != 0) &&
(WindowProcess == dwProcessID))
{
ShowWindow(MyHandle, SW_HIDE);
}
MyHandle = GetNextWindow(MyHandle, GW_HWNDNEXT);
}
RegisterServiceProcess(dwProcessID, 1);
}
DWORD __fastcall FindID(const char *FName)
{
HANDLE h;
PROCESSENTRY32 p;
h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
p.dwSize=sizeof(p);
if(!Process32First(h,&p))
return -1;
if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0)
{
CloseHandle(h);
return p.th32ProcessID;
}
while(Process32Next(h,&p))
if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0)
{
CloseHandle(h);
return p.th32ProcessID;
}
CloseHandle(h);
return -1;
}
int main(int argc, char* argv[])
{
if (argc > 1)
{
DWORD ProgID=FindID(argv[1]);
if(ProgID != (DWORD)-1)
HideApp(ProgID);
}
return 0;
}
или
_asm{
mov eax,1
push eax
dec eax
push eax
call dword ptr[pRegisterServiceProcess]
}
А теперь более подробно. Невидимость по Alt-Tab:
var WnHnd : Integer;
WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE);
WnHnd := WnHnd or WS_EX_TOOLWINDOW; {Типа Tools-окно}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);
Невидимость в Панели Задач:
ShowWindow[Async](Application.Handle,SW_HIDE)
Как я могy закpыть пpиложение, запyщенное по ShellExecute?
Как любое другое: получить HWND его окна; по этому HWND получить ID процесса и TerminateProcess() & WM_CLOSE для окна.
Как программно переключить раскладку клавиатуры?
Используйте функцию ActivateKeyboardLayout (...), которая позволяет установить язык для текущего потока.
Как программно сделать eject для CD-ROM'a, ZIP'a?
BOOL EjectDrive95(char *path)
{
HANDLE hDevice;
DWORD dw;
BOOL fResult;
DIOC_REGISTERS reg;
hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
FILE_FLAG_DELETE_ON_CLOSE, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return FALSE;
reg.reg_EAX = 0x440D;
reg.reg_EBX = toupper(path[0]) - 'A' + 1;
reg.reg_ECX = 0x0849;
fResult = DeviceIoControl(hDevice,
VWIN32_DIOC_DOS_IOCTL,®, sizeof(reg),
®, sizeof(reg), &dw, 0);
CloseHandle(hDevice);
return fResult;
}
BOOL EjectDriveNT(char *path)
{
HANDLE hDisk;
DWORD dwRc;
TCHAR tsz[8];
SECURITY_ATTRIBUTES sa;
wsprintf(tsz, TEXT("\\\\.\\%c:"), TEXT('@') + toupper(path[0]) - 'A' + 1);
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
hDisk = CreateFile(tsz, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,&sa,
OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
if (hDisk != INVALID_HANDLE_VALUE)
{
FlushFileBuffers(hDisk);
return DeviceIoControl
(hDisk, IOCTL_DISK_EJECT_MEDIA, NULL, 0, NULL, 0,&dwRc, NULL);
}
return FALSE;
}
Как убрать часы из SystemTray?
На время их можно убрать с помщью следующего кода:
hClockWnd=FindWindowEx(FindWindowEx(FindWindowEx(NULL,NULL,"Shell_TrayWnd",NULL),
NULL,"TrayNotifyWnd",NULL),NULL,"TrayClockWClass",NULL);
if(hClockWnd!=NULL)
ShowWindow(hClockWnd,SW_HIDE);
Как убрать кнопку с TaskBar'а?
С помощью Win32 API это можно сделать с помощью функции CreateWindowEx(), указав флаг WS_EX_TOOLWINDOW.
Как определить позицию курсора в консоли Win32?
CONSOLE_SCREEN_BUFFER_INFO bi;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi);
// bi.dwCursorPosition - кооpдинаты куpсоpа
Как очистить экран в консоли Win32?
Можно использовать функцию ScrollConsoleScreenBuffer или следующий код:
COORD c;
c.X = 0;
c.Y = 0;
CONSOLE_SCREEN_BUFFER_INFO bi;
DWORD written;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi);
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ',
bi.dwSize.X*bi.dwSize.Y, c, written);
FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED |
FOREGROUND_GREEN | FOREGRUND_BLUE /*цвет*/, bi.dwSize.X*bi.dwSize.Y, c,written);
Как сделать какие-то действия дождавшись завершения процесса?
1. Открывать файл для записи.
2. Выяснить hWnd запушенной программы и использовать функцию IsWindow(Handle:hWnd), которая определяет, существует ли он.
3. Взять hProcess, возвращаемый CreateProcess, и возпользоваться функцией WaitForSingleObject с hProcess в качестве параметра.
Как отследить нажата ли в текущий момент кнопка мыши с помощью API?
Смотрите GetKeyState(int nVirtKeyCode).
Коды левой, правой и средней кнопок мыши соотверственно:
VK_LBUTTON,VK_RBUTTON,VK_MBUTTON
или
GetAsyncKeyState(VK_LBUTTON) (соответственно, VK_RBUTTON и VK_MBUTTON).
Часть 2
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.
© 2005
|