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 <condefs.h> #include <windows.h> #include <tlhelp32.h> #include <string.h> #include <stdlib.h> 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
 

Hosted by uCoz