DialogBox
begin
...
...
DialogBox(hInstance,PChar(1),0,@DialogProc);
...
...
end;
exports
MyFunction;
Функция находится в DLL
Вопрос: почему после закрытия диалога S и D становятся недоступными, а именно
при вызове SetPixel и GetPixel эти функции
возращают -1.
Если вызывать эти функции до вызова DialogBox(или любой другой, например, MessageBox)
все нормально работает.
Получается, что при создание диалога разрушаются эти два контеста?
Как сделать так, чтобы диалог вызывался в самом начале функции и все параметры, переданные функции можно было использовать в дальнейшем?
Э-э-э. Не стесняся приведи весь код.
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 в конец функции,
картинка обрабатывается(как и без диалога),
потом всплывает окно.
Ясно, что это проклятое окно каким-то образом оказывает негативное воздействие на обработку картинки.
Как поступить?
Цитата:
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)
все нормально работает.
Получается, что при создание диалога разрушаются эти два контеста?
Как сделать так, чтобы диалог вызывался в самом начале функции и все параметры, переданные функции можно было использовать в дальнейшем?
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, а после восстановить
Также пробовал сохранить в других переменных.
Не помогает.
Но работать должно точно, потому что есть примеры других библиотек, в которых при вызове функции сначала создается диалог
а где происходит вызов функции? в WM_PAINT, то есть hdc получается из BeginPaint'a или через GetDC?
Соответственно я не знаю где вызывается функция.
В проге в настройках выбираешь DLL и в окошке
появляются все экпортируемые функции, доступные из DLL. Там же есть так называемое дерево методов. Отмечаешь нужный тебе метод (или методы)
из внешней DLL и перетаскиваешь на это дерево.
Всё. Потом открываешь какую-нибудь картинку появляются два Child-окна(прога имеет MDI-интерфейс) с этим изображением.
Дальше в меню выбираешь метод, каким хочешь обработать и затем собственно происходит обработка.
В одном окне оригинал в другом измененный вариант.
Моя функция работает на ура, но только перед обработкой нужно запрашивать параметры.