Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2008, 13:39   #1
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию Вывод HBITMAP

Рисую на окне HBITMAP но если переместить окно за пределы экрана то пропадают все остальные контролы
Static и Button'ы я вроде смог вернуть, но ListView не получается.
Код:
procedure ShowBitMap(Wnd: HWND; Bit: HBITMAP; X, Y: Integer);
var
  BitMap: TBitmap;
  Width, Height: Integer;
  DC, DCMem: HDC;
  OldBitmap: HBITMAP;
begin
  GetObject(Bit, SizeOf(BITMAP), @BitMap);
  Height:=BitMap.bmHeight;
  Width:=BitMap.bmWidth;
  DC:=GetDC(Wnd);
  DCMem:=CreateCompatibleDC(DC);
  OldBitmap:=HBITMAP(SelectObject(DCMem, Bit));
  //HBITMAP OldBitmap=SelectBitmap(hdc,Bit);
  BitBlt(DC, X, Y, Width, Height, DCMem, 0, 0, SRCCOPY);    //PATCOPY
  SelectObject(DCMem, OldBitmap);
  //SelectBitmap(hdcMem,OldBitmap);
  ReleaseDC(Wnd, DC);
  DeleteDC(DCMem);
end;
...
  WM_PAINT:
  begin
    SetBkMode(GetDC(WindowCaptionStatic), TRANSPARENT);
    HDCClient:=BeginPaint(UsersWindow, PaintStruct);
    GetClientRect(UsersWindow, WndRect);
    PaintStruct.rcPaint:=WndRect;
    BitBlt(HDCClient, 0, 0, 315, 332, UsersBackground, 0, 0, SRCAND);
    ReleaseDC(UsersWindow, HDCWindow);}

    ShowBitMap(UsersWindow, UsersBackground, 0, 0);
    EndPaint(UsersWindow, PaintStruct);
    //Восстанавливаю элементы
    GetWindowText(WindowCaptionStatic, TmpAChar, GetWindowTextLength(WindowCaptionStatic) + 1);
    SetWindowText(WindowCaptionStatic, TmpAChar);
    GetWindowText(AddUser, TmpAChar, GetWindowTextLength(AddUser) + 1);
    SetWindowText(AddUser, TmpAChar);
    GetWindowText(ChangeUser, TmpAChar, GetWindowTextLength(ChangeUser) + 1);
    SetWindowText(ChangeUser, TmpAChar);   
    GetWindowText(DeleteUser, TmpAChar, GetWindowTextLength(DeleteUser) + 1);
    SetWindowText(DeleteUser, TmpAChar);   
    GetWindowText(OK, TmpAChar, GetWindowTextLength(OK) + 1);
    SetWindowText(OK, TmpAChar);
  end;
AidarBik вне форума Ответить с цитированием
Старый 27.07.2008, 16:32   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,543
По умолчанию

После отрисовки тебе нужно вызвать стандартный виндовый обработчик:
DefWindowProc (Wnd, WM_PAINT, wParam, lParam);
Arigato вне форума Ответить с цитированием
Старый 28.07.2008, 17:23   #3
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Все равно не показывается ListView
AidarBik вне форума Ответить с цитированием
Старый 28.07.2008, 18:55   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,543
По умолчанию

Полностью код обработчика сообщений приведите.
Arigato вне форума Ответить с цитированием
Старый 28.07.2008, 18:57   #5
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Код:
function UsersWindowProc(Wnd: HWND; Msg: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  //TmpDC: HDC;
  PaintStruct: tagPAINTSTRUCT;
  HDCClient, HDCWindow: HDC;
  WndRect: TRect;
  TmpAChar: Array [0..255] of Char;
  CursorPos: TPoint;
begin
  Result:=0;
  //GetWindowRect(Wnd, WndRect);
  //DrawGradient(GetDC(Wnd), WndRect, False, [$00000000, $FFFFFFFF]);
  case Msg of
  WM_PAINT:
  begin
    SetBkMode(GetDC(WindowCaptionStatic), TRANSPARENT);
    HDCClient:=BeginPaint(UsersWindow, PaintStruct);
    GetClientRect(UsersWindow, WndRect);
    PaintStruct.rcPaint:=WndRect;
    {HDCWindow:=GetWindowDC(UsersWindow);
    //TmpDC:=GetDC(UsersWindow);
    BitBlt(HDCClient, 0, 0, 315, 332, UsersBackground, 0, 0, SRCAND);
    ReleaseDC(UsersWindow, HDCWindow);}

    ShowBitMap(UsersWindow, UsersBackground, 0, 0);
    EndPaint(UsersWindow, PaintStruct);

    GetWindowText(WindowCaptionStatic, TmpAChar, GetWindowTextLength(WindowCaptionStatic) + 1);
    SetWindowText(WindowCaptionStatic, TmpAChar);
    GetWindowText(AddUser, TmpAChar, GetWindowTextLength(AddUser) + 1);
    SetWindowText(AddUser, TmpAChar);
    GetWindowText(ChangeUser, TmpAChar, GetWindowTextLength(ChangeUser) + 1);
    SetWindowText(ChangeUser, TmpAChar);   
    GetWindowText(DeleteUser, TmpAChar, GetWindowTextLength(DeleteUser) + 1);
    SetWindowText(DeleteUser, TmpAChar);   
    GetWindowText(OK, TmpAChar, GetWindowTextLength(OK) + 1);
    SetWindowText(OK, TmpAChar);
    //RedrawWindow(WindowCaptionStatic, GetRectOfWindow(WindowCaptionStatic), 0, 0);
    //DeleteDC(TmpDC);
    SendMessage(UsersListView, WM_PAINT, 0, 0);
    SetBkMode(GetDC(OK), TRANSPARENT);
  end;
  WM_CREATE:
  begin
    UsersBackground:=LoadImage(0, PChar(ExtractFilePath(ParamStr(0)) + 'Skins\Default\Users-Background.bmp'), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    with Tray do
    begin
      cbSize:=SizeOf(TNotifyIconData);
      Wnd:=Wnd;
      uID:=13;
      uFlags:=NIF_MESSAGE + NIF_ICON + NIF_TIP;
      //StrCopy(szTip, ProgrammName);
      //hIcon:=GetIcon();
      uCallBackMessage:=WM_USER + 13;
    end;
    Tray.Wnd:=Wnd;
    Shell_NotifyIcon(NIM_ADD, @Tray);
    TrayMenu:=CreatePopupMenu;
    AppendMenu(TrayMenu, MF_STRING or MF_DEFAULT, 1, 'Учетные записи...');
    AppendMenu(TrayMenu, MF_SEPARATOR, 0, nil);
    SubMenu:=CreatePopupMenu;
    AppendMenu(SubMenu, MF_STRING or mf_, 3, '1 минуту');
    AppendMenu(SubMenu, MF_STRING, 4, '2 минуты');
    AppendMenu(SubMenu, MF_STRING, 5, '5 минут');
    AppendMenu(SubMenu, MF_STRING, 6, '10 минут');
    AppendMenu(SubMenu, MF_STRING or MF_SEPARATOR, 0, nil);
    AppendMenu(SubMenu, MF_STRING, 7, 'Другое...');
    AppendMenu(TrayMenu, MF_STRING or MF_POPUP, SubMenu, 'Проверять каждые');       
    AppendMenu(TrayMenu, MF_STRING, 8, 'Проверить сейчас');
    AppendMenu(TrayMenu, MF_STRING, 9, 'Запускать вместе с Windows');
    AppendMenu(TrayMenu, MF_STRING, 10, 'Оповещать при любом изменении');
    AppendMenu(TrayMenu, MF_STRING, 11, 'Настройки...');
    AppendMenu(TrayMenu, MF_SEPARATOR, 0, nil);
    AppendMenu(TrayMenu, MF_STRING, 13, 'О программе...');
    AppendMenu(TrayMenu, MF_STRING, 666, 'Выход');
    SetMenu(Wnd, TrayMenu);
  end;
  WM_COMMAND:
  begin
    case LOWORD(wParam) of
    //1: ;//ModifyMenu(TrayMenu, 0, MF_BYPOSITION or MF_STRING, 1, 'Запускать вместе с Windows');
    //2: ;

    666: SendMessage(UsersWindow, WM_DESTROY, 0, 0);
    end;
  end;
  WM_USER + 13:
  case lParam of
  WM_RBUTTONUP:
  begin
    GetCursorPos(CursorPos);
    SetForegroundWindow(Wnd);
    TrackPopupMenu(TrayMenu, TPM_RIGHTBUTTON, CursorPos.X, CursorPos.Y, 0, Wnd, nil);
    PostMessage(Wnd, WM_NULL, 0, 0);
  end;
  end;
  WM_SHOWWINDOW: LoadUsersList;
  WM_CLOSE: ShowWindow(Wnd, SW_HIDE);
  WM_DESTROY:
  begin
    SetLength(Users, 0);
    ShowWindow(AddUserWindow, SW_HIDE);
    ShowWindow(Wnd, SW_HIDE);
    DeleteObjects([UsersWindow, WindowCaptionStatic, UsersListView, AddUser, ChangeUser, DeleteUser, OK]);
    Shell_NotifyIcon(NIM_DELETE, @Tray);
    PostQuitMessage(0);
    Exit;
  end;
  WM_NCHITTEST: Result:=HTCAPTION;
  else
  Result:=DefWindowProc(Wnd, Msg, wParam, lParam);
  end;
end;
AidarBik вне форума Ответить с цитированием
Старый 28.07.2008, 19:24   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,543
По умолчанию

И все равно я не вижу в обработчике события WM_PAINT вызова DefWindowProc
Попробуйте так:
Код:
   WM_PAINT:  
   begin  
     SetBkMode(GetDC(WindowCaptionStatic), TRANSPARENT);  
     HDCClient:=BeginPaint(UsersWindow, PaintStruct);  
     GetClientRect(UsersWindow, WndRect);  
     PaintStruct.rcPaint:=WndRect;  
     ShowBitMap(UsersWindow, UsersBackground, 0, 0);  
     EndPaint(UsersWindow, PaintStruct);  
     SetBkMode(GetDC(OK), TRANSPARENT);  
     DefWindowProc (Wnd, WM_PAINT, wParam, lParam);
   end;
Arigato вне форума Ответить с цитированием
Старый 28.07.2008, 19:29   #7
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Я его уже стер потом.
С ним все равно не получается.
AidarBik вне форума Ответить с цитированием
Старый 30.07.2008, 14:21   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Не нужно вызывать DefWindowProc из WM_PAINT. Нужно установить стиль WS_CLIPCHILDREN для главного окна.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постраничный вывод из БД на PHP mjc66 PHP 11 03.08.2009 11:31
Загрузить картинку из файла jpg в hbitmap romets Win Api 5 15.08.2008 02:51
Как из DIBSECTION востановить HBITMAP drd Win Api 1 06.03.2008 22:01
Вывод в label forumu Помощь студентам 9 19.11.2007 21:36
Как из ImageList получить HBITMAP нужного мне bitmap. reiserfs Win Api 6 12.11.2007 21:13