| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7326 人关注过本帖
标题:如何制作桌面秀(让窗口或者图片显示在桌面背景上)
只看楼主 加入收藏
永久的守护
Rank: 1
等 级:新手上路
威 望:2
帖 子:425
专家分:6
注 册:2007-6-9
收藏
得分:0 
以下是引用yeshirow在2007-10-16 19:42:17的发言:
可以使用 SetParent 來讓窗口附加到桌面窗口

SDK usage:

hParentSrc = SetParent(hWndChild, GetDesktopWindow());
// hWndChild 是企圖加到桌面的窗口
// hWndChild 仍然受自己程式的控制, 你可以隨便控制此窗口的行爲
// 在程式結束時將父窗口還原
SetParent(hWndChild, hParentSrc);

不好使


见了便做做了便放下了了有何不了,慧生于觉觉生于自在生生还是无生。
活则生变,简而至稳。
2007-10-16 22:52
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
收藏
得分:0 
回复:(永久的守护)如何制作桌面秀(让窗口或者图片...
不要將自己的主窗口設置爲 desktop 的子窗口,
將自己主窗口的某個子窗口設置爲 desktop 的子窗口,
隱藏自己的主窗口, 再對 已經加到桌面的那個窗口控制

例如要建立一個在桌面畫畫的區域, 先建立一個主窗口, 在主窗口放置一個圖片控件
然後將圖片控件設置爲 desktop 的子窗口, 再隱藏自己的主窗口, 然後控制圖片控件畫畫的行爲

原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2007-10-17 06:31
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 
用多边形窗口了,只要在自己窗口中画图片就是,然后设置窗口总是在最顶层就可以了

2007-10-17 11:35
永久的守护
Rank: 1
等 级:新手上路
威 望:2
帖 子:425
专家分:6
注 册:2007-6-9
收藏
得分:0 
以下是引用yeshirow在2007-10-17 6:31:39的发言:
不要將自己的主窗口設置爲 desktop 的子窗口,
將自己主窗口的某個子窗口設置爲 desktop 的子窗口,
隱藏自己的主窗口, 再對 已經加到桌面的那個窗口控制

例如要建立一個在桌面畫畫的區域, 先建立一個主窗口, 在主窗口放置一個圖片控件
然後將圖片控件設置爲 desktop 的子窗口, 再隱藏自己的主窗口, 然後控制圖片控件畫畫的行爲

不明白你的想法该怎么实现
按照你的想法大概写了一个程序 不知道靠不靠铺 但是按照我这么写实现不了要求:

#include <windows.h>

#define IDB_NUM1 111

int cxClient, cyClient ;

HWND hwnd ,hwndChild ;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("SineWave") ;
MSG msg ;
WNDCLASS wndclass;

HRGN hRgn ;
POINT edge[5] ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (LTGRAY_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow ( szAppName, TEXT ("窗口母本程序"),
WS_OVERLAPPEDWINDOW,
10, 10,
20, 50,
NULL, NULL, hInstance, NULL) ;

hwndChild = CreateWindow("BUTTON",
"最上端控件",
WS_CHILD ,
60, 140,
580, 530,
GetDesktopWindow(),
(HMENU) IDB_NUM1,
hInstance,
NULL);

SetWindowPos(hwnd
, HWND_BOTTOM
, 0, 0
, GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)
, SWP_HIDEWINDOW) ;
SetWindowPos(hwndChild, HWND_TOP, 0, 0, 500, 500, SWP_SHOWWINDOW);

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;

switch (message)
{
case WM_CREATE:

return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
SetWindowPos(hwnd
, HWND_BOTTOM
, 0, 0
, GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)
, SWP_HIDEWINDOW) ;
SetWindowPos(hwndChild, HWND_TOP, 0, 0, 500, 500, SWP_SHOWWINDOW);
InvalidateRect (hwnd, NULL, FALSE) ;
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}



见了便做做了便放下了了有何不了,慧生于觉觉生于自在生生还是无生。
活则生变,简而至稳。
2007-10-17 15:38
永久的守护
Rank: 1
等 级:新手上路
威 望:2
帖 子:425
专家分:6
注 册:2007-6-9
收藏
得分:0 
以下是引用余来在2007-10-17 11:35:55的发言:
用多边形窗口了,只要在自己窗口中画图片就是,然后设置窗口总是在最顶层就可以了

也没实现:

#include <windows.h>
int cxClient, cyClient ;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("SineWave") ;
MSG msg ;
WNDCLASS wndclass;
HWND hwnd ;
HRGN hRgn ;
POINT edge[5] ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (LTGRAY_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow ( szAppName, TEXT ("窗口母本程序"),
WS_OVERLAPPEDWINDOW,
10, 10,
800, 600,
NULL, NULL, hInstance, NULL) ;

edge[0].x = 0 ;
edge[0].y = 0 ;
edge[1].x = 200 ;
edge[1].y = 50 ;
edge[2].x = 300 ;
edge[2].y = 200 ;
edge[3].x = 200 ;
edge[3].y = 250 ;
edge[4].x = 0 ;
edge[4].y = 100 ;

hRgn = CreatePolygonRgn(edge, 5, ALTERNATE) ;
SetWindowRgn(hwnd, hRgn, TRUE) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
SetWindowPos(hwnd, HWND_TOP, 0, 0, 500, 500, SWP_SHOWWINDOW);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;


switch (message)
{
case WM_CREATE:
SetWindowPos(hwnd, HWND_TOP, 0, 0, 500, 500, SWP_SHOWWINDOW);
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
SetWindowPos(hwnd, HWND_TOP, 0, 0, 500, 500, SWP_SHOWWINDOW);
InvalidateRect (hwnd, NULL, FALSE) ;
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}



见了便做做了便放下了了有何不了,慧生于觉觉生于自在生生还是无生。
活则生变,简而至稳。
2007-10-17 15:41
cl_zdl
Rank: 1
等 级:新手上路
威 望:1
帖 子:71
专家分:0
注 册:2006-10-11
收藏
得分:0 

就是羡慕你们这些高手,我要努力啊!

2007-10-18 15:14
永久的守护
Rank: 1
等 级:新手上路
威 望:2
帖 子:425
专家分:6
注 册:2007-6-9
收藏
得分:0 
点击桌面那个找到一个解决方法了 很简单:

hwnd = CreateWindow ( szAppName, TEXT ("窗口母本程序"),
WS_POPUP | WS_THICKFRAME,
10, 10,
800, 600,
NULL, NULL, hInstance, NULL) ;

就是把style设置为WS_POPUP | WS_THICKFRAME 就行了
然后再SetWindowPos就行了

见了便做做了便放下了了有何不了,慧生于觉觉生于自在生生还是无生。
活则生变,简而至稳。
2007-10-18 16:17
永久的守护
Rank: 1
等 级:新手上路
威 望:2
帖 子:425
专家分:6
注 册:2007-6-9
收藏
得分:0 
现在的问题是 怎么让它贴在桌面上

我的理解是在窗口的最底端 不能最小化 点击显示 桌面也不最小化

[此贴子已经被作者于2007-10-18 16:36:31编辑过]


见了便做做了便放下了了有何不了,慧生于觉觉生于自在生生还是无生。
活则生变,简而至稳。
2007-10-18 16:34
Janlex
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:303
专家分:0
注 册:2006-9-12
收藏
得分:0 
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

★★★★★欢迎光临我的博客 ★★★★★
http://www.
2007-10-18 22:06
永久的守护
Rank: 1
等 级:新手上路
威 望:2
帖 子:425
专家分:6
注 册:2007-6-9
收藏
得分:0 
以下是引用Janlex在2007-10-18 22:06:18的发言:
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

这个操作之后还是让窗口一直浮在最上端
影响其他窗口的显示了


见了便做做了便放下了了有何不了,慧生于觉觉生于自在生生还是无生。
活则生变,简而至稳。
2007-10-19 23:15
快速回复:如何制作桌面秀(让窗口或者图片显示在桌面背景上)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017333 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved