Проблемка ...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
AT8675309
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.01.2004 (Вт) 13:20

Проблемка ...

Сообщение AT8675309 » 02.09.2004 (Чт) 18:35

Как сделать подмену фонового рисунка рабочего стола, чтобы не было моргания ? :)

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.09.2004 (Пт) 12:01

Во всех случаях, когда хочешь избежать моргания при перерисовке, используй SendMessage() с оконным сообщением WM_SETREDRAW. При этом для запрета перерисовки в параметр wParam суешь 0, а для разрешения - 1. Правда, я иногда сталкивался с тем, что некоторые контролы игнорируют это сообщение - TreeView, например...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.09.2004 (Пт) 12:54

Ещё есть онтопичная функция - LockWindowUpdate, запрещает рассылку окну валидных hDC в WM_PAINT.
Изображение

AT8675309
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.01.2004 (Вт) 13:20

Спасибо всем(Огомное)

Сообщение AT8675309 » 03.09.2004 (Пт) 14:36

:lol:
Спасибо !
Очень ПОЛЕЗНОЙ много информации, никогда столько ПОЛЕЗНОЙ не получал(Очеь часто получал бесполезную).
Ещё раз спасибо !
:lol:

tyomitch:
Может и не сработает для "Desktop" ...

AT8675309
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.01.2004 (Вт) 13:20

Не получилось

Сообщение AT8675309 » 03.09.2004 (Пт) 17:46

После unlock, продолжают моргать иконки значков и всё, что находится на desktop. :(

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 03.09.2004 (Пт) 17:49

Так. А теперь будь добр, опиши, что именно ты хочешь сделать. Например, с какой частотой ты осуществляешь эту операцию подмены ;)

AT8675309
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 20.01.2004 (Вт) 13:20

Та же

Сообщение AT8675309 » 04.09.2004 (Сб) 17:05

Хм. Хм.
Я вот задумался: "А можно ли рисовать на рабочем столе ?". Итогда все проблемы с морганием закончутся. Так как ?

А с какой частотой надо(Прежде я выводил с частотой по специальной формуле "Как попало" ) ?

Или в DirectDraw 7 я видел процедуру WaitTillOk, может и в этом случае можно подождать, и когда луч будет переходить с право-нижнего конца в лево-верхний, начать таки менять заставку ...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.09.2004 (Сб) 18:27

На рабочем столе - запросто! GetWindowDC(GetDesktopWindow), и вперёд!
Вот пример:
Код: Выделить всё
Option Explicit
Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function FillRect Lib "user32" (ByVal hDC As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function FrameRect Lib "user32" (ByVal hDC As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Sub Main()
Dim hWnd As Long, hDC As Long, hBrush As Long, rc As RECT
    hWnd = GetDesktopWindow
    hDC = GetWindowDC(hWnd)
    SetRect rc, 100, 100, 500, 500
    hBrush = CreateSolidBrush(vbRed)
    FillRect hDC, rc, hBrush
    DeleteObject hBrush
    hBrush = CreateSolidBrush(vbBlack)
    FrameRect hDC, rc, hBrush
    DeleteObject hBrush
    ReleaseDC hWnd, hDC
End Sub
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList