Borland C++ Builder FAQ

ОГЛАВЛЕНИЕ

Часто задаваемые вопросы по Borland C++ Builder.


Получение текущей даты и времени (VCL вариант)

// для получения текущей даты и  времени воспользуйтесь функцией
// Now() из модуля Sysutils.hpp . Отобразить полученные дату и
// время можно следующим образом (Button1 - кнопка на форме):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Caption = DateTimeToStr(Now());
}


Получение текущего времени (VCL вариант)

// для получения текущего времени воспользуйтесь функцией  Time()
// из модуля Sysutils.hpp . Отобразить полученную дату можно
// следующим образом (Button1 - кнопка на форме):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Caption = DateTimeToStr(Time());
}



Получение дня недели (VCL вариант)

// для получения дня недели воспользуйтесь функцией  DayOfWeek()
// из модуля Sysutils.hpp, передав ей текущую дату. DayOfWeek
// возвращает значение от 1 до 7, где 1 - воскресенье,
// 2 - понедельник, и т. д.
int Day = DayOfWeek(Date());



Часы на форме с точностью до минут

Напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption = FormatDateTime("hh:nn",Time());
Timer1->Interval=10000;// меньше число, больше точность
}



Часы на форме с точностью до долей секунд

Напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption=Time().FormatString("hh:mm:ss:zz");
Timer1->Interval=1;



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

// Напишите следующий код:
DWORD start=GetTickCount();
// тут ваша функция или как-либо действия
Edit1->Text=FloatToStr((GetTickCount()-start)/1000.);



Время в процессорных тактах

// Для того чтобы узнать время в процессорных тактах
// напишите следующую функцию:
#pragma warn -8070
__int64 Ticks()
{
asm .586
asm RDTSC
}
#pragma warn +8070

// вызов функции
__int64 i = Ticks();



Преобразование битового изображения из цветного в 256 градаций серого

// Преобразование осуществляется следующей функцией:
void SetBitmapPaletteToGreyScale(Graphics::TBitmap *pBitmap)
{
    LOGPALETTE *pal;
    HPALETTE hpal;
    int i;
    int PaletteSize; //Size of the palette buffer
    pBitmap->PixelFormat = pf8bit;
    pal = NULL;
    PaletteSize = sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 255);
    pal = (LOGPALETTE *) malloc(PaletteSize);
    pal->palVersion = 0x300;
    pal->palNumEntries = 256;
    for (i = 0 ; i <= 255; i++)
    {
      pal->palPalEntry[i].peRed = i;
      pal->palPalEntry[i].peGreen = i;
      pal->palPalEntry[i].peBlue = i;
      pal->palPalEntry[i].peFlags = PC_NOCOLLAPSE;
    }
    hpal = CreatePalette(pal);
    if(hpal != 0) pBitmap->Palette = hpal;
    free(pal);
}



Как пpоигpать MIDI без MediaPlayer-а

// Для того чтобы проиграть MIDI:
#include <mmsystem.h>

mciSendString("open anny.mid type sequencer alias MUSIC", NULL, 0, 0);
mciSendString("play MUSIC from 0", NULL, 0, 0);



Как воспроизвести звуковой файл без MediaPlayer-а

// Для того чтобы воспроизвести  звуковой файл:
// напишите следующий код
#include "mmsystem.h"
DWORD fdwSound = SND_ASYNC | SND_FILENAME;
PlaySound("C:\\click.wav",NULL, fdwSound);



Как рисунок TBitmap сделать монохромным?

// напишите следующий код
BMP.Monochrome = true ; //где BMP - TBitmap



Получение метки диска

// Для получения метки диска напишите следующий код:
char DiskLabel[MAX_PATH];
char *DiskName = "c:\\"; // имя диска
GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0);
// в DiskLabel находится метка диска



Определение размера диска (VCL вариант)

// Для определения размера диска используйте функцию DiskSize,  объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску  В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в  байтах.
__int64 Size = DiskSize(3);



Определение свободного пространства на диске (VCL вариант)

// Для определения свободного  пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp.  В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий  диск. Следующий код определит размер свободного пространства на диске С в  байтах.
__int64 FreeSpace = DiskFree(3);



Создание ярлыка

// для  использования функции необходимо подключить файл
// shlobj.h
//  lpszPathObj - путь к объекту, для которого будет
// создаваться ярлык
//  lpszPathLink - где будет создаватья ярлык
// lpszDesc - описание  ярлыка
HRESULT CreateLink(LPCSTR lpszPathObj, LPSTR  lpszPathLink, LPSTR lpszDesc)
{
    HRESULT hres;
    IShellLink  *psl;
    CoInitialize(NULL);
    hres =  CoCreateInstance(CLSID_ShellLink, NULL,
    CLSCTX_INPROC_SERVER,  IID_IShellLink, (void  **)&psl);
    if(SUCCEEDED(hres))
    {
        IPersistFile  *ppf;
        psl->SetPath(lpszPathObj);
        psl->SetDescription(lpszDesc);
        hres  = psl->QueryInterface(IID_IPersistFile,  (void**)&ppf);
        if(SUCCEEDED(hres))
        {
            wchar_t  wsz[MAX_PATH];
            MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz,  MAX_PATH);
            hres = ppf->Save(wsz,  true);
            ppf->Release();
        }
        psl->Release();
        CoUninitialize();
    }
    return  hres;
}



Удаление файла в корзину (VCL вариант)

// разместите компонент TOpenDialog (OpenDialog1) и TButton  (Button1) на форме (Form1). Для удаления файла в корзину напишите следующий  код:
void __fastcall TForm1::Button1Click(TObject  *Sender)
{
    if(OpenDialog1->Execute())
    {
        AnsiString  DialogTitle = "Удаление в корзину";
        SHFILEOPSTRUCT  FileOpStruct;
        ZeroMemory(&FileOpStruct,  sizeof(SHFILEOPSTRUCT));
        FileOpStruct.pFrom =  (OpenDialog1->FileName + '\0').c_str();
        FileOpStruct.wFunc =  FO_DELETE;
        FileOpStruct.fFlags =  FOF_ALLOWUNDO;
        FileOpStruct.lpszProgressTitle =  DialogTitle.c_str();
        SHFileOperation(&FileOpStruct);
    }
}



Удаление файла (Вариант 1)

// Для удаления файла надо подключить к проекту Sysutils.hpp и напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString FileName="c:\\readme.txt";
    if (DeleteFile(FileName)) Label1->Caption="true";
}



Удаление файла (Вариант 2)

// Для удаления файла напишите следующий код:
#include <stdio.h>
String FileName="c:\\1.txt";
remove(FileName.c_str()); 



Работа с файлами GIF и JPEG

// Для того, чтобы стандартными средствами C++Builder'a работать с файлами GIF и JPEG, добавьте в начало программы следующий код:
TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg",
__classid(TJPEGImage));
delete Picture;

TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TGIFImage), "gif", "gif",
__classid(TGIFImage));
delete Picture;



Преобразование *.ico файла в *.bmp

// На форме разместите TImage (Image1), TOpenDialog (OpenDialog1) и  TButton (Button1). Напишите следующий обработчик события OnClick  кнопки:
void __fastcall TForm1::Button1Click(TObject  *Sender)
{
    AnsiString as;
    TIcon *pi = new  TIcon();
    OpenDialog1->DefaultExt = ".ICO";
    OpenDialog1->Filter =  "icons (*.ico)|*.ICO";
    OpenDialog1->Options << ofOverwritePrompt  << ofFileMustExist << ofHideReadOnly;
    if  (OpenDialog1->Execute())
    {
        pi->LoadFromFile(OpenDialog1->FileName);
        as  = ChangeFileExt(OpenDialog1->FileName,".BMP");
        Image1->Width =  Icon->Width;
        Image1->Height =  Icon->Height;
        Image1->Canvas->Draw(0, 0,  Icon);
        Image1->Picture->SaveToFile(as);
    }
    delete  pi;
}



Отображение свойств файла

// На форме разместите TOpenDialog (OpenDialog1) и TButton
// (Button1) напишите следующий обработчик события OnClick кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(OpenDialog1->Execute())
    {
        SHELLEXECUTEINFO SEI;
        ZeroMemory(&SEI, sizeof(SHELLEXECUTEINFO));
        SEI.cbSize= sizeof(SHELLEXECUTEINFO);
        SEI.lpVerb = "properties";
        SEI.lpFile= OpenDialog1->FileName.c_str();
        SEI.nShow = SW_SHOW;
        SEI.fMask= SEE_MASK_INVOKEIDLIST;
        ShellExecuteEx(&SEI);
    }
}



Копирование файлов

// Для  того чтобы скопировать файлы напишите следующий код:
int  MoveFiles( AnsiString slSourceDir, AnsiString slTargetDir, bool toCopy = true  )
{
    SHFILEOPSTRUCT sh;
    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT |  FOF_FILESONLY;
    sh.wFunc = toCopy ? FO_COPY : FO_MOVE;
    sh.pFrom =  slSourceDir.c_str();
    sh.pTo = slTargetDir.c_str();
    sh.hNameMappings =  NULL;
    sh.lpszProgressTitle = NULL;
    return SHFileOperation ( &sh  );
}

void __fastcall TForm1::Button1Click(TObject  *Sender)
{
    //copy all from program  files
    if(!MoveFiles("c:\\program files\\*.*",  "c:\\temp"))
    ShowMessage("Ok");
    else  ShowMessage("No");
}
// В функции MoveFiles первый  параметр что копировать,
// второй куда копировать



Удаление директории

// Для удаления директории напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    SHFILEOPSTRUCT sh;
    sh.hwnd=Form1->Handle;
    sh.wFunc = FO_DELETE;
    sh.pFrom = "c:\\test\0"; //удаляемая директория
    sh.pTo = NULL;
    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
    sh.hNameMappings = 0;
    sh.lpszProgressTitle = NULL;
    SHFileOperation(&sh);
}



Вpемя создания файла

// На  форме должны быть Lаbel1 и Button1, затем напишите следующий  код:
TDateTime FileTimeToDateTime(FILETIME *lpftime)
{
    FILETIME  localfiletime;
    SYSTEMTIME  systime;
    FileTimeToLocalFileTime(lpftime,&localfiletime);
    FileTimeToSystemTime(&localfiletime,&systime);
    return(TDateTime(systime.wYear,  systime.wMonth, systime.wDay)+
    TDateTime(systime.wHour,  systime.wMinute,
    systime.wSecond, systime.wMilliseconds));
    }
    //----------------------------------------------------------
    void  __fastcall TForm1::Button1Click(TObject *Sender)
    {
    FILETIME  ftCreationTime,ftLastAccessTime,ftLastWriteTime;
    HANDLE  hFile=(HANDLE)FileOpen("c:\\autoexec.bat",fmOpenRead);
    GetFileTime(hFile,&ftCreationTime,&ftLastAccessTime,&ftLastWriteTime);
    AnsiString  FileInfo="FileName: c:\\autoexec.bat";
    FileInfo+="\nCreation  Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftCreationTime));
    FileInfo+="\nLast  Access  Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftLastAccessTime));
    FileInfo+="\nLast  Write  Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftLastWriteTime));
    Label1->Caption=FileInfo;
    FileClose((int)  hFile);
}



Поиск файлов в каталоге и его подкаталогах

// Для поиска файлов в каталоге и его подкаталогах напишите  следующий код:
void ListFiles(AnsiString path, TStrings* List)
{
// Эта процедура выводит список файлов и вызывает
// саму себя для всех каталогов
TSearchRec sr;
if (FindFirst(path+"*.*",  faAnyFile, sr) == 0)
{
     do
     {
         if (sr.Attr &  faDirectory)
          {
              if (sr.Name!=".")
              if  (sr.Name!="..")
              {
                  ListFiles(path+sr.Name+"\\",List);// Рекурсивный  вызов
              }
          }
          else
          {
           AnsiString  Ext=ExtractFileExt(sr.Name).UpperCase();
           if  (Ext==".CPP")
           List->Add(path+sr.Name);
          }
     }
     while  (FindNext(sr) ==  0);
     FindClose(sr);
}
    Application->ProcessMessages();
}

void  __fastcall TForm1::Button1Click(TObject  *Sender)
{
    ListFiles("c:\\",Memo1->Lines);
}



Как выбрать папку из диалога (Вариант 1)

// Для того чтобы выбрать папку из диалога напишите следуюший  код:
#include <FileCtrl.hpp>
.. .. .. ..
AnsiString way = "c:\\";
if(SelectDirectory("Укажите путь к папке","",way))
  Label1->Caption = way;



Как выбрать папку из диалога (Вариант 2)

// Для того чтобы выбрать папку из диалога напишите следуюший  код:
#include <FileCtrl.hpp>
.. .. .. ..
AnsiString way = "c:\\";
if(SelectDirectory(way,
TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
  Label1->Caption = way;




Как удалить папку и все файлы в ней

// Для того чтобы удалить папку и все файлы в ней напишите следующую функцию:
bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
  {
  if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
   if (((sr.Attr & faDirectory) == faDirectory ) ||
   (sr.Attr == faDirectory))// найдена папка
    {
    FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only
    DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое
    RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку
    }
    else// иначе найден файл
    {
    FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only
    DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
    }
  }
 while (!FindNext(sr));// ищем опять, пока не найдем все
 FindClose(sr);
 }
RemoveDir(DirName);
return true;
}



Пример регистрации собственного расширения файла

// Напишите следующую  функцию:
#include <Registry.hpp>

TRegistry *Reg;
Reg=NULL;
try
{
  Reg=new TRegistry;
  Reg->RootKey=HKEY_CLASSES_ROOT;
  Reg->OpenKey("\\.ant",true);
  Reg->WriteString("","MyProgram");
  Reg->CloseKey();
  Reg->OpenKey("\\MyProgram", true);
  Reg->WriteString("","My document");
  Reg->CloseKey();
  Reg->OpenKey("\\MyProgram\\Shell\\Open\\Command",true);
  Reg->WriteString("",ParamStr(0)+" \"%1\"");
  Reg->CloseKey();
  Reg->OpenKey("\\MyProgram\\DefaultIcon",true);
  Reg->WriteString("",ParamStr(0)+", 1");
  Reg->CloseKey();
}
__finally
{
if (Reg!=NULL)delete Reg;
}
// Весь текст генерирует расширение *.ant

// А этот код загружает файл с расширением *.ant в Image1.
if (ParamCount>0)
{
asFileName=ParamStr(1);
if (FileExists(asFileName)) Image1->Picture->LoadFromFile(asFileName);
  else ShowMessage(asFileName+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!");
}

 




Пример регистрации собственного расширения файла




// Напишите следующуй код:

if(GetDriveType("F:\\") == DRIVE_NO_ROOT_DIR)
MessageBox(NULL, "Указанного диска в системе нет!", "Внимание!", MB_OK | MB_ICONEXCLAMATION);
else
MessageBox(NULL, "Указанный диск есть в системе!", "Внимание!", MB_OK | MB_ICONINFORMATION);



Как проверить наличие дискеты в дисководе

// Напишите следующуй код:
bool IsDriveReady(char drive)
{
    bool out;
    WORD OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
    char path[4];path[0] = drive;path[1] = ':';path[2] = '\\';path[3] = 0;
    out = (SetCurrentDirectory(path) != 0);
    SetErrorMode(OldErrorMode);
    return out;
}

if (IsDriveReady('a'))
    ShowMessage("Дискета в дисководе");
else ShowMessage("Нет дискеты");



Как программно сымитировать нажатие клавиш CTRL+V

// Напишите следующий код:
BYTE keys[256];
GetKeyboardState(keys);
keys[17] = 128;
SetKeyboardState(keys);
keybd_event(86, 0, 0, 0);
// ПРИМЕЧАНИЕ: с помощью это примера можно сымитировать
// и нажатие других комбинации, надо знать только код клавиш



Нажатие клавиши "а"

// Напишите следующий код:
keybd_event('A', 0,0,0);
keybd_event('A', 0,KEYEVENTF_KEYUP,0);



Минимизация всех окон (Win+M)

// Напишите следующий код:
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('M', 0, 0 ,0);
keybd_event('M', 0, KEYEVENTF_KEYUP,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);



Имитация нажатия Alt+Tab

//  Напишите следующий код:
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event(VK_TAB, 0, 0 ,0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0);



Имитация нажатия CapsLock

//  Напишите следующий код:
keybd_event(VK_CAPITAL, 0, 0 ,0);
keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP,0);



Имитация нажатия PrintScreen

// Напишите следующий код:
keybd_event(VK_SNAPSHOT, 0, 0 ,0);
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP,0);



Имитация нажатия PrintScreen только для формы

// Напишите следующий  код:
keybd_event(VK_SNAPSHOT, 1, 0 ,0);
keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP,0);



Как переместить курсор мыши на X,Y

// Для перемещения курсора используйте  функцию:
SetCursorPos(X,Y);



Позиция курсора

// Для того  чтобы узнать позицию курсора напишите следующий код:
TPoint cPt;
GetCursorPos(&cPt);
ShowMessage(int(cPt.y));//Возвращает y-позицию курсора мыши
TPoint cPt;
GetCursorPos(&cPt);
ShowMessage(int(cPt.x));//Возвращает x-позицию курсора мыши



Как ограничить перемещение курсора мыши

// Для того чтобы ограничить перемещение курсора мыши какой-либо  областью экран, напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RECT LR;
LR.left=100;
LR.top=100;
LR.right=500;
LR.bottom=500;
ClipCursor(&LR);// Ограничиваем в заданой области
}
// Освободить курсор можно, передав функции NULL:
ClipCursor(NULL);

 




Как загрузить свой курсор

// Напишите следующий код:
HWND i;
i=LoadImage(0,"cursor1.cur",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);
if (i==0)
    ShowMessage("Ошибка загрузки курсора!");
else
{
  Screen->Cursors[1]=i;
  Form1->Cursor=1;
}



Как сделать, чтобы программа не запускалась второй раз

// Для чтобы программа не запускалась второй раз надо модифицировать проектный файл (в данном примере это Project1.cpp):
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
const char *NamedMutex= "OneOnly";
HANDLE CheckInstance(const char *Name)
{
    HANDLE Mutex = CreateMutex(NULL, true,Name);
    int er = GetLastError();
    if (er) return 0;
    return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HANDLE Mutex = CheckInstance(NamedMutex);
    if (!Mutex)
    {
        ShowMessage("Уже работает");
        ReleaseMutex(Mutex);
        return 1;
    }
    try
    {
        Application->Initialize();
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    return 0;
}



Как сделать, чтобы программа не запускалась второй раз (Вариант 2)

// Для чтобы программа не  запускалась второй раз напишите следующий код:
BOOL WeAreAlone(LPSTR szName)
{
HANDLE hMutex=CreateMutex(NULL,TRUE,szName);
if (GetLastError()==ERROR_ALREADY_EXISTS)
  {
  CloseHandle(hMutex);
  return false;
  }
return true;
}

//В CreatForm пишишь проверку:
if (WeAreAlone("Some_Unique_Name_Or_Other"));
  else
  {
  ShowMessage("Такая программа уже работает!");
  exit(0);
  }

 




Как узнать каталог, где находится запускаемая программа

// Чтобы узнать каталог напишите следющий код:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
    Label1->Caption = Application->ExeName;
    Label2->Caption = ParamStr(0);
    Label3->Caption = GetCurrentDir();// текущая папка (может измениться!)
    char ExeName[MAX_PATH];
    GetModuleFileName(HInstance, ExeName, sizeof(ExeName));
    Label4->Caption=ExeName;
}



Как убрать иконку приложения с TaskBar-a

// Напишите следющий  код:
ShowWindow(Application->Handle, SW_HIDE);//Скрыть
ShowWindow(Application->Handle, SW_SHOW);//Показать



Как сделать, чтобы программа на C++Builder не требовала .bpl, .dll

Для начала надо зайти Project->Options затем: На вкладке Compiler нажать "Release", на вкладке Packages снять галку с "Build with runtime packages" и на вкладке Linker снять галку с "Use dynamic RTL"




Как поменять ICON у моей программы

Project->Options->Load Icon




Как назначить программе другой приоритет

// Напишите следющий код:
HANDLE ProcessHandle, ThreadHandle;
DWORD ProcessID = GetCurrentProcessId();
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
SetPriorityClass(ProcessHandle,HIGH_PRIORITY_CLASS);
ThreadHandle = GetCurrentThread();
SetThreadPriority(ThreadHandle,THREAD_PRIORITY_TIME_CRITICAL);



Регистрация редактора свойства типа AnsiString

// Регистрация редактора свойства  типа AnsiString производится следующим образом. Напишите вспомогательную  функцию:
TTypeInfo  *AnsiStringTypeInfo(void)
{
    TTypeInfo *typeinfo = new  TTypeInfo;
    typeinfo->Kind = tkLString;
    typeinfo->Name =  "AnsiString";
    return typeinfo;
}
// ... и  используйте ее в вызове RegisterPropertyEditor
// (где TMyComponent - имя  класса компонента,
// MyStringProperty - имя свойства типа AnsiString,
//  TMyStringPropertyEditor - имя класса редактора свойства
// типа  AnsiString).
RegisterPropertyEditor(AnsiStringTypeInfo(),
__classid(TMyComponent),  "MyStringProperty",
__classid(TMyStringPropertyEditor));



Мигание иконкой в панели задач

// Чтобы помигать иконкой приложения в панели задач, разместите на  форме компонент TTimer (Timer1) и напишите следующий обработчик события OnTimer  (предварительно выставив интервал таймера и сделав его  активным):
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
FlashWindow(Application->Handle, false);
FlashWindow(Application->Handle, true);
}



Запуск скринсейвера из программы

// Следующий код запустит скринсейвер Handle - дескриптор окна вашей  программы (программисты на C++Builder могут использовать  Application->Handle):
SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);



Скрытие таскбара

// Напишите  следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND H;
H=FindWindow("Shell_TrayWnd",NULL); //находим хандл окна таскбара
ShowWindow(H, SW_HIDE);//делаем его невидимым
Sleep(2000);
ShowWindow(H, SW_SHOW);//делаем его видимым
}



Переключение раскладки клавиатуры (конкретный язык)

// Напишите следующий  код:
LoadKeyboardLayout("00000409", KLF_ACTIVATE);// Английская
LoadKeyboardLayout("00000419", KLF_ACTIVATE);// Русская



Переключение раскладки клавиатуры

// Напишите следующий код:
ActivateKeyboardLayout(0, 0);



Программная очистка корзины (для Windows 98)

// Напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/* Очистка корзины
Есть флаги - NULL - как обычно, т.е. по умолчанию
SHERB_NOCONFIRMATION 0x00000001 - без запроса на удаление
SHERB_NOPROGRESSUI 0x00000002 - без показа удаления
SHERB_NOSOUND 0x00000004 - без звука
при желании флаги можно сочетать через | */
char sh[500];
SHEmptyRecycleBin(Handle, sh, SHERB_NOSOUND|SHERB_NOCONFIRMATION);
}



Запуск браузера

// Напишите  следующий код:
void __fastcall TForm1::Label1Click(TObject *Sender)
{
ShellExecute(Handle, "open", "http://google.com/",
0, 0, SW_SHOWNORMAL);
}



Запуск почтового клиента

//  Напишите следующий код:
void __fastcall TForm1::Label1Click(TObject *Sender)
{
ShellExecute(Handle,NULL,"mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.?subject=Tema",
NULL,NULL,SW_SHOWNORMAL);
}




Как добавить код на ассемблере

// Ассемблеровские вставки делаются так:
asm {
// код ассемблера
}



Как сделать Shutdown (закрыть все запущенные приложения)

// напишите следующий код: HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken)) ShowMessage("OpenProcessToken"); // Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
ShowMessage("AdjustTokenPrivileges"); // Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE , 0)) ShowMessage("ExitWindowsEx");



Какая на программа активна

// Для того что бы узнать какая программа активна кинте на форму таймер Timer1 и метку Label1 напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    HANDLE hWnd;
    hWnd = GetForegroundWindow();
    char szTitle[41] = {0};
    GetWindowText(hWnd,szTitle,40);
    Label1->Caption = AnsiString(szTitle);
}



Блокировка клавиатуры и мыши

// Для блокировки клавиатуры и мыши напишите следующий  код:
void __fastcall TForm1::Button1Click(TObject  *Sender)
{
    HINSTANCE hDll;
    //ниже прототип будущей  функции
    DWORD __stdcall (*BlockInput)(bool Status);
    DWORD  Result;
    Memo1->Lines->Add("");
    Memo1->Lines->Add("Загрузка  функции BlockInput()...");
        hDll =  LoadLibrary("User32.dll");
        Memo1->Lines->Add("hDll = " +  IntToHex(int(hDll), 8));
        BlockInput = (DWORD __stdcall (*)(bool  Status))GetProcAddress(hDll,
        "BlockInput");
    Memo1->Lines->Add("BlockInput  = " + IntToHex(int(BlockInput),  8));
    if(!BlockInput)
    {
        Memo1->Lines->Add("Ошибка!!!");
        FreeLibrary(hDll);
        return;
    }
    Memo1->Lines->Add("Выполняем  BlockInput(true)...");
    Result =  BlockInput(true);
    Memo1->Lines->Add("Result = " +  IntToStr(Result));
    if(Result)
    {
        Memo1->Lines->Add("Теперь  клиатура и мышь доступны только, если нажать  CTRL+ALT+DEL");
        Memo1->Lines->Add("Ждем 15  сек...");
        Sleep(15000);
    }
    else  Memo1->Lines->Add("Ошибка!!!");
    Memo1->Lines->Add("Восстанавливаем  все как  было...");
    BlockInput(false);
    FreeLibrary(hDll);
    Memo1->Lines->Add("Готово.");
}



Как из тела программы запустить обработчик события (как функцию)

// напишите следующий код в нужном  месте:
{
...
Form1->Button1Click(Form1);
...
}



Определение количества элементов в массиве

Чтобы в Run Time определить количество  элементов в массиве, можно воспользоваться макросом ARRAYSIZE,  определённым в файле sysopen.h следующим образом:
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))





Имитации нажатия левой кнопки мыши

// Напищите слеующий код в нужном месте:
INPUT inp[2];
memset(inp,0,sizeof(inp));
inp[0].type=INPUT_MOUSE;
inp[0].mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
inp[1].type=INPUT_MOUSE;
inp[1].mi.dwFlags=MOUSEEVENTF_LEFTUP;
SendInput(2,inp,sizeof(INPUT));



Как послать сообщение компьютеру в локальной сети

// Для того чтобы послать сообщение компьютеру в локальной сети
// напишите следующие функции:
bool SendNetMessage(AnsiString Komp, AnsiString Mes)
{
    AnsiString From;
    char CompName[10];
    DWORD size=10;
    //Откуда
    if(!GetComputerName(CompName,&size)) return false;
    From=CompName;
    if(Mes.Length()==0) return false;
    HANDLE hSlot = CreateFile(("\\\\"+Komp+"\\mailslot\\messngr").c_str(),
    GENERIC_WRITE, FILE_SHARE_READ, NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hSlot == INVALID_HANDLE_VALUE) return false;
    DWORD cb=0;
    BOOL ret;
    char *buf=new char[From.Length()+1+Komp.Length()+1+Mes.Length()+1];
    //1. From
    memcpy(&buf[cb],From.c_str(),From.Length()+1);
    cb +=From.Length()+1; //+1 на конце должен быть 0
    //2. To
    memcpy(&buf[cb],Komp.c_str(),Komp.Length()+1);
    cb +=Komp.Length()+1;
    //3. Само сообщение
    memcpy(&buf[cb],Mes.c_str(),Mes.Length()+1);
    cb +=Mes.Length()+1;
    //ConvertToDos
    CharToOemBuff(buf,buf,cb);
    ret=WriteFile(hSlot, buf,cb, &cb, NULL);
    CloseHandle(hSlot);
    delete[] buf;
    if(!ret) return false;
    return true;
}
   
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString Komp,Mes;
    //Кому
    Komp=Edit1->Text; //Имя компьютера
    //Сообщение
    Mes=Edit2->Text; //Message
    bool ret;
    int Kol=UpDown1->Position;
    for(int i=1;i<=Kol;i++)
    {
        ret=SendNetMessage(Komp,Mes);
    }
}



Как скачать файл из Интернета с конкретного сайта

// напишите следующуй код:
NMHTTP1->InputFileMode=true;
NMHTTP1->Get(" http://www.xxx.ru/pic.gif");
NMHTTP1->Body="pic.gif"; //на винт скинуть



Получение IP-адреса локальной машины

// напишите следующуй код:
#include <winsock.h>
#include <stdio.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(1, 0);
    int err = WSAStartup(wVersionRequested, &wsaData);
    if(err == 0)
    {
        char hn[1024];
        struct hostent *adr;
        if(gethostname((char *)&hn, 1024))
        {
            int err = WSAGetLastError();
            Beep();
        };
        adr = gethostbyname(hn);
        if(adr)
        {
          char *LocalIp = new char[15];
          sprintf(LocalIp,"%d.%d.%d.%d",
          (unsigned char)adr->h_addr_list[0][0],
          (unsigned char)adr->h_addr_list[0][1],
          (unsigned char)adr->h_addr_list[0][2],
          (unsigned char)adr->h_addr_list[0][3]);
          Label1->Caption=LocalIp; //Выводим IP адрес
        }
    }
}



Получение имени локального компьютера

// напишите следующуй код:
#include <winsock.h>

WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 0);
int err = WSAStartup(wVersionRequested, &wsaData);
if(err == 0)
{
    char name[1024];
    if(gethostname((char *)&name, 1024))
    {
        int err = WSAGetLastError();
        Beep();
    };
    Label1->Caption=name; //выводим имя
}



Как узнать папку Windows

// Для получения папки Windows напишите следующий код:
char WindowsDirectory[MAX_PATH];
GetWindowsDirectory(WindowsDirectory, MAX_PATH);
// В WindowsDirectory содержится папка Windows



Как узнать системную папку Windows

// Для получения системной папки Windows напишите
// следующий код:
char SystemDirectory[MAX_PATH];
GetSystemDirectory(SystemDirectory, MAX_PATH);
// В SystemDirectory содержится системная папка Windows



Как спрятать кнопку "Пуск"

//  для того, чтобы спрятать кнопку "Пуск", воспользуйтесь
// следующим кодом:
// Поиск кнопки
HWND hWnd;
hWnd = FindWindow("Shell_TrayWnd", NULL);
hWnd = FindWindowEx(hWnd, NULL, "BUTTON", NULL);
// Сокрытие кнопки
ShowWindow(hWnd, SW_HIDE);
// для того, чтобы вновь отобразить кнопку после сокрытия, напишите:
ShowWindow(hWnd, SW_SHOW);



Как сдвинуть кнопку "Пуск"

//  Для того что бы сдвинуть кнопку "Пуск" напишите
// следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
HWND hWndBt = FindWindowEx(hWnd, NULL, "Button", NULL);
MoveWindow(hWndBt, 30, 2, 98, 32, TRUE);
}



Получение имени компьютера

//  Для получения имени компьютера напишите следующий код:
unsigned long Size = MAX_COMPUTERNAME_LENGTH + 1;
char *Buffer = new char[Size];
GetComputerName(Buffer, &Size);
// после выполнения данного кода имя компьютера будет
// содержаться в Buffer. После того, как Buffer перестанет быть
// вам нужным, не забудьте вызвать delete [] Buffer.



Изменение имени компьютера

//  для изменения имени компьютера воспользуйтесь функцией
// SetComputerName
SetComputerName("НОВОЕ_ИМЯ_КОМПЬЮТЕРА");
// не забудьте перезагрузить машину



Список всех шрифтов, установленных в системе (VCL вариант)

// Список всех шрифтов, установленных  в системе, содержится в
// свойстве Fonts глобальной переменной Screen.
// Нижеприведенный пример показывает заполнение именами
// шрифтов выпадающего списка:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i = 0; i < Screen->Fonts->Count; i++)
ComboBox1->Items->Add(Screen->Fonts->Strings[i]);
}



Как получить доступ к буферу обмена (VCL вариант)

// Для получения доступа к буферу  обмена вызовите функцию
// Clipboard() из модуля Clipbrd. Функция возвращает указатель
// на экземпляр класса TClipboard
#include <Clipbrd.hpp>
Clipboard()->Clear(); // очищает буфер обмена



Как пpи стаpте пpогpаммы включить киpиллицу

// Напишите этот в начале  программы:
ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID
(LANG_RUSSIAN, SUBLANG_DEFAULT) ,8).c_str(), 0), 0);



Как отобразить Диспетчер задач

// Напишите следующий код:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1)



Как добавить данные в реестр

// Напишите следующий код:
#include <Registry.hpp>
TRegistry *Registry=new TRegistry;
try
{
Registry->RootKey=HKEY_CURRENT_USER; // Ветвь реестра
Registry->OpenKey("ant47\\Test",true); // Создать новую ветвь в реестре
Registry->WriteString("DATA","15 мая"); // Создание строкового раздела
}
__finally
{
delete Registry;



Как изменить скорость перемещения мыши

// Напишите следующий код:
SystemParametersInfo(SPI_SETMOUSESPEED,0,(PVOID)5,SPIF_SENDCHANGE);
// где 5 - скорость. (по умолчанию - 10) 



Как инвертировать кнопки мыши

// Напишите следующий код:
SwapMouseButton(true) ; // инвертировать
SwapMouseButton(false) ; // восстановить значение



Как переменную AnsiString конвертировать в char

// Напишите следующий код:
AnsiString a = "Hello World";
char *b = a.c_str();



Как переменную AnsiString конвертировать в int

// Напишите следующий  код:
AnsiString a = "123456";
int i = a.ToInt();
или
int i = StrToInt(a);



Как переменную AnsiString конвертировать в float

// Напишите следующий  код:
AnsiString a = "12.5";
float d;
d=a.ToDouble();



Как переменную char или int конвертировать в AnsiString

// Напишите следующий  код:
char Arr[240]= "Hello World";
AnsiString Str;
Str=(AnsiString)Arr;



Как узнать длину слова в пикселях

// Напишите следующий код:
AnsiString a="Hello";
int WidthOfString = Canvas->TextWidth(a);
int HeightOfString = Canvas->TextHeight(a);
TSize SizeOfString = Canvas->TextExtent(a);
//У структуры TSize два поля cx и cy размеры
//по горизонтали и вертикали



Как конвертировать строку из кодировки WIN в KOI

// Напишите следующий  код:
AnsiString S,N,C,SKoi,SWin;
SKoi="__ёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";
SWin="ёЁTюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ";
int k;
S="Строка"; //Строка WIN
for(int j=1; j<=S.Length(); j++)
{
 C=S[j];
 k=AnsiPos(C,SWin);
 if(k==0)
 N+=S[j];
   else
   N+=SKoi[k];
}
//N строка Koi8





Как скопировать текст из строки в Clipboard

// Напишите следующий код:
#include <clipbrd.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString s = "Hello, World !";
Clipboard()->AsText = s;
if (Clipboard()->HasFormat(CF_TEXT))
   Edit1->Text = Clipboard()->AsText;
   else
   Application->MessageBox("The clipboard does not contain text.", NULL, MB_OK);
}



Открытие привода CD-ROM

// Чтобы программно открыть привод CD-ROM, подключите
// после vcl.h заголовочный файл mmsystem.h
// и вызовите функцию mciSendString:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
mciSendString("Set cdaudio door open wait", NULL, 0, Handle);
}



Закрытие привода CD-ROM

//  Чтобы программно закрыть привод CD-ROM, подключите
// после vcl.h заголовочный файл mmsystem.h
// и вызовите функцию mciSendString:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
mciSendString("Set cdaudio door closed wait", NULL, 0, Handle);
}



Программное выключение монитора

// Следующий код выключит  монитор
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);



Программное включение монитора

// Следующий код включит  монитор
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);



Как выключить/перезагрузить компьютер

// Для включения/перезагрузки компьютера вызовите
// функцию ExitWindowsEx

// выключить компьютер
ExitWindowsEx(EWX_SHUTDOWN, 0);
// перезагрузить компьютер
ExitWindowsEx(EWX_REBOOT, 0);
// завершить сеанс пользователя
ExitWindowsEx(EWX_LOGOFF, 0);



Сколько оперативной памяти

//  Для того чтобы узнать сколько оперативной
// памяти на компьютере введите следующий код:
MEMORYSTATUS mem;
memset((void*)&mem,0,sizeof(mem));
mem.dwLength=sizeof(mem);
GlobalMemoryStatus(&mem);
MessageDlg("Total memory:"+IntToStr(mem.dwTotalPhys),
mtInformation, TMsgDlgButtons() << mbOK, 0);



Как определить, подключена ли мышь

// Введите следующий  код:
if(GetSystemMetrics(SM_MOUSEPRESENT))
MessageDlg("Мышь подключена!", mtInformation, TMsgDlgButtons() << mbOK, 0);
else
MessageDlg("Мышь не найдена!", mtError, TMsgDlgButtons() << mbOK, 0);



Название процессора

//  Введите следующий код:
AnsiString ProcessorName="Unknown";
TRegistry *reg = new TRegistry;
try {
reg->RootKey = HKEY_LOCAL_MACHINE;
reg->OpenKey("Hardware\\Description"
"\\System\\CentralProcessor\\0", false);
ProcessorName=reg->ReadString("ProcessorNameString");
}
__finally
{
delete reg;
}
MessageDlg(ProcessorName, mtInformation, TMsgDlgButtons() << mbOK, 0);




Определение набора расширенных инструкций поддерживающий процессором

// Введите следующий код:
Memo1->Lines->Add("Поддерживаемые инструкции:");

DWORD brt; bool AMD,MMX; __asm
{
    mov eax,1
    cpuid
    mov brt,edx
}
if(brt&(1<<23))
{
    MMX=true;
    Memo1->Lines->Add("MMX");
}
if(brt&(1<<25))
{
    if(brt&(1<<24))
    {
        __try
        {
            __asm xorps xmm0, xmm0
            Memo1->Lines->Add("SSE");
        }
        __except(EXCEPTION_EXECUTE_HANDLER){}
       
        if(brt&(1<<26))
        {
            __try
            {
                __asm xorpd xmm0,xmm0
                Memo1->Lines->Add("SSE2");
            } __except(EXCEPTION_EXECUTE_HANDLER){}
        }
    }
}

__asm
{
    mov eax,0x80000000
    cpuid
    cmp eax,0x80000000
    jc notamd
    mov eax,0x80000001
    cpuid
    mov brt,edx
    mov AMD,1
    notamd:
}

if(AMD)
if((MMX)&&(brt&(1<<31)))
Memo1->Lines->Add("3DNOW!");  



Определение тактовой частоты CPU

// При помощи этой функции можно определить тактовую частоту CPU:
double CPUSpeed(void)
{
    DWORD dwTimerHi, dwTimerLo; double dRes;
    asm
    {
        DW 0x310F
        mov dwTimerLo, EAX
        mov dwTimerHi, EDX
    }
    Sleep (500);
    asm
    {
        DW 0x310F
        sub EAX, dwTimerLo
        sub EAX, dwTimerHi
        mov dwTimerLo, EAX
        mov dwTimerHi, EDX
    }
    dRes = dwTimerLo/(1000.0*500);
    return dRes;
}



Запрещение кнопки закрытия [X] формы

// Чтобы запретить кнопку закрытия формы, напишите следующий
// код (Form1- ваша форма, Button1 - кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HMENU MenuHandle = GetSystemMenu(Handle, false);
    if(MenuHandle)
      DeleteMenu(MenuHandle, SC_CLOSE, MF_BYCOMMAND);
}



Запрещение кнопки максимизации [[]] формы

// Чтобы запретить кнопку максимизации формы, напишите
// следующий код (Form1- ваша форма, Button1 - кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
  DeleteMenu(MenuHandle, SC_MAXIMIZE, MF_BYCOMMAND);
}
// ПРИМЕЧАНИЕ: максимизация формы двойным щелчком мыши
// по заголовку также будет невозможна



Запрещение кнопки минимизации [_] формы

// Чтобы запретить кнопку минимизации формы, напишите
// следующий код (Form1- ваша форма, Button1 - кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
  DeleteMenu(MenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
}



Отмена закрытия формы при нажатии Alt+F4

// Чтобы форма не закрывалась при нажатии комбинации клавиш
// Alt+F4, разместите на форме компонент TActionList(ActionList1),
// создайте новый TAction(Action1), и в свойстве ShortCut у Action1
// пропишите комбинацию клавиш Alt+F4, а обработчик события
// OnExecute должен выглядеть следующим образом
// (Form1- ваша форма):
void __fastcall TForm1::Action1Execute(TObject *Sender)
{
// чтобы при сохранении C++Builder не уничтожил обработчик
}



Отмена закрытия формы при нажатии Alt+F4 (Вариант 2)

//В обpаботчике FormKeyDown  пишешь:
if (Shift.Contains(ssAlt)&&Key==VK_F4) Tag=1;

//В обpаботчике FormCloseQuery:
if(Tag)
{
CanClose=false;
Tag=0;
}



Перемещение формы мышью не за заголовок

// Напишите следующий обработчик события OnMouseDown  формы
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
 long SC_DRAGMOVE = 0xF012;
 if(Button == mbLeft)
  {
  ReleaseCapture();
  SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
 }
}




Изменение размеров формы (развернуть и т.д.)

// Напишите следующий код:
Form1->WindowState = wsMaximized; // развернуть
Form1->WindowState = wsMinimized; // минимизировать
Form1->WindowState = wsNormal; // первоначальный размер



Как сделать кусок окна прозрачным

// Для того чтобы сделать кусок формы прозрачным,
// напишите следующий код:

//Прямоугольный кусок
HRGN R1=CreateRectRgn(0, 0, Width, Height);
HRGN R2=CreateRectRgn(4, 24, Width-4, Height-4);
CombineRgn(R1, R1,R2, RGN_DIFF);
SetWindowRgn(Handle, R1, TRUE);

//Кусок в виде элипса
HRGN hRgn1 = CreateRectRgn(0, 0, Width, Height);
HRGN hRgn2 = CreateEllipticRgn(0, 0, Width, Height);
HRGN hRgn3 = CreateRectRgn(0, 0, Width, Height);
CombineRgn(hRgn3, hRgn1, hRgn2, RGN_DIFF);
SetWindowRgn(Handle, hRgn3, TRUE);
//можно заменить hRgn3 на hRgn2

//Кусок в виде пятиугольника
HRGN Reg1, Reg2;
HRGN Region;
POINT p[5];
p[0] = Point(100, 0);
p[1] = Point(Width-100, 0);
p[2] = Point(Width, Height/2);
p[3] = Point(Width/2, Height);
p[4] = Point(0, Height/2);
Region = CreatePolygonRgn(p, 5, ALTERNATE);
SetWindowRgn(Handle, Region, true);



Создание новой формы во время работы программы

// Для того чтобы создать новую форму  напишите:
// следующих код:
TForm * Formik= new TForm(this);
TButton* button=new TButton(Application);
button->Parent=Formik;
button->Caption="New Button";
button->Left=10;
button->Top=15;
button->Show();
Formik->Caption=123;
Formik->ShowModal();
delete Formik;



Как сделать прозрачную форму в W2K/XP

// Для того чтобы сделать прозрачную форму  напишите:
int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0 , (255 * Transparency) / 100,
LWA_ALPHA);



Прозрачное окно с реакцией на нажатия кнопок, панелей

// Для того чтобы создать форму  напишите:
void __fastcall TForm1::Photo()
{
    int  X0,Y0;
    bool Flag;
    TRect ScreenRect;
    TCanvas* ScreenCanvas=new  TCanvas;
    try
    {
      Top=0;
      Left=Screen->Width;
      Width=Screen->Width;
      Height=Screen->Height;
      ScreenRect=Rect(0,0,Width,Height);
      ScreenCanvas->Handle=GetDC(0);
      Image1->Canvas->CopyRect(ScreenRect,  ScreenCanvas,ScreenRect);
      ReleaseDC(Handle,ScreenCanvas->Handle);
      Left=Top;
    }  __finally
    {
      delete ScreenCanvas;
    }
}



Новая форма как отдельное окно

// Для того чтобы создать новую форму напишите:
void __fastcall TForm1::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.WndParent = 0;
}



Приложение без формы

Создайте новый проект. Дальше: Project->Remove from project



Определения класса окна определённого приложения

Для того чтобы определить класс  определённого приложения напишите следующий код:

HWND hWnd=FindWindow(NULL,"Калькулятор");//для русскоязычной Windows
if (hWnd)
{
char buff[100];
GetClassName(hWnd,buff,100);
ShowMessage(buff);
}





Как заполнить канву формы, фоном рабочего стола

// Напишите следующий код:
PaintDesktop(Form1->Canvas->Handle);



Изменение картинки на рабочем столе

// Для изменения картинки на рабочем столе
// используйте следующий код:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "pic.bmp",
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
// где pic.bmp - имя вашего файла с картинкой



Изменение картинки на рабочем столе(вариант 2)

//Первый вариант в C++Builder 5 вызывает  ругань
// BoundsChecker'a, хотя и работает.
// Нижеприведенный вариант никакой ругани не вызывает, но
// почему-то работает не на всех машинах. Для изменения картинки
// на рабочем столе используйте следующий код:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "pic.bmp",
SPIF_UPDATEINIFILE);
// где pic.bmp - имя вашего файла с картинкой



Изменение параметров экрана

// Для изменения параметров экрана используйте следующий
// код:
DEVMODE DM;
DM.dmSize = sizeof(DEVMODE);
DM.dmBitsPerPel = 16; // глубина цвета, бит на пиксель
DM.dmPelsWidth = 1024; // разрешение по горизонтали
DM.dmPelsHeight = 768; // разрешение по вертикали
DM.dmFields = DM_BITSPERPEL +
DM_PELSWIDTH +
DM_PELSHEIGHT +
DM_DISPLAYFREQUENCY;
DM.dmDisplayFrequency = 75; // частота обновления экрана
ChangeDisplaySettings(&DM, 0);
// ЗАМЕЧАНИЕ: при изменении параметров смотрите чтобы
монитор поддерживал это режим



Как узнать частоту обновления экрана

// Для получения частоты обновления экрана напишите следующий  код:
HDC hDCScreen = GetDC(NULL);
int Refresh = GetDeviceCaps(hDCScreen, VREFRESH);
ReleaseDC(NULL, hDCScreen);
// в Refresh содержится частота обновления экрана по горизонтали



Как узнать разрешение экрана (VCL вариант)

// Разрешение экрана можно узнать,  прочитав значения
// свойств Screen->Width и Screen->Height:
int HorzRes = Screen->Width;
int VertRes = Screen->Height;



Как узнать разрешение экрана (WinAPI вариант)

// Для получения разрешения экрана  напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Horres = GetDeviceCaps(hDCScreen, HORZRES);
int Vertres = GetDeviceCaps(hDCScreen, VERTRES);
ReleaseDC(NULL, hDCScreen);
// в Horres содержится разрешение экрана по горизонтали,
// в Vertres содержится разрешение экрана по вертикали.



Как узнать разрешение экрана

// Для получения разрешения экрана напишите следующий  код:
int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана
int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана
// в screenW содержится разрешение экрана по горизонтали,
// в screenH содержится разрешение экрана по вертикали.




Отображение свойств дисплея

// Следующий код отобразит на экране диалоговое
// окно свойств дисплея:
ShellExecute(NULL, "", "Desk.cpl", "", "", SW_SHOWNORMAL);



Как поместить вид рабочего стола в буфер

// Напишите следующий код:
#include  <Clipbrd.hpp>
void __fastcall TForm1::Button1Click(TObject  *Sender)
{
    unsigned DataHandle;
    HPALETTE APalette;
    Word  Format;
    Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
    HDC  DC=GetDC(0);
    try
    {
        Bitmap->Height=Screen->Height;
        Bitmap->Width=Screen->Width;
        BitBlt(Bitmap->Canvas->Handle  , 0, 0, Screen->Width,
        Screen->Height,DC, 0, 0, SRCCOPY);
        //Изображение экрана теперь в Bitmap, запишем его в бyфеp  обмена
        Bitmap->SaveToClipboardFormat(Format,DataHandle,APalette);
        Clipboard()->SetAsHandle(Format,DataHandle);
    }
    __finally
    {
        delete  Bitmap;
        ReleaseDC(0,DC);
    }
}



Как рисовать на Десктопе

// Напишите следующий код:
HDC hdc = CreateDC ( TEXT("DISPLAY"), NULL, NULL, NULL );
Rectangle( hdc, 100,100, 200, 200);
DeleteDC ( hdc ); 



Как закрасить рабочий стол по пикселю

// Напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TCanvas *dt = new TCanvas ;
    randomize();
    dt->Handle = GetDC(0);
    while (dt)
    {
        dt->Pixels[random(1024)][random(768)]= 0 ;
    }
}