Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DialogBox

7.8K
31 января 2005 года
thunder
16 / / 31.01.2005
function MyFunction(S,D:HDC):boolean;stdcall
begin
...
...
DialogBox(hInstance,PChar(1),0,@DialogProc);
...
...
end;
exports
MyFunction;
Функция находится в DLL

Вопрос: почему после закрытия диалога S и D становятся недоступными, а именно
при вызове SetPixel и GetPixel эти функции
возращают -1.
Если вызывать эти функции до вызова DialogBox(или любой другой, например, MessageBox)
все нормально работает.
Получается, что при создание диалога разрушаются эти два контеста?
Как сделать так, чтобы диалог вызывался в самом начале функции и все параметры, переданные функции можно было использовать в дальнейшем?
301
01 февраля 2005 года
lord Kelvin
897 / / 08.11.2004
Э-э-э. Не стесняся приведи весь код.
7.8K
01 февраля 2005 года
thunder
16 / / 31.01.2005
Не стесняясь привожу код.
type
TGaugeProc=Procedure(Percent:byte);stdcall;

Function Noise(Source,Dest:HDC;
Width, Height:integer;
Gauge:TGaugeProc):boolean;stdcall;

var
i,j,bright,R,c: integer;
color: LongInt;
K,P,t: real;
begin
{DialogBox(hInstance,PChar(1),0,@DialogProc);}
t:=0.0;
K:=300.0;
P:=0.4;
for i:=1 to 6 do
t:=t + Random;
t:=(t/6)-0.5;
R:=Trunc(t*K);
for i:=1 to Height do
begin
for j:=1 to Width do
begin
color:=GetPixel(Source,j-1,i-1);
bright:=(((Color and $FF0000) shr 16) +
((Color and $FF00) shr 8) +
(Color and $FF) ) div 3;
if (Random<=P) then
begin
c:=bright + R;
if (c>255) then c:=255;
if (c<0) then c:=0;
end
else
c:=bright;
color:=$2000000 or RGB(c,c,c);
SetPixel(Dest,j-1,i-1,Color);
end;
Gauge( i*100 div Height);
end;
Result:=true;
end;
Функция считывает каждый пиксел из Source,
меняет яркость и вставляет в Dest(короче зашумляет исходное изображение)
Проблема в том, что параметры K и P
должен задавать user, т.е. перед обработкой надо
отображать диалог для ввода этих параметров
Как это сделать(только через API)?
Пробовал через DialogBox(как в листинге)
DialogProc выглядела так:

Function DialogProc(wnd:HWND;
Msg : Integer;
wParam: WPARAM;
lParam: LPARAM):boolean;stdcall;

var nCode, ctrlID, uCmdType: word;
begin
case msg of
WM_COMMAND :
begin
nCode:=hiWord(wParam);
ctrlID:=loWord(wParam);
case ctrlID of
IDOK :
begin
Result:=true;
end;

IDCANCEL :
begin
Result:=true;
EndDialog(wnd,1);
end;
end;
end;
end;
Result:=false;
end;
Окошко-то появляется, но после закрытия код, идущий после DialogBox не выполняется,
т.е. изображение не обрабатывется.
Для прикола переставил DialogBox в конец функции,
картинка обрабатывается(как и без диалога),
потом всплывает окно.
Ясно, что это проклятое окно каким-то образом оказывает негативное воздействие на обработку картинки.
Как поступить?
259
01 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by thunder
function MyFunction(S,D:HDC):boolean;stdcall
begin
...
...
DialogBox(hInstance,PChar(1),0,@DialogProc);
...
...
end;
exports
MyFunction;
Функция находится в DLL

Вопрос: почему после закрытия диалога S и D становятся недоступными, а именно
при вызове SetPixel и GetPixel эти функции
возращают -1.
Если вызывать эти функции до вызова DialogBox(или любой другой, например, MessageBox)
все нормально работает.
Получается, что при создание диалога разрушаются эти два контеста?
Как сделать так, чтобы диалог вызывался в самом начале функции и все параметры, переданные функции можно было использовать в дальнейшем?


Попробуй перед вызовом DialogBox сохранить S и D, а после восстановить

7.8K
01 февраля 2005 года
thunder
16 / / 31.01.2005
Пробовал сохранить через SaveDC и потом восстановить через RestoreDC.
Также пробовал сохранить в других переменных.
Не помогает.
Но работать должно точно, потому что есть примеры других библиотек, в которых при вызове функции сначала создается диалог
356
01 февраля 2005 года
molnij
159 / / 20.06.2000
а где происходит вызов функции? в WM_PAINT, то есть hdc получается из BeginPaint'a или через GetDC?
7.8K
01 февраля 2005 года
thunder
16 / / 31.01.2005
Сама прога, из которой вызывается функция готовая, т.е. только exe'шник.
Соответственно я не знаю где вызывается функция.
В проге в настройках выбираешь DLL и в окошке
появляются все экпортируемые функции, доступные из DLL. Там же есть так называемое дерево методов. Отмечаешь нужный тебе метод (или методы)
из внешней DLL и перетаскиваешь на это дерево.
Всё. Потом открываешь какую-нибудь картинку появляются два Child-окна(прога имеет MDI-интерфейс) с этим изображением.
Дальше в меню выбираешь метод, каким хочешь обработать и затем собственно происходит обработка.
В одном окне оригинал в другом измененный вариант.
Моя функция работает на ура, но только перед обработкой нужно запрашивать параметры.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог