Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Transporent


Автор: Гость_welt 7.11.2005, 09:13
Такая проблема. Нужно сделать на winapi, чтобы окно с картинкой (или картинка) расворялось в воздухе. После того, как растворится, появляется основное окно программы. Короче, это типо заставки получается. Знаю, как написать без winapi.
Вот
Код

procedure (); 
var i, cavb : 0..255; 
 begin 
  if AlphaBlend=False then 
   begin 
     AlphaBlendValue:=255; 
     AlphaBlend:=True; 
   end; 
 cavb:=AlphaBlendValue; 
 for i := cavb downto 0 do 
  begin 
   AlphaBlendValue := i; 
   Application.ProcessMessages; 
  end; 
 end;



Автор: _hunter 7.11.2005, 12:13
наверху страницы ссылка по теме...
http://forum.vingrad.ru/index.php?showtopic=54390

P.S.
что такое Transporent?

Автор: rsm 7.11.2005, 20:54
Я в http://forum.vingrad.ru/index.php?showtopic=65327&unread=1 выкладывал маленький пример. Посмотри его и сразу решишь свою задачу наиболее простым и оптимальным способом smile

Автор: Quadr0 7.11.2005, 20:57
...

Автор: Гость_welt 8.11.2005, 00:24
Цитата

Я в этой теме выкладывал маленький пример. Посмотри его и сразу решишь свою задачу наиболее простым и оптимальным способом

rsm !?????? Причем здесь это. Я тебе про прозрачность формы....
а ты мне про какое-то свертывание в правый нижний угол (трей)....

Автор: rsm 8.11.2005, 05:47
Цитата
rsm !?????? Причем здесь это. Я тебе про прозрачность формы....

Слов нет, одно шипение... smile
ПОСТАВЬ ТОЛЬКО ОДНУ ГАЛОЧКУ AW_BLEND!!!

Автор: welt 9.11.2005, 02:25
rsm, я перевел твою программу в делфи вот
Код

const
IDD_MAIN = 1001;
IDD_CHILD = 1002;
IDC_AW_SLIDE = 4003;
IDC_AW_BLEND = 4004;
IDC_AW_CENTER = 4005;
IDC_AW_HOR_POS = 4006;
IDC_AW_HOR_NEG = 4007;
IDC_AW_VER_POS = 4008;
IDC_AW_VER_NEG=  4009;
IDC_EXIT = 4011;

IDC_SHWIN = 4001;
IDC_INTERV = 4013;
IDC_TEXT = 4002;

var
  Form1: TForm1;
  hInst:longword;
  hChildDlg, hShWin:HWND;
 hBrush:LongWord;
 hFont:integer;
fShow:boolean = TRUE;
Params: TCreateParams;


function GetAnimateFlags(hDlg:HWND):DWORD;
var
 dwResult:DWORD;
begin


    if(IsDlgButtonChecked(hDlg, IDC_AW_SLIDE))<>0  then
        dwResult :=dwResult or AW_SLIDE;

    if(IsDlgButtonChecked(hDlg, IDC_AW_BLEND))<>0 then
        dwResult :=dwResult or AW_BLEND;

    if(IsDlgButtonChecked(hDlg, IDC_AW_CENTER))<>0 then
        dwResult :=dwResult or AW_CENTER;

    if(IsDlgButtonChecked(hDlg, IDC_AW_HOR_POS))<>0 then
        dwResult :=dwResult or AW_HOR_POSITIVE;

    if(IsDlgButtonChecked(hDlg, IDC_AW_HOR_NEG))<>0 then
        dwResult :=dwResult or AW_HOR_NEGATIVE;

    if(IsDlgButtonChecked(hDlg, IDC_AW_VER_POS))<>0 then
        dwResult :=dwResult or AW_VER_POSITIVE;

    if(IsDlgButtonChecked(hDlg, IDC_AW_VER_NEG))<>0 then
        dwResult :=dwResult or AW_VER_NEGATIVE;

    result :=dwResult;
end;


function ChildDialogProc( hwndDlg:hwnd; uMsg:uint; WPARAM: wParam; LPARAM: lParam) :boolean; stdcall;
begin
  case (uMsg) of
     WM_INITDIALOG:
       begin
        hBrush:=GetStockObject(NULL_BRUSH);
    hFont:=CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Verdana');
    SendDlgItemMessage(hwndDlg, IDC_TEXT, WM_SETFONT, hFont, 1);
    result:= TRUE;
       end;
     WM_CLOSE:
       begin
       DeleteObject(hBrush);
       DeleteObject(hFont);
       EndDialog(hwndDlg, 0);
       exit;
       end;
     WM_CTLCOLORSTATIC:
       begin
    SetTextColor( wParam, RGB(255, 0, 0));
    SetBkMode( wParam, TRANSPARENT);
    result:=  boolean(hBrush);
       end;
    end;//case
Result:=FALSE;

end;



function MainDialogProc( hwndDlg:hwnd; uMsg:uint; WPARAM: wParam; LPARAM: lParam) :boolean; stdcall;
//{
var
        UINT :LongWord;
    fTrans:LongBool;
begin
    case uMsg of   //

         WM_CLOSE:
            begin
                     EndDialog(hChildDlg, 0);
            EndDialog(hwndDlg, 0);
            exit;
                    end;
         WM_INITDIALOG:
                      begin
            hShWin:= GetDlgItem(hwndDlg, IDC_SHWIN);
                hChildDlg := CreateDialog(hInst, MAKEINTRESOURCE(IDD_CHILD), 0, @ChildDialogProc);
            SetDlgItemInt(hwndDlg, IDC_INTERV, 500, FALSE);
            SetWindowPos(hwndDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
            result:= TRUE;
                      end;
         WM_COMMAND:
                   BEGIN  ////////
            case LOWORD(wParam) of  ////

                 IDC_EXIT:
                                       begin
                    SendMessage(hwndDlg, WM_CLOSE, 0, 0);
                    exit;
                                       end;
                 IDC_SHWIN:
                                       begin
                    uInt := GetDlgItemInt(hwndDlg, IDC_INTERV, fTrans, FALSE);
                    if ( uInt=0) or (fTrans=false)  then
                           begin
                        MessageBox(hwndDlg, 'Invalid interval value!', 'Error', MB_ICONERROR);
                        exit;
                      end;
                    if(fShow)  then
                      begin
                        SetWindowText(hShWin, '&Hide');
                        fShow:=FALSE;
                        AnimateWindow(hChildDlg, uInt, GetAnimateflags(hwndDlg) + AW_ACTIVATE);
                        ShowWindow(hChildDlg, SW_SHOW);
                     end
                                       else
                                         begin
                        SetWindowText(hShWin, '&Show');
                        fShow:=TRUE;
                        AnimateWindow(hChildDlg, uInt, GetAnimateFlags(hwndDlg) + AW_HIDE);
                        ShowWindow(hChildDlg, SW_HIDE);
                    end;
                                       exit;
                                 end;//IDC_SHWIN

                        End;//case LOWORD(wParam)
                   exit;
         end; // WM_COMMAND
    end; //case uMsg

result:=FALSE;
end;


Только у меня возник вопрос. Как ты создал окно? С помощью DIALOGEX ??
А как для Делфи быть? Куда мне внедрить переведенный мною код?
Я попробовал создать окно с CreateWindow.
Вот
Код

program CreateWindow;

uses
  Windows,messages;

{$R *.res}

var
  WindowClass: WndClassEx;
  Wnd: HWnd;
  Msg: TMsg;

function MainWinProc(hWnd : HWND; msg : uInt; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;

begin
case msg of
 WM_Paint   : exit;
 WM_DESTROY : PostQuitMessage(0);
end;
result := DefWindowProc(hWnd,msg,wParam,lParam);


end;

begin
WindowClass.cbSize:=sizeof(WndClassEx);
WindowClass.style:=CS_DBLCLKS or CS_OWNDC or CS_HREDRAW or CS_VREDRAW;
WindowClass.lpfnWndProc:= @MainWinProc ;
WindowClass.cbClsExtra:=0;
WindowClass.cbWndExtra:=0;
WindowClass.hInstance:=hinstance;
WindowClass.hIcon:=LoadIcon(0,IDI_APPLICATION);
WindowClass.hCursor:=LoadCursor(0, IDC_ARROW);
WindowClass.hbrBackground:=GetStockObject(GRAY_BRUSH);
WindowClass.lpszMenuName:=0;
WindowClass.lpszClassName:='WindowClass';
WindowClass.hIconSm:=LoadIcon(0,IDI_APPLICATION);



RegisterClassEx(WindowClass);
Wnd:= CreateWindowEx(0, 'WindowClass',
'Окно', WS_OVERLAPPEDWINDOW+WS_VISIBLE, 100, 100, 500, 400, 0, 0, HInstance, nil);
ShowWindow(Wnd, CmdShow);
UpdateWindow(Wnd);
while GetMessage(Msg, 0, 0, 0) do
begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;
//result:=msg.wParam;

end.


КАк мне внедрить твой код в программку для создания окна, что приведена выше.. Короче, хочу чтобы твой пример запускался на делфи. Т.е полностью перевести его... Помоги.

Автор: p0s0l 9.11.2005, 08:17
Код

function MainWinProc(hWnd : HWND; msg : uInt; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;    
begin    
case msg of    
 WM_Paint   : exit;
 WM_DESTROY : PostQuitMessage(0);
 WM_CLOSE   : AnimateWindow(Wnd, 200, AW_HIDE or AW_BLEND);
end;

...

Wnd:= CreateWindowEx(0, 'WindowClass',    
'Окно', WS_OVERLAPPEDWINDOW, 100, 100, 500, 400, 0, 0, HInstance, nil);
AnimateWindow(Wnd, 200, AW_ACTIVATE or AW_BLEND);    
while GetMessage(Msg, 0, 0, 0) do    
begin    
  TranslateMessage(Msg);    
  DispatchMessage(Msg);    
end;    

Автор: rsm 9.11.2005, 13:42
Цитата(welt @ 9.11.2005, 04:25)
Т.е полностью перевести его... Помоги.

Enjoy! smile

Автор: welt 9.11.2005, 18:59
rsm, Спасибо. Расскажи еще как ты создал .res файл.
Я открыл его Restorator'ом. А как создавать такие файлы не знаю. Попробовал-не получилось.

Автор: rsm 9.11.2005, 19:41
Цитата(welt @ 9.11.2005, 20:59)
Расскажи еще как ты создал .res файл.

Использовал стандартный компилятор ресурсов rc.exe из Visual C++. Пишешь "rc rsrc.rc" и получаешь rsrc.res.

Автор: welt 9.11.2005, 20:51
Цитата
Пишешь "rc rsrc.rc" и получаешь rsrc.res

rsm! Так то оно так. Но ведь ты как-то создавал диалог, добавлял кнопки и CheckBox'ы. Как?. А где ты написал обработчики для кнопок (Exit, Show) и для Edit?????

Автор: rsm 9.11.2005, 23:29
Цитата(welt @ 9.11.2005, 22:51)
создавал диалог, добавлял кнопки и CheckBox'ы

Лучше и проще всего взять для этого http://radasm.visualassembler.com/projects/ResEd.zip (395 Кб).

Цитата(welt @ 9.11.2005, 22:51)
А где ты написал обработчики для кнопок (Exit, Show) и для Edit?

В коде однако.
Код

      WM_COMMAND:
         case LOWORD(wParam) of
            IDC_EXIT:
               // обработчик кнопки "Exit"
               SendMessage(hDlg, WM_CLOSE, 0, 0);

            IDC_SHWIN:
               begin 
                  // обработчик кнопки "Show/Hide"

Код

            // текст в текстовом поле = "500"
            SetDlgItemInt(hDlg, IDC_INTERV, 500, false);
...
                  // uInt = число из текстового поля
                  uInt:= GetDlgItemInt(hDlg, IDC_INTERV, fTrans, false);
                  // проверка на корректность числа (не равно 0)
                  if (uInt = 0) or (not fTrans) then
                     begin
                        MessageBox(hDlg, 'Invalid interval value!', 'Error', MB_ICONERROR);
                        exit;
                     end;

Автор: Guest 10.11.2005, 00:21
rsm Так этот ResEd открывает только *.rc (для С), а не *.res (для Делфи)
А где ты обработчики для CheckBox'ов писал?

Автор: rsm 10.11.2005, 14:53
Цитата(Guest @ 10.11.2005, 02:21)
Так этот ResEd открывает только *.rc

Разумеется, ведь это редактор ресурсов. Создаешь новый диалог, кидаешь на него контролы, сохраняешь, компилируешь с rc.exe и получаешь файл ресурсов *.res, который потом можно подсунуть любому нормальному компилятору.

Цитата(Guest @ 10.11.2005, 02:21)
А где ты обработчики для CheckBox'ов писал?

Код

    if IsDlgButtonChecked(hDlg, IDC_AW_SLIDE) <> 0 then
...

Автор: welt 10.11.2005, 22:52
Выше p0s0l писал, что для того, чтобы окно исчезало при закрытии надо дописать:
Код

WM_CLOSE   : AnimateWindow(Wnd, 200, AW_HIDE or AW_BLEND);

в функцию MainWinProc
А также после строчки
Wnd:= CreateWindowEx...............
написать еще раз
Код

AnimateWindow(Wnd, 200, AW_ACTIVATE or AW_BLEND);    


А как сделать это но для появления окна. Т.е чтобы оно не расворялось при закрытии, а появлялось при создании?
Пробовал дописывать WM_CREATE: .... и WM_SHOW: ....
не получается.

Автор: rsm 11.11.2005, 08:37
Добавь пару строк в код p0s0l:
Код

Wnd:= CreateWindowEx(0, 'WindowClass',     
'Окно', WS_OVERLAPPEDWINDOW, 100, 100, 500, 400, 0, 0, HInstance, nil);    
UpdateWindow(Wnd);
AnimateWindow(Wnd, 200, AW_ACTIVATE or AW_BLEND);     
ShowWindow(Wnd, SW_SHOW);
while GetMessage(Msg, 0, 0, 0) do     
begin     
  TranslateMessage(Msg);     
  DispatchMessage(Msg);     
end; 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)