Sites of the week

ads ads ads ads

Функция SetWindowPos

Posted by admin | WinAPI, Windows, Окна | Суббота 12 Январь 2008 21:31

Функция SetWindowPos изменяет размер, позицию и Z-последовательность дочернего, выскакивающего или верхнего уровня окна. Дочерние, выскакивающие и верхнего уровня окна размещаются по порядку согласно их появлению на экране. Самое верхнее окно принимает самый высокий ранг и становится первым окном в Z-последовательности.

Синтаксис

 
BOOL SetWindowPos
(
HWND hWnd,            // дескриптор окна
HWND hWndInsertAfter,        // дескриптор порядка размещения
int X,                // позиция по горизонтали
int Y,                // позиция по вертикали
int cx,                // ширина
int cy,                // высота
UINT uFlags             // флажки позиционирования окна
);

Параметры

hWnd
Идентифицирует окно.
hWndInsertAfter
Идентифицирует окно, которое предшествует установленному окну в Z-последовательности. Этот параметр должен быть дескриптор окна или одно из следующих значений:

  • HWND_BOTTOM - Помещает окно внизу Z-последовательности. Если параметр hWnd идентифицирует самое верхнее окно, окно теряет своё самое верхнее состояние и помещается внизу всех других окон.
  • HWND_NOTOPMOST - Помещает окно перед всеми не в самыми верхними окнами (то есть позади всех самых верхних окон). Этот флажок не имеет никакого влияния, если окно - уже не самое верхнее окно.
  • HWND_TOP - Помещает окно наверху Z-последовательности.
  • HWND_TOPMOST - Помещает окно перед не самыми верхними окнами. Окно сохраняет свою самую верхнюю позицию даже тогда, когда оно неактивное.

Для получения дополнительной информации о том, как использовать этот параметр, см. следующий раздел Замечания.
X
Устанавливает новую позицию с левой стороны окна.
Y
Устанавливает новую позицию верхней части окна.
cx
Устанавливает новую ширину окна, в пикселях.
cy
Устанавливает новую высоту окна, в пикселях.
uFlags
Определяет флажки, устанавливающие размеры и позиционирование окна. Этот параметр может быть комбинацией следующих значений:

  • SWP_DRAWFRAME - Выводит рамку (определенную в описании класса окна) вокруг окна.
  • SWP_FRAMECHANGED - Посылает сообщение WM_NCCALCSIZE окну, даже тогда, когда размер окна не изменяется. Если этот флажок не установлен, WM_NCCALCSIZE посылается только тогда, когда размер окна изменяется.
  • SWP_HIDEWINDOW - Скрывает окно.
  • SWP_NOACTIVATE - Не активизирует окно. Если этот флажок не установлен, окно активизируется и перемещается в верхнюю часть или самой верхней, или не самой верхней группы (в зависимости от установки параметра hWndInsertAfter).
  • SWP_NOCOPYBITS - Сбрасывает все содержание рабочей области. Если этот флажок не установлен, допустимое содержание рабочей области сохраняется и копируется обратно в рабочую область после того, как окно установлено по размеру или переустановлено.
  • SWP_NOMOVE - Сохраняет текущую позицию (игнорирует X и Y параметры).
  • SWP_NOOWNERZORDER - Не изменяет позицию окна владельца в Z-последовательности.
  • SWP_NOREDRAW - Не перерисовывает изменения. Если этот флажок установлен, то не происходит никакой перерисовки любого вида. Это применяется к рабочей области, нерабочей области (включая строку заголовка и линейки прокрутки) и любую часть родительского окна, раскрытого в результате перемещения окна. Когда этот флажок установлен, прикладная программа должна явно лишить законной силы или перерисовывать любые части окна и родительского окна, которые требуют перерисовки.
  • SWP_NOREPOSITION - То же самое, что и флажок SWP_NOOWNERZORDER.
  • SWP_NOSENDCHANGING - Предохраняет окно от приема сообщения WM_WINDOWPOSCHANGING.
  • SWP_NOSIZE - Сохраняет текущий размер (игнорирует cx и cy параметры).
  • SWP_NOZORDER - Сохраняет текущую Z-последовательность (игнорирует параметр hWndInsertAfter).
  • SWP_SHOWWINDOW - Отображает окно.

Возвращаемые значения
Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Замечания
Если установлены флажки SWP_SHOWWINDOW или SWP_HIDEWINDOW, окно не может быть перемещено или изменен его размер. Все координаты для дочерних окон - рабочие координаты (относительно левого верхнего угла рабочей области родительского окна). Окно может быть сделано самым верхним окном или, путем установки параметра hWndInsertAfter в HWND_TOPMOST с гарантией того, что флажок SWP_NOZORDER не установлен, или, путем установки позиции окна в Z-последовательности так, чтобы оно было выше любого существующего самого верхнего окна. Когда не самое верхнее окно делается самым верхним, находящиеся в его собственности окна также делаются самыми верхними. Его владельцы, однако, не изменяются. Если ни флажок SWP_NOACTIVATE, ни флажок SWP_NOZORDER не установлен (то есть, когда прикладная программа потребовала, чтобы окно было одновременно, и активизировано, и чтобы его позиция изменилась в Z-последовательности), значение, заданное в hWndInsertAfter, используются только в следующих обстоятельствах:

  • Ни флажок HWND_TOPMOST ни флажок HWND_NOTOPMOST не установлен в hWndInser-tAfter.
  • Окно, идентифицированное hWnd - не активное окно.

Прикладная программа не может активизировать неактивное окно без такого же обеспечения ему в верхней части Z-последовательности. Прикладные программы могут изменять позицию активизированного окна в Z-последовательности без ограничений, или они могут активизировать окно, а затем переместить его в верхнюю часть самых верхних или не самых верхних окон. Если самое верхнее окно переустановлено в нижней части (HWND_BOTTOM) Z-последовательности или после любого не самого верхнего окна, оно больше не самое верхнее. Когда самое верхнее окно сделано не самым верхним, его владельцы и находящиеся в его собственности окна также делаются не самыми верхними окнами. Не самое верхнее окно может владеть самым верхним окном, а наоборот не может происходить. Любое окно (например, диалоговое окно) принадлежащее самому верхнему окну самостоятельно делается самым верхним окном, гарантируя, что все окна находящиеся во владении находятся выше их владельца. Если прикладная программа не в активном режиме, а должна быть в активном режиме, она должна вызвать функцию SetForegroundWindow.

Смотри также
MoveWindow, SetActiveWindow, SetForegroundWindow

Размещение и совместимость SetWindowPos

  • Windows NT            Да
  • Win95                Да
  • Win32s                Да
  • Импортируемая библиотека        user32.lib
  • Заголовочный файл            winuser.h
  • Unicode                Нет
  • Замечания по платформе        Не имеется

	

Как обрабатывать сообщения в Delphi

Posted by admin | Delphi, WinAPI, Windows, Окна, Окна | Суббота 12 Январь 2008 21:23

Обработка сообщений означает, что приложение будет тем или иным образом реагировать на полученные от операционной системы сообщения. В стандартном приложении Windows обработка сообщений сосредотачивается в процедурах окна. Delphi, частично обрабатывая сообщения, упрощает работу программиста, позволяя вместо одной процедуры для обработки всех типов сообщений создавать независимые процедуры для обработки сообщений различных типов.

Все процедуры обработки сообщений должны отвечать следующим требованиям:

  • Процедура должна быть методом объекта
  • Процедуре должен передаваться один передаваемый по ссылке параметр, т.е. с помощью описания var. Тип параметра должен быть TMessage или другой, зависящий от типа специализированного сообщения
  • Описание процедуры должно включать ключевое слово message, за которым должна следовать константа, задающая тип обрабатываемого сообщения

Вот пример объявления процедуры, обрабатывающей сообщение WM_Paint

 
procedure WMPaint(var Msg: TWMPaint); message wm_Paint;

соглашение по присвоению имён требует присваивать обработчику сообщения то же имя, что и имя обрабатываемого сообщения, но без символа подчёркивания и указанием первым знаков имени прописными буквами]

В качестве примера напишем процедуру обработки сообщения WM_Paint, которая вместо перерисовки будет выдавать звуковой сигнал:

Для этого сначала нужно объявить процедуру в частных объявлениях (в области Private объекта TForm1):

 
procedure WMPaint(var Msg: TWMPaint); message wm_Paint

Теперь в разделе implementation модуля добавляем определение процедуры (в этом случае указание ключевого слова message не требуется):

 
procedure TForm1.WMPaint(var Msg: TWMPaint);
begin
beep;
inherited;
end;

Обратите внимание на ключевое слово inherited, которое позволяет передать сообщение обработчику этого сообщения, принадлежащему классу-предку, т.е. если бы мы в нашем случае не указали бы это слово, перерисовка окна не осуществлялась бы, а выполнялось бы только только то, что было описано в области реализации нашего приложения, т.е. только бы подавался звуковой сигнал.

PHP: Перекодирование UTF-8 в Windows-1251

Posted by admin | PHP, Кодировки | Вторник 4 Декабрь 2007 19:00

Обычно для перекодирования строк из одной кодировки в другую используют функцию iconv.

[cc lang="php"]

$out=iconv("UTF-8", "WINDOWS-1251", $in);

Однако бывает так, что на некоторых хостингах (обычно бесплатных) данная функция отсутствует.

В таком случае можно использовать функцию работающую на массивах:

[cc lang="php"]

function utf_to_win($str)
{
$str=strtr($str,array("Р°"=>"а","Р±"=>"б","РІ"=>"в","Рі"=>"г","Рґ"=>"д","Рµ"=>"е","С‘"=>"ё",
"Р¶"=>"ж","Р·"=>"з",
"Рё"=>"и","Р№"=>"й","Рє"=>"к","Р»"=>"л","Рј"=>"м","РЅ"=>"н","Рѕ"=>"о","Рї"=>"п",
"СЂ"=>"р","СЃ"=>"с","С‚"=>"т","Сѓ"=>"у","С„"=>"ф","С…"=>"х","С†"=>"ц",
"С‡"=>"ч","С€"=>"ш","С‰"=>"щ","СЉ"=>"ъ","С‹"=>"ы","СЊ"=>"ь",
"СЌ"=>"э","СЋ"=>"ю","СЏ"=>"я",
"Рђ"=>"А","Р‘"=>"Б","Р’"=>"В","Р“"=>"Г","Р”"=>"Д",
"Р•"=>"Е","РЃ"=>"Ё","Р–"=>"Ж","Р—"=>"З","Р˜"=>"И","Р™"=>"Й","Рљ"=>"К","Р›"=>"Л",
"Рњ"=>"М","Рќ"=>"Н","Рћ"=>"О","Рџ"=>"П","Р "=>"Р",
"РЎ"=>"С","Рў"=>"Т","РЈ"=>"У","Р¤"=>"Ф","РҐ"=>"Х",
"Р¦"=>"Ц","Р§"=>"Ч","РЁ"=>"Ш","Р©"=>"Щ","РЄ"=>"Ъ","Р«"=>"Ы",
"Р¬"=>"Ь","Р­"=>"Э","Р®"=>"Ю","РЇ"=>"Я"));
return $str;
}

Начало работы с CakePHP по-русски

Posted by admin | CakePHP, PHP, Фреймворки | Понедельник 5 Ноябрь 2007 14:55

Скоро товарищей, пишущих по старинке веб-страницы на голом php, можно будет показывать в зоопарках :-)
Наступает эра Фреймворков. И это хорошо, потому что программист избавлен от множества рутинных задач,
и может сосредоточиться на создании логики приложения.
В CakePHP используется подход MCV (Model - View - Controller). Теперь вместо одного файла *.php на одну
страничку их будет целых три минимум %) - один для модели (описывает связь формы с базой данных, имеет
расширение php), thtml файл будет описывать внешний вид страницы (view), третий (контроллер страницы с
расширением php будет реализовывать логику формы и будет содержать методы, дополняющие функциональность
родительского класса AppController.
Что ж, начнем печь приложения как пирожки )) Но для этого придется преступить через себя и принять новый подход к программированию. Оно того стоит ^_^

далее...

Хранение настроек программы без INI-файлов и реестра

Posted by admin | Delphi, Интерфейс | Среда 26 Сентябрь 2007 12:27

При хранении настроек программы в INI-файле или реестре довольно трудоемким является считывание этих данных и инициализация внутренних структур/классов, хранящих настройки. Не лучше ли хранить сами эти классы, а еще лучше - форму, которая содержит интерфейс управления настройками программы.

далее...

Delphi: Работа с ресурсами

Posted by admin | Delphi, Работа с ресурсами | Вторник 18 Сентябрь 2007 11:44

Windows поддерживает такие виды ресурсов:

  • RT_ACCELERATOR Accelerator table
  • RT_ANICURSOR Animated cursor
  • RT_ANIICON Animated icon
  • RT_BITMAP Bitmap resource
  • RT_CURSOR Hardware-dependent cursor resource
  • RT_DIALOG Dialog box
  • RT_FONT Font resource
  • RT_FONTDIR Font directory resource
  • RT_GROUP_CURSOR Hardware-independent cursor resource
  • RT_GROUP_ICON Hardware-independent icon resource
  • RT_ICON Hardware-dependent icon resource
  • RT_MENU Menu resource
  • RT_MESSAGETABLE Message-table entry
  • RT_RCDATA Application-defined resource (raw data)
  • RT_STRING String-table entry
  • RT_VERSION Version resource

Самый простой из них это RT_STRING - то есть строковый. Для работы с ним предусмотрено специальное зарезервированное слово - resourcestring.

далее...

Delphi: перетаскивание элементов ListBox

Posted by admin | Delphi, Интерфейс | Четверг 13 Сентябрь 2007 16:30

Если вы хотите принимать перетаскиваемый объект, только если он представляет собой собственный элемент, то в обработчике OnDragOver вставьте строчку "Accept := Source=Sender;". Ниже приведен код, позволяющий сортировать элементы с помощью перетаскивания их мышкой внутри списка компонента. Вам также понадобится таймер для обеспечения функции автопрокручивания. Это означает, что при перетаскивании элемента в верхнюю часть списка, он при необходимости прокручивается вниз, дабы стали видны невидимые в верхней части списка элементы. Если вам не нужно такое поведение компонента, исключите из кода все строчки, имеющие отношение к таймеру, включая вторую строчку в обработчике события OnDragOver.

 
//...
private
{ Private declarations }
GoingUp: Boolean;
 
procedure TForm1.ListBox1DragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Sender = Source) and
(TListBox(Sender).ItemAtPos(Point(X, Y), False) >= 0);
{устанавливаем таймер для автопрокрутки}
if Accept then
with Sender as TListBox do
if Y > Height - ItemHeight then
begin
GoingUp := False;
Timer1.Enabled := True;
end
else if Y > ItemHeight then
begin
GoingUp := True;
Timer1.Enabled := True;
end
else
Timer1.Enabled := False;
end;
 
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject;
X, Y: Integer);
var
NuPos: Integer;
begin
with Sender as TListBox do
begin
NuPos := ItemAtPos(Point(X, Y), False);
if NuPos >= Items.Count then
Dec(NuPos);
Label1.Caption := Format('Перемещено из %d в %d',
[ItemIndex, NuPos]);
Items.Move(ItemIndex, NuPos);
{выделяем перемещенный элемент}
ItemIndex := NuPos;
end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with ListBox1 do
if GoingUp then
if TopIndex > 0 then
TopIndex := TopIndex - 1
else
Timer1.Enabled := False
else if TopIndex < Items.Count - 1 then
TopIndex := TopIndex + 1
else
Timer1.Enabled := False;
end;
 
procedure TForm1.ListBox1EndDrag(Sender, Target: TObject;
X, Y: Integer);
begin
Timer1.Enabled := False;
end;

Delphi: делаем скриншот сайта

Posted by admin | Delphi, Internet, Интерфейс | Четверг 13 Сентябрь 2007 16:28

Данная функция позволяет сделать скриншот сайта с помощью IWebBrower

 
procedure generateJPEGfromBrowser(browser: iWebBrowser2; jpegFQFilename: String;
srcHeight: Integer; srcWidth: Integer; tarHeight: Integer; tarWidth: Integer);
var
sourceDrawRect : TRect;
targetDrawRect: TRect;
sourceBitmap: TBitmap;
targetBitmap: TBitmap;
jpeg: TJPEGImage;
viewObject: IViewObject;
begin
sourceBitmap := TBitmap.Create ;
targetBitmap := TBitmap.Create ;
jpeg := TJPEGImage.Create ;
try
try
sourceDrawRect := Rect(0,0, srcWidth , srcHeight );
sourceBitmap.Width :=  srcWidth ;
sourceBitmap.Height :=  srcHeight ;
 
viewObject := browser as IViewObject;
 
if viewObject = nil then
Exit;
 
OleCheck(viewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, self.Handle,
sourceBitmap.Canvas.Handle, @sourceDrawRect, nil, nil, 0));
 
// Resize Bitmap
targetDrawRect := Rect(0,0, tarWidth, tarHeight);
targetBitmap.Height := tarHeight;
targetBitmap.Width := tarWidth;
targetBitmap.Canvas.StretchDraw(targetDrawRect, sourceBitmap);
 
// Create JPEG from Bitmap and save it
jpeg.Assign(targetBitmap) ;
makeFileWriteable(jpegFQFilename);
jpeg.SaveToFile (jpegFQFilename);
finally
jpeg.free;
sourceBitmap.free ;
targetBitmap.free;
end;
except
// errors
end;
end;

Delphi: Рекурсивный поиск файлов

Posted by admin | Delphi, Файловая система | Суббота 25 Август 2007 04:45

Функция для быстрого рекурсивного поиска файлов в поддиректориях.

 
procedure ScanDir(StartDir, Mask: String; List: TStrings);
var
SearchRec: TSearchRec;
begin
if Mask = '' then Mask:= '*.*';
if StartDir[Length(StartDir)] <> '' then StartDir := StartDir + '';
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
ScanDir(StartDir + SearchRec.Name + '',Mask,List);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

Пример использования:

 
procedure TForm1.Button1Click(Sender: TObject);
var
list: TStrings;
begin
list:= TStringList.Create;
ScanDir('c:', '*.txt', list);
Memo1.Lines:= list;
list.Free;
end;

Потоки и методы их синхронизаций в Delphi

Posted by admin | Delphi, Процессы и потоки | Четверг 23 Август 2007 23:22

Статья призвана дать понятия о процессах, потоках и принципах программирования многопоточных приложений в delphi.

Процесс - экземпляр выполняемого приложения. При запуске приложения происходит выделение памяти под процесс, в часть которой и загружается код программы.

Поток - объект внутри процесса, отвечающий за выполнение кода и получающий для этого процессорное время.

При запуске приложения система автоматически создает поток для его выполнения. Поэтому если приложение однопоточное, то весь код будет выполняться последовательно, учитывая все условные и безусловные переходы.

далее...

Страница 2 из 8«12345678»