Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
program skincore;
 
uses
  Windows, Messages, CommCtrl;
 
const
  szClassName     = 'VanillaClass';
  RC_BUTTON_PLAY  = 102;
 
var
  hApp       : THandle;
  szSkinPath : WideString;
  hInstanceW : Thandle;
  hImLst     : HIMAGELIST;
  hImBmp     : HBITMAP;
  MouseOver_ :hIcon;
  PlayIsMouse:Boolean;
  PlayBtnProc:Pointer;
 
procedure CenterWindow(hWindow: THandle);
var
  WndRect : TRect;
  iWidth  : Integer;
  iHeight : Integer;
begin
  GetWindowRect(hWindow, WndRect);
  iWidth := WndRect.Right - WndRect.Left;
  iHeight := WndRect.Bottom - WndRect.Top;
  WndRect.Left := (GetSystemMetrics(SM_CXSCREEN) - iWidth) div 2;
  WndRect.Top := (GetSystemMetrics(SM_CYSCREEN) - iHeight) div 2;
  MoveWindow(hWindow, WndRect.Left, WndRect.Top, iWidth, iHeight, FALSE);
end;
 
{}
procedure PaintImageFileButton(DC: HDC; Rect: TRect; szPathFile: WideString);
var
  NewBmp: HBITMAP;
  OldBmp: HBITMAP;
  CompDC: HDC;
begin
  CompDC := CreateCompatibleDC(0);
  NewBmp := LoadImageW(0, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  OldBmp := SelectObject(CompDC, NewBmp);
  BitBlt(DC, 0, 0, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, CompDC, 0, 0, SRCCOPY);
  SelectObject(CompDC, OldBmp);
  DeleteDC(CompDC);
  DeleteObject(NewBmp);
end;
 
{}
procedure GetBitmapRect(szPathFile: WideString; var plRect: TRect);
var
  Bitmap: HBITMAP;
  bInfo : TBitmapInfo;
begin
  Bitmap := LoadImageW(0, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  GetObject(Bitmap, SizeOf(bInfo), @bInfo);
  plRect.Right := bInfo.bmiHeader.biWidth;
  plRect.Bottom := bInfo.bmiHeader.biHeight;
  DeleteObject(Bitmap);
end;
 
function DrawPlayButton(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  lpPoint: TPoint;
  lpRect : TRect;
begin
  case uMsg of
    WM_MOUSEMOVE:
      begin
        GetCursorPos(lpPoint);
        GetWindowRect(hWnd, lpRect);
        if PtInRect(lpRect, lpPoint) then
          begin
            if GetCapture <> hWnd then
              begin
                SetCapture(hWnd);
                PlayIsMouse := TRUE;
              end;
          end
        else
          begin
            ReleaseCapture;
            PlayIsMouse := FALSE;
          end;
        InvalidateRect(hWnd, nil, FALSE);
      end;
  end;
  Result := CallWindowProcW(PlayBtnProc, hWnd, uMsg, wParam, lParam);
end;
 
{}
function MainWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  lpRect : TRect;
  lpPaint: TPaintStruct;
  lpdis  : PDrawItemStruct;
begin
  Result := 0;  
  case uMsg of
    {}
    WM_CREATE:
      begin
        hApp := hWnd;
        { устанавливаем путь к директории с файлами для оболочки }
        szSkinPath := WideString(ExtractFilePathW(ParamStrW)) + 'images' + '\';
 
        { загружаем настройки оболочки для отображения картинок на окнах }
        GetBitmapRect(WideString(szSkinPath + 'main_window_normal.bmp'), lpRect);
        SetWindowLongW(hApp, GWL_EXSTYLE, GetWindowLong(hApp, GWL_EXSTYLE) or WS_EX_LAYERED);
        SetLayeredWindowAttributes(hApp, RGB(255, 0, 255), (255 * 85) div 100, LWA_COLORKEY + LWA_ALPHA);
        SetWindowPos(hApp, 0, 0, 0, lpRect.Right, lpRect.Bottom, SWP_NOZORDER);
 
        {}
        GetBitmapRect(WideString(szSkinPath + 'play_button_normal.bmp'), lpRect);
        CreateWindowExW(0, 'STATIC', '', SS_OWNERDRAW or WS_CHILD or WS_VISIBLE or WS_TABSTOP, 85, 32, lpRect.Right, lpRect.Bottom, hApp, RC_BUTTON_PLAY, hInstanceW, nil);
 
        { создаем список с изображениями }
        hImBmp := LoadImageW(0, PWideChar(WideString(ExtractFilePathW(ParamStrW)) + 'testbmp.bmp'), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        hImLst := ImageList_Create(lpRect.Right, lpRect.Bottom, ILC_COLOR32, 4, 0);
        ImageList_Add(hImLst, hImBmp, hImBmp);
        //ImageList_SetBkColor(hImLst, RGB(255, 0, 255));
        //MouseOver := ImageList_GetIcon(hImLst, 1, ILD_NORMAL);
 
        PlayBtnProc := Pointer(GetWindowLongW(GetDlgItem(hApp, RC_BUTTON_PLAY), GWL_WNDPROC));
        SetWindowLongW(GetDlgItem(hApp, RC_BUTTON_PLAY), GWL_WNDPROC, LongInt(@DrawPlayButton));
 
        { создаем регионы для окон кнопок }
//        BitmapToRegion(GetDlgItem(hApp, RC_BUTTON_PLAY), WideString(ExtractFilePathW(ParamStrW) + 'testbmp.bmp'), TRUE);
        CenterWindow(hApp);
      end;
 
    {}
    WM_PAINT:
      begin
        //
        BeginPaint(hApp, lpPaint);
        GetClientRect(hApp, lpRect);
        PaintImageFileButton(lpPaint.hDC, lpRect, WideString(szSkinPath + 'main_window_normal.bmp'));
        EndPaint(hApp, lpPaint);
        //
//        BeginPaint(GetDlgItem(hApp, RC_BUTTON_PLAY), lpPaint);
//        GetClientRect(GetDlgItem(hApp, RC_BUTTON_PLAY), lpRect);
 
//        if PlayIsMouse then
//          begin
//            DrawIconEx(lpPaint.hDC, lpRect.Left, lpRect.Top, PlayIsMouse, 46, 46, 0, 0, DI_NORMAL);
//            DrawTextW(lpPaint.hDC, PWideChar(WideString('yes')), -1, lpRect, DT_LEFT or DT_WORDBREAK or DT_VCENTER);
//          end
//        else
//          begin
//            DrawIconEx(lpPaint.hDC, lpRect.Left, lpRect.Top, ImageList_GetIcon(hImLst, 0, ILD_NORMAL), 46, 46, 0, 0, DI_NORMAL);
//            DrawTextW(lpPaint.hDC, PWideChar(WideString('not')), -1, lpRect, DT_LEFT or DT_WORDBREAK or DT_VCENTER);
//          end;
 
//        EndPaint(GetDlgItem(hApp, RC_BUTTON_PLAY), lpPaint);
        //
        //Result := 0;
      end;
 
    {}
    WM_DRAWITEM:
      begin
        lpdis := PDrawItemStruct(lParam);
        case lpdis.CtlType of
          ODT_STATIC:
            begin
              case lpdis.CtlID of
                RC_BUTTON_PLAY:
                  begin
                    if (lpdis.itemState and ODS_SELECTED) <> 0 then
                      DrawTextW(lpdis.hDC, PWideChar(WideString('press')), -1, lpdis.rcItem, DT_LEFT or DT_WORDBREAK or DT_VCENTER)
                    else
                      DrawTextW(lpdis.hDC, PWideChar(WideString('normal')), -1, lpdis.rcItem, DT_LEFT or DT_WORDBREAK or DT_VCENTER);
//                    if PlayIsMouse and not ((lpdis.itemState and ODS_SELECTED) <> 0) then
//                      DrawTextW(lpdis.hDC, PWideChar(WideString('hover')), -1, lpdis.rcItem, DT_LEFT or DT_WORDBREAK or DT_VCENTER);
//                    if (lpdis.itemState and ODS_DISABLED) <> 0 then
//                      DrawTextW(lpdis.hDC, PWideChar(WideString('disable')), -1, lpdis.rcItem, DT_LEFT or DT_WORDBREAK or DT_VCENTER);
                  end;
              end;
            end;
        end;
      end;
    {}
    WM_CLOSE, WM_DESTROY:
      begin
        DeleteObject(hImLst);
        PostQuitMessage(0);
      end;
  {}    
  else  
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);  
  end;  
end;
 
var
  wCls: TWndClassExW;
  uMsg: TMsg;
  hDlg: Thandle;
begin
  InitCommonControls;
  hInstanceW := GetModuleHandleW(nil);
 
  ZeroMemory(@wCls, SizeOf(wCls));
  wCls.cbSize        := SizeOf(TWndClassExW);
  wCls.style         := CS_HREDRAW or CS_VREDRAW;
  wCls.lpfnWndProc   := @MainWndProc;
  wCls.cbClsExtra    := 0;
  wCls.cbWndExtra    := 0;
  wCls.hInstance     := hInstanceW;
  wCls.hIcon         := 0;
  wCls.hCursor       := LoadImageW(0, PWideChar(IDC_ARROW), IMAGE_CURSOR, 16, 16, LR_LOADTRANSPARENT or LR_SHARED);
  wCls.hbrBackground := COLOR_BTNFACE + 1;
  wCls.lpszMenuName  := nil;
  wCls.lpszClassName := szClassName;
  RegisterClassExW(wCls);
 
  hDlg := CreateWindowExW(WS_EX_LAYERED or WS_EX_TOOLWINDOW or WS_EX_TOPMOST, PWideChar(WideString(szClassName)), PWideChar(WideString(szClassName)), WS_POPUP or WS_SYSMENU or WS_OVERLAPPED or WS_SYSMENU, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 0, 0, 0, 0, hInstanceW, nil);
  ShowWindow(hDlg, SW_SHOWNORMAL);
  UpdateWindow(hDlg);
 
  while GetMessageW(uMsg, 0, 0, 0) do
    if not (IsDialogMessageW(hDlg, uMsg)) then
      begin
        TranslateMessage(uMsg);
        DispatchMessageW(uMsg);
      end;
 
  UnRegisterClassW(wCls.lpszClassName, hInstanceW);
  DestroyWindow(hDlg);
  //ExitCode := uMsg.wParam;
end.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 09:36 06-12-2008 | Исправлено: Maks150988, 13:05 06-12-2008
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru