| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2897 人关注过本帖
标题:写了个win32基础的窗口 有些问题请教大牛们
只看楼主 加入收藏
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 40楼 有容就大
其实这个程序还影射了另一种程序的原理:实现切屏程序。呵呵,想想这个短小的示例程序价值,不得不佩服一下罗云彬先生

我们都在路上。。。。。
2012-05-05 13:31
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 41楼 hellovfp
他对内核和原理的东西理解的很透彻 所以能随手拈来一个很有代表性的程序  

梅尚程荀
马谭杨奚







                                                       
2012-05-06 11:26
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
在问个问题——
程序代码:
BOOL Create(HINSTANCE hInst, int nCmdShow)
{
    hInstance = hInst;   // Connect with the global instance

    HWND hWnd = CreateWindowEx(0, szAppName, szAppName,
                        WS_OVERLAPPEDWINDOW, 60, 60,
                      100, 100, NULL, NULL, hInst, NULL);

------
程序代码:
void yrjd_OnSize(HWND hWnd, UINT state, int cxClient, int cyClient)
{
    MoveWindow(hWnd, 20, 20, cxClient/2 , cyClient/2 , TRUE);
    ;
}

我的意图是先创建一个随意大小的窗口 然后在OnSize里改变成想要的大小

查了下HANDLE_MSG的OnSize函数的参数 后面两个的宏展开就是LOWORD(lParam) HIWORD(lParam)
那为什么MoveWindow里用cxClient / 2 或者 cxClient 却是 0 大小?

梅尚程荀
马谭杨奚







                                                       
2012-05-06 11:37
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 43楼 有容就大
这样做能达到你要的效果么?
MoveWindow在改变窗口的同时,又会发送WM_SIZE消息的。

你可以试试用一个文件保存你的要创建的窗口大小,
然后在WM_CREATE里读出来,并用MoveWindow改成你要的大小和显示位置。

我们都在路上。。。。。
2012-05-06 12:20
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 44楼 hellovfp
如果把 cxClient & cyClient 改成常数 即 MoveWindow(hWnd, 20, 20, 800 , 600 , TRUE);是可以得到一个800 * 600的窗口 不清楚OnSize的参数怎么用。

梅尚程荀
马谭杨奚







                                                       
2012-05-06 14:43
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 45楼 有容就大
WM_SIZE中传过来的参数只是窗口客户区的宽度和高度,一般用于替代程序中用GetClientRect获取窗口客户区大小,程序中可用全局变量来保存,据说这样比使用GetClientRect效率高。
除了MoveWindow,还可以使用SetWindowPos。
这里给你一个用BMP进行镂空帖图的例子,还是改写自罗云彬的汇编,第七章,第三个例子:BmpClock,位图时钟,你可以参照这章的说明,研究一下这个过程,游戏中人物帖图就是这么干的。
BmpClock.rar (16.38 KB)


奥沙哥果然不负众望,以18:11拿下了今年的冠军。。。呵呵,精彩呀,半夜起来看决赛。

[ 本帖最后由 hellovfp 于 2012-5-8 12:59 编辑 ]

我们都在路上。。。。。
2012-05-08 12:21
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 46楼 hellovfp
太好了 我看WIN32汇编 就是对实例很难理顺。这下要好好研究下 这个。

奥哥 确实厉害 哈哈。

梅尚程荀
马谭杨奚







                                                       
2012-05-08 14:33
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 47楼 有容就大
这个例子本身应该是GDI中比较复杂的一个,涉及到时钟算法,ROP光栅操作,区域等相关概念。
可以点右键换背景的,这个还可以自己添加新功能完善成可以应用的桌面小程序。。
很好玩的一个。

我们都在路上。。。。。
2012-05-08 14:56
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 48楼 hellovfp
试着把你给的程序改在HANDLE_MSG下  成功了
发现好多东西没用过啊
程序代码:
    // Set the circle window and set the "top most"
    HRGN hRgn = CreateEllipticRgn(0, 0, CLOCK_SIZE + 1, CLOCK_SIZE + 1);
    SetWindowRgn(hWndMain, hRgn, TRUE);
    DeleteObject(hRgn);
    SetWindowPos(hWndMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
发现上面这个代码把SetWindowPos注释掉对程序没影响啊

梅尚程荀
马谭杨奚







                                                       
2012-05-09 13:51
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
………………
刚去试了下原来SetWindowPos(hWndMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);的目的是把那个圆形时钟都放在桌面所有窗口的前面 怎么切换网页都可以看到他 哈哈 有意思。

梅尚程荀
马谭杨奚







                                                       
2012-05-09 13:54
快速回复:写了个win32基础的窗口 有些问题请教大牛们
数据加载中...
 
   



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

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