IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Определить расстояние между значками на раб столе? (http://www.imho.ws/showthread.php?t=82843)

Merlyel 30.03.2005 23:00

Определить расстояние между значками на раб столе?
 
Как определить расстояние между значками на рабочем столе (по вертикали и по горизонтали)?
+Может еще кто знает, как сделать обновление рабочего стола (т.е действие, которое происходит по нажатию: Правая клавиша мыши на раб столе -> Refresh, оно же просто F5 на раб столе :)

AleXXXSoft 31.03.2005 11:11

послать этому окну событие WM_REFRESH или что-то такое WM_REDRAW

alexey_ma 31.03.2005 17:01

Цитата:

AleXXXSoft:
послать этому окну событие WM_REFRESH или что-то такое WM_REDRAW
Пурга. Нет таких сообщений.
Для любого окна можно сделать InvalidateRect
MSDN :
Код:

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 to window
  CONST RECT* lpRect,  // rectangle coordinates
  BOOL bErase          // erase state
);

Да, насчет растояний.
Я бы навскидку сделал бы примерно так:
Поскольку десктопное окно это обичный SysListView32 то можно получить прямоугольник для каждого его элемента с помошью функции
BOOL ListView_GetItemRect(
HWND hwnd,
int i,
RECT *prc,
int code
);
или засылкой сообщения LVM_GETITEMRECT.
Только не забывай что десктопное окно находиться в чужом процессе. Поэтому придется аллокировать память под возвращяемое значение(*prc) в чужом процессе. Если интересуют подробности то могу написать.
Возможно что есть способ попроще. Нужно подумать.

/7y3uK 31.03.2005 17:40

Добавлю, что у десктопа хендл всегда = 0...
кстати, а зачем аллочить память в другом процессе? это тут причем? ты когда с OpenGL работаешь, тебе для вывода графики на десктоп ничего не нать кроме контекста DC и хэндла HWND десктопа... нормально работается и делается все что угодно... тут процессы ни при чем...

Merlyel 31.03.2005 17:57

Цитата:

alexey_ma:
ListView_GetItemRect
От балда я... :) почти все для ListView просмотрел, а вот эту команду заюзать не додумался:) попробуем...
Цитата:

/7y3uK:
а зачем аллочить память в другом процессе?
тут процессы как раз причем - простым способом не получиться преодолеть границы процессов... поэтому либо так, либо запихивать свою DLL, например, в область этого процесса :) (как у Рихтера в книжке )

alexey_ma 31.03.2005 18:32

Цитата:

/7y3uK:
Добавлю, что у десктопа хендл всегда = 0...
кстати, а зачем аллочить память в другом процессе? это тут причем? ты когда с OpenGL работаешь, тебе для вывода графики на десктоп ничего не нать кроме контекста DC и хэндла HWND десктопа... нормально работается и делается все что угодно... тут процессы ни при чем...
На самом деле не 0. Можешь спаем посмотреть.
или вызови функцию GetDesktopWindow() .
А аллокация пямяти в другом процессе нужна потому-что в фукции которую мы тут дружно пытаемся вызвать, в параметрах нужно передать указатель на структуру RECT, поскольку память для этой структуры выделена в нашем процессе то указатель на неё в десктопном процессе не имеет никакого смысла. Что бы все правильно отработало нужно аллокировать память под RECT в процессе десктопа передать его в функцию прочитать результат и удалить.


Часовой пояс GMT +4, время: 18:12.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.