Borland C++ VCL FAQ
Страница 10.



Печать выделенного текста на матричный принтер

Для печати выделенного текста на матричный принтер можно использовать следующий код:
#include <fstream.h>

...

fstream outfile ("LPT1");
AnsiString MyMemoPrintWin = Memo1->SelText;
char *TempString = new char[MyMemoPrintWin.Length() + 1];
CharToOemBuff(MyMemoPrintWin.c_str(), TempString, MyMemoPrintWin.Length() + 1);
outfile << TempString << endl; //пошла печать
delete[] TempString;

Преобразование битового образа в область (регион)

При создании в C++Builder окон нестандартной формы вам понадобится преобразование битового изображения в область. Это можно сделать с помощью приведенной ниже функции:
HRGN TfSettingsForm::BitmapToRegion(TPicture *APicture, TColor ATransparentColor)
{
HRGN Result = 0;
for(int y = 0; y < APicture->Height; y++)
{
int x = 0;
while(x < APicture->Width)
{
// Пропускаем прозрачные точки
while((x < APicture->Width) &&
(APicture->Bitmap->Canvas->Pixels[x][y] == ATransparentColor))
x++;

if(x >= APicture->Bitmap->Width)
break;

int XStart = x; // Пропускаем непрозрачные точки

while((x < APicture->Width) &&
(APicture->Bitmap->Canvas->Pixels[x][y] != ATransparentColor))
x++;

// Создаем новый прямоугольный регион и добавляем его к
// региону всей картинки
if(Result == 0)
Result = CreateRectRgn(XStart, y, x, y + 1);
else
CombineRgn(Result, Result, CreateRectRgn(XStart, y, x, y + 1), RGN_OR);
}
// конец оператора while(x < APicture->Width)
}
// конец оператора for(int y = 0; y < APicture->Height; y++)

return Result;
}
TPicture *APicture - указатель на изображение, которое будет фоном для вашей формы. TColor ATransparentColor - прозрачный цвет в данном изображении. Пиксели данного цвета "исчезнут", и окно сможет принять самый замысловатый вид.

Как ограничить перемещение курсора заданной областью?

Иногда вам может потребоваться органичение перемещения курсора мыши заданой прямоугольной областью. Рассмотрим, как это делается, на примере формы (Form1), а далее вы сможете переделать данный код так, как вам необходимо.

Добавьте в заголовочный файл формы в секцию private два следующих объявления:
TCursor FCursor;
bool FFlag;
А в cpp-файле напишите три следующих обработчика:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(FFlag)
{
if(Mouse->CursorPos.x <= (Left + 50))
SetCursorPos((Left + 50), Mouse->CursorPos.y);

if(Mouse->CursorPos.x >= (Left + Width - 50))
SetCursorPos((Left + Width - 50), Mouse->CursorPos.y);

if(Mouse->CursorPos.y <= (Top + 50))
SetCursorPos(Mouse->CursorPos.x, (Top + 50));

if(Mouse->CursorPos.y >= (Top + Height - 50))
SetCursorPos(Mouse->CursorPos.x, (Top + Height - 50));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
FFlag = true;
FCursor = Cursor;
Screen->Cursor = crDrag;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
FFlag = false;
Screen->Cursor = FCursor;
}
//---------------------------------------------------------------------------
Теперь область перемещения курсора внутри формы при удерживаемой нажатой кнопке мыши будет на 50 пикселей меньше относительно каждой из границ формы, то есть, вы не сможете переместить курсор при нажатой кнопке мыше к краю формы ближе, чем на 50 пикселей.
 
« Предыдущая статья   Следующая статья »