MEGA NIOUZ: [API (vb)] prob avec InvalidateRect - VB/VBA/VBS - Programmation
Marsh Posté le 15-05-2002 à 02:32:02
GetDesktopWindow() pour récupérer un handle vers le desktop
InvalidateRect() pour rafraîchir une fenêtre
a + b = rafraîchissement du desktop
Marsh Posté le 15-05-2002 à 10:07:17
je test, je vous tiens au courant
Marsh Posté le 15-05-2002 à 10:56:24
g un peu de mal avec InvalidateRect...
msdn dit de passer l'argument lerect comme null, mais ca posse po chez moa
Marsh Posté le 15-05-2002 à 11:11:43
Non, InvalidateRect() prend 2 arguments :
- Le 1er indique l'adresse de la structure RECT à rafraichir
- Le 2eme est un BOOL indiquant si le rectangle doit être effacé ou non (TRUE par défaut)
Donc, tu fais ceci :
RECT clientrect;
clientrect = GetClientRect(&clientrect);
InvalidateRect(&clientrect);
Marsh Posté le 15-05-2002 à 11:13:48
InvalidateRect
The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn.
BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect,
// address of rectangle coordinates
BOOL bErase // erase-background flag
);
Parameters
hWnd
Handle to the window whose update region has changed. If this parameter is NULL, the system invalidates and redraws all windows, and sends theWM_ERASEBKGND and WM_NCPAINT messages to the window procedure before the function returns.
lpRect
Pointer to a RECT structure that contains the client coordinates of the rectangle to be added to the update region. If this parameter is NULL, the entire client area is added to the update region.
bErase
Specifies whether the background within the update region is to be erased when the update region is processed. If this parameter is TRUE, the background is erased when the BeginPaint function is called. If this parameter is FALSE, the background remains unchanged.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
Windows NT: To get extended error information, callGetLastError.
Remarks
The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function.
The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window.
If the bErase parameter is TRUE for any part of the update region, the background is erased in the entire region, not just in the given part.
Windows CE: The hWnd parameter cannot be NULL.
QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winuser.h.
Import Library: Use user32.lib.
c pour ca
apparament yaurai plusieurs facon de la declaré...
je regarde ta methode, thx
Marsh Posté le 15-05-2002 à 11:15:40
note: je fais du VB
Marsh Posté le 15-05-2002 à 11:23:27
Je fais du C++ et MFC... tout s'explique ! Normal que tu aies 3 arguments, moi je n'ai pas besoin du hwnd car j'hérite de CWnd qui possède un membre hwnd à sa création.
Sous VB, il me semble qu'une fonction te retourne le hwnd de ta fenêtre je pense.
Marsh Posté le 15-05-2002 à 11:26:21
de la fenetre oui... j'utilise GetDesktopWindow, ki me retourne gentiment 128...
mais lis tout le topic, je reprend la methode de you dont care...
Marsh Posté le 15-05-2002 à 11:27:32
Quand on veut tout rafraîchir, je fais InvalidateRect(hWnd, NULL, TRUE); (de mémoire, faillible).
Declare Function GetdesktopWindow Lib "user32" () As Long
Faudrait essayer
dim hwnd& (& : long je crois, sais plus trop)
hwnd& = GetdesktopWindow();
InvalidateRect(hwnd, 0, 1); ' je sais plus si 1 est TRUE
Sans garantie, ai rien pour tester (sauf en BC ..).
Marsh Posté le 15-05-2002 à 11:32:33
oki, ca passais pas pcq je mettais null au lieu de zero en param
je test avec ca...
hWnd est bien long, tu as une memoire tres correct
InvalidateRect me repond ByRef argument type mismatch au nivo du zero
il veut un RECT
Marsh Posté le 15-05-2002 à 11:33:30
OK, donc ce que tu as a faire c'est d'initialiser une structure RECT et de passer son adresse à InvalidateRect
A mon avis, ça ne marche pas car tu passes NULL pour cet argument. Tu rafraichis ainsi la fenêtre de ton application, et non celle du bureau.
Récupère le rectangle client du bureau avec GetClientRect dans ta structure RECT, puis passe une référence à cette structure en argument de InvalidateRect :
hwnd& = GetdesktopWindow()
InvalidateRect(hwnd, rect)
2 paramètres, car le 3eme est TRUE par défaut (on efface le rectangle)
[jfdsdjhfuetppo]--Message édité par Harkonnen le 15-05-2002 à 11:35:50--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 11:40:02
le 3eme param est pas optionnel, alors je laisse zero... mais ca march epo plus...et pis, fo rien mettre ds le rect? enifn a part le declarer
Marsh Posté le 15-05-2002 à 11:47:51
Leirn a écrit a écrit : le 3eme param est pas optionnel, alors je laisse zero |
Attention, 0 = False, donc tu n'effaces pas ton rectangle
Pour le RECT, voici la structure :
Code :
|
Le mieux je pense est effectivement d'initialiser chaque champ de cette structure à 0.
Marsh Posté le 15-05-2002 à 11:52:19
oki, j'avais deja créé la structure...
mon dernier param estait bien 1 en fait
j'initialise tout a zero et...
marche po
Public Sub Refresh_Desktop()
Dim hWnd As Long
Dim recte As RECT
Dim test As Long
With recte
.top = 0
.left = 0
.right = 0
.bottom = 0
End With
hWnd& = GetDesktopWindow()
Call InvalidateRect(hWnd, recte, 1)
End Sub
[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 11:52:55--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 11:54:44
Est ce que RECT fait partie des types de données acceptés par VB ?? J'en suis pas sur du tout, tu devrais essayer de créer la structure directement dans ton source.
Et déclares tu tes API au début du source ?
Marsh Posté le 15-05-2002 à 11:58:52
g créé la structure directement dans mon source deja:
Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
c comme ca?
Marsh Posté le 15-05-2002 à 11:59:25
et je declare mes api
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
Public Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
syntaxe fournie par api viewer
Marsh Posté le 15-05-2002 à 12:13:13
sinon avec le hWnd ya moyen d'envoyer un F5? c moins propre, mais bon...
Marsh Posté le 15-05-2002 à 12:20:45
Tu as oublié le GetClientRect() qui récupère le rectangle associé au bureau dans ton rect.
Je récapitule :
- Récupérer le hwnd du bureau (GetDesktopWIndow)
- initialiser un RECT
- récupérer le rectangle du bureau GetClientRect(hwnd, &RECT)
- InvalidateRect(hwnd, &RECT, True)
[jfdsdjhfuetppo]--Message édité par Harkonnen le 15-05-2002 à 12:24:14--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 12:29:06
Public Sub Refresh_Desktop()
Dim hWnd As Long
Dim recte As RECT
Dim test As Long 'InvalidateRect(&clientrect);
hWnd& = GetDesktopWindow()
test = GetClientRect(hWnd, recte)
Call InvalidateRect(hWnd, recte, 1)
End Sub
g vérifier il retourne bien la resulution de l'ecran ds recte, mais ca rafraichi po...
Marsh Posté le 15-05-2002 à 12:34:55
J'y pense à l'instant....
C'est bien beau de faire un InvalidateRect, mais il faut redessiner le rectangle ensuite...
Essaie d'envoyer un message WM_PAINT au bureau ou utilise ValidateRect(hwnd, RECT) après le InvalidateRect
Je vais manger, a cet aprem
Marsh Posté le 15-05-2002 à 12:35:58
me semblait bien kil y avait un mess, mais ke je savé pas encor el'envoyer
bon app, je regarde ca
Marsh Posté le 15-05-2002 à 12:39:01
deja validate rect marche po on essai les message...
c un sendnotifymessage le bon?
Marsh Posté le 15-05-2002 à 14:00:27
ValidateRect() ne marche pas ?
Essaie d'envoyer un message au bureau alors...
SendMessage(hwnd,WM_PAINT,0,0)
Attention : tu devras définir dans ton source la valeur de WM_PAINT (je la connais pas, elle doit être dans le fichier windows.h si tu as un compilo C sous la main)
On va finir par y arriver a force... Si ça, ça ne marche pas, je sèche...
Marsh Posté le 15-05-2002 à 14:00:42
Salut Leirn
La je suis pas chez moi, mais de tete, passe le 3eme param en "ByRef lpRect As any", certains appels on besoin d'avoir un pointeur générique. Je jetterais un oeil chez moi si ca marche po mieux
Marsh Posté le 15-05-2002 à 14:01:30
Au fait, tu passes bien une référence à RECT dans tes paramètres de fonction, et pas une RECT directement ?
Marsh Posté le 15-05-2002 à 14:02:38
KarLKoX a écrit a écrit : Salut Leirn passe le 3eme param en "ByRef lpRect As any" |
grilled
les grands esprits se rencontrent
Marsh Posté le 15-05-2002 à 15:16:43
karl!!!!!
coocoo
ben je c pas encore ce ke je passe, je rentre de mon cours de physik, je m'y remet et je vous dit
apparement c byref par defo, et yavai pas byval, mais g rajouter byref par securité...
[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 15:20:02--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 15:17:48
pour WM_PAINT et les valeurs des autres constantes, don't worry, api viewer
Marsh Posté le 15-05-2002 à 15:26:21
bon, on reprend...
Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function InvalidateRect Lib "user32" _
(ByVal hWnd As Long,_
ByRef lpRect As RECT,_
ByVal bErase As Long) As Long
Public Declare Function GetClientRect Lib "user32" _
(ByVal hWnd As Long,_
ByRef lpRect As RECT) As Long
Public Declare Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" _
(ByVal hWnd As Long,_
ByVal msg As Long,_
ByVal wParam As Long,_
ByVal lParam As Long) As Long
Public Declare Function ValidateRect Lib "user32" _
(ByVal hWnd As Long,_
lpRect As RECT) As Long
Public Const WM_PAINT = &HF
Public Sub Refresh_Desktop()
Dim hWnd As Long
Dim recte As RECT
Dim test As Long
hWnd& = GetDesktopWindow()
test = GetClientRect(hWnd, recte)
test = InvalidateRect(hWnd, recte, 1)
test = ValidateRect(hWnd, recte)
test = SendNotifyMessage(hWnd, WM_PAINT, 0, 0)
End Sub
kesky merde?
Marsh Posté le 15-05-2002 à 15:34:07
C'est pas SendNotifyMessage, mais SendMessage()
Et si tu fais SendMessage(), pas besoin de faire ValidateRect() et vice-versa
Marsh Posté le 15-05-2002 à 15:53:57
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Sub Refresh_Desktop()
Dim hwnd As Long
Dim recte As RECT
Dim test As Long
hwnd& = GetDesktopWindow()
test = GetClientRect(hwnd, recte)
test = InvalidateRect(hwnd, recte, 1)
'test = ValidateRect(hWnd, recte)
test = SendMessage(hwnd, WM_PAINT, 0, 0)
End Sub
pas plus
Marsh Posté le 15-05-2002 à 15:56:15
Je sèche......
Je testerais chez moi ce soir, car la je ne sais vraiment plus quoi faire....
Marsh Posté le 15-05-2002 à 16:01:30
moa pu non plus
Marsh Posté le 15-05-2002 à 16:35:38
Si c'est utilisable depuis VB, y a bien l'API SHChangeNotify()
Exemple DELPHI mais y a qu'une ligne ..
http://www.scalabium.com/faq/dct0105.htm
Marsh Posté le 15-05-2002 à 16:45:41
deja fait des tests avec, mais pas bcp plus de results....
je ressai
Marsh Posté le 15-05-2002 à 16:49:27
C'est pas possible d'en chier comme ça pour un truc aussi con !!
Marsh Posté le 15-05-2002 à 16:59:09
je suis tout a fait d'accord avec toi... doit y avoir un truc ki merde, g oblier kke chose, je c pas koi...
enfin avec tt ce ke g testé devrait bien y en avoir un ki passe.... ou c ma version de win ki merde
Marsh Posté le 15-05-2002 à 17:00:44
je testerais chez moi ce soir
Marsh Posté le 15-05-2002 à 02:07:36
tout est ds le titre
je cherche la methode, ke je suppose etre a base d'api, ki permettent de rafraichir le bureau, apres un ajout de raccourci ou le changement de papier peint, par exemple
merci
[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 19:09:19--[/jfdsdjhfuetppo]
---------------
"Je brandirai une épée d'orichalque, je m'assouvirai sur des Templiers." | "Avec dans son sillage l'Ombre du Diable, Leirn appelait les morts pour une danse macabre et déchainaît les horreurs de la nuit..."