VisualC窗体设计技巧集解析

上传人:s9****2 文档编号:511542785 上传时间:2024-03-07 格式:DOC 页数:18 大小:132KB
返回 下载 相关 举报
VisualC窗体设计技巧集解析_第1页
第1页 / 共18页
VisualC窗体设计技巧集解析_第2页
第2页 / 共18页
VisualC窗体设计技巧集解析_第3页
第3页 / 共18页
VisualC窗体设计技巧集解析_第4页
第4页 / 共18页
VisualC窗体设计技巧集解析_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《VisualC窗体设计技巧集解析》由会员分享,可在线阅读,更多相关《VisualC窗体设计技巧集解析(18页珍藏版)》请在金锄头文库上搜索。

1、vgn0BVisual C+窗体设计技巧集前言:有好的界面软件就成功了一半,本文将向您介绍怎样设计一些有稀奇古怪”形状的窗体,如何设定窗体的颜色、如何设置任务栏和状态栏以及菜单图标等等,通过这些技巧能更深入的理解VC的文档-视图结构。如何制作透明窗体使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在 w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。的函数原型如下:SetLayeredWi n

2、dowAttributesBOOL SetLayeredWi ndowAttributes(HWND hwn d, COLORREF crKey,BYTE bAlpha, DWORD dwFlags );/ han dle to the layered win dow/ specifies the color key/ value for the ble nd function/ acti onWin dows NT/2000/XP: I ncluded in Win dows 2000 and later.Win dows 95/98/Me: Un supported.(注意了,在 win9

3、x 里没法使用的)Header: Declared in Winu ser.h; in clude Win dows.h.Library: Use User32.lib.一些常量:WS_EX_LAYERED = 0x80000;LWA_ALPHA = 0x2;LWA_COLORKEY=0x1;其中 dwFlags 有 LWA_ALPHA 和 LWA_COLORKEYLWA_ALPHA被设置的话,通过bAlpha决定透明度.LWA_COLORKEY被设置的话,则指定被透明掉的颜色为 crKey,其他颜色则正常显 示.要使使窗体拥有透明效果,首先要有WS_EX_LAYERED 扩展属性(旧的sdk

4、没有定 义这个属性,所以可以直接指定为 0x80000).例子代码 :在 OnInitDialog() 加入 :/加入 WS_EX_LAYERED 扩展属性SetWindowLong(this-GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this-GetSafeHwnd(),GWL_EXSTYLEF0x80000);HINSTANCE hInst = LoadLibrary(User32.DLL);if(hInst)typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);MYFUNC fun = NUL

5、L;/ 取得 SetLayeredWindowAttributes 函数指针fun=(MYFUNC)GetProcAddress(hInst, SetLayeredWindowAttributes); if(fun)fun(this-GetSafeHwnd(),0,128,2);FreeLibrary(hInst);稍加修改还可以作出淡出淡入的效果 . 注意第三个参数 (128)不要取得太小了 ,为 0 的话就完全透明 ,看不到了。如何使框架窗口的图标为动画显示可以用 TIMER ,但是 TIMER 不能有效的定时。因为 TIMER 发送的是窗口消息,当窗口忙于处理键盘、 鼠标等消息时就不能及

6、时处理 TIMER ,会使间隔时间变得很长 。可以考虑用一个单独得 TIMER 线程,用 Sleep() 定时来解决此问题。UINT Timer(LPVOID param)HWND hWnd=(HWND)param;while(1)Sleep(ms);PostMessage(hWnd,CH_PICTURE,NULL,NULL)Sleep(ms) 后发送自定义消息。消息处理函数就选择某一个 ICON 或 BITMAP 来显 示。如 :MyBotton.SetBitmap(HBITMAP)Bitmapi);Bitmap 是一个位图数组,存放有 j 个位图。消息处理函数运行一次, i 就累加一次,

7、当 i=j 时, i 就回到 0 ;防止窗口闪烁的方法1、将 Invalidate() 替换为 InvalidateRect() 。Invalidate() 会导致整个窗口的图象重画,需要的时间比较长,而 InvalidateRect() 仅仅重画 Rect 区域内的内容,所以所需时间会少一些。虫虫以前很懒,经常为一小块 区域的重画就调用 Invalidate() ,不愿意自己去计算需要重画的 Rect ,但是事实是,如 果你确实需要改善闪烁的情况,计算一个 Rect 所用的时间比起重画那些不需要重画的 内容所需要的时间要少得多。2、禁止系统搽除你的窗口。系统在需要重画窗口的时候会帮你用指定的

8、背景色来搽除窗口。可是,也许需要重画的区域也许非常小。或者,在你重画这些东西之间还要经过大量的计算才能开始。这 个时候你可以禁止系统搽掉原来的图象。直到你已经计算好了所有的数据,自己把那些需要搽掉的部分用背景色覆盖掉 (如: dc.FillRect(rect,&brush);rect 是需要搽除的区域, brush 是带背景色的刷子),再画上新的图形。要禁止系统搽除你的窗口,可以重载 OnEraseBkgnd() 函数,让其直接返回 TRUE 就可以了。如BOOL CMyWin:OnEraseBkgnd(CDC* pDC)return TRUE;/return CWnd:OnEraseBkgn

9、d(pDC);/ 把系统原来的这条语句注释掉。3、有效的进行搽除。搽除背景的时候,不要该搽不该搽的地方都搽。比如,你在一个窗口上放了一个很 大的 Edit 框,几乎占了整个窗口,那么你频繁的搽除整个窗口背景将导致 Edit 不停重 画形成剧烈的闪烁。事实上你可以 CRgn 创建一个需要搽除的区域,只搽除这一部分。 如GetClientRect(rectClient);rgn1.CreateRectRgnIndirect(rectClient); rgn2.CreateRectRgnIndirect(m_rectEdit);if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_X

10、OR) = ERROR)/处理后的 rgn1 只包括了 Edit 框之外的客户区域,这样, Edit 将不会被我的背景覆盖而导致重画。ASSERT(FALSE);return ;brush.CreateSolidBrush(m_clrBackgnd); pDC-FillRgn(&rgn1,&brush);brush.DeleteObject();注意:在使用这个方法的时候要同时使用方法二。别忘了,到时候又说虫虫的办法 不灵。4、使用 MemoryDC 先在内存里把图画好,再复制到屏幕上。这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快, 而且复制到屏幕 又是一次性的,至少不会出现可以明

11、显看出一个东东从左画到右的情况。void CMyWin:OnPaint()CPaintDC dc1(this); / device context for painting dcMemory.CreateCompatibleDC(&dc1);CBitmap bmp;/ 这里的 Bitmap 是必须的,否则当心弄出一个大黑块哦。 bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height(); dcMemory.SelectObject(&bmp);/接下来你想怎么画就怎么画吧。 /dcMemory.FillRect(

12、rectClient,&brush);dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY); dcMemory.DeleteDC();/ Do not call CWnd:OnPaint() for painting messages如何实现全屏显示全屏显示是一些应用软件程序必不可少的功能。比如在用 VC 编辑工程源文件 或编辑对话框等资源时, 选择菜单 “ViewFull Screen ,”即可进入全屏显示状态, 按 “Esc” 键后会退出全屏显示状态。在 VC 6.0 中我们用 AppWiz

13、ard 按默认方式生成单文档界面的应用程序框架。 下面将先讨论点击菜单项“ViewFull Screen实现全屏显示的方法,再讲述按“Esd”后如何退出全屏显示状态。1) 在 CMainFrame 类中,增加如下三个成员变量。private:WINDOWPLACEMENT m_OldWndPlacement; /用来保存原窗口位置BOOL m_bFullScreen; / 全屏显示标志CRect m_FullScreenRect; / 表示全屏显示时的窗口位置2) 在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”单栏下添加菜单项“Full Screen ”。在其属性框中,ID

14、设置为 ID_FULL_SCREEN ,Caption 为 “ Full Screen。还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen相关联,即将其ID值也设置为 ID_FULL_SCREEN 。3) 设计全屏显示处理函数, 在 CMainFrame 类增加上述菜单项 ID_FULL_SCREEN 消息的响应函数。响应函数如下:void CMainFrame:OnFullScreen()GetWindowPlacement( m_OldWndPlacement);CRect WindowRect;GetWindowRect( WindowRect);CRect Cli

15、entRect;RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery,ClientRect);ClientToScreen( ClientRect);/ 获取屏幕的分辨率int nFullWidth=GetSystemMetrics(SM_CXSCREEN);int nFullHeight=GetSystemMetrics(SM_CYSCREEN);/将除控制条外的客户区全屏显示到从 (0,0)到(nFullWidth, nFullHeight)区域,将 (0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区位置间 的差值, 就得到全屏显示的窗口位置m_FullScreenRect.left=WindowRect.left-ClientRect.left; m_FullScreenRect.top=WindowRect.top-ClientRect.top; m_FullScreenRect.rig

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号