Visual C++窗体设计技巧集Word文档格式.docx

上传人:b****6 文档编号:21814506 上传时间:2023-02-01 格式:DOCX 页数:19 大小:26.90KB
下载 相关 举报
Visual C++窗体设计技巧集Word文档格式.docx_第1页
第1页 / 共19页
Visual C++窗体设计技巧集Word文档格式.docx_第2页
第2页 / 共19页
Visual C++窗体设计技巧集Word文档格式.docx_第3页
第3页 / 共19页
Visual C++窗体设计技巧集Word文档格式.docx_第4页
第4页 / 共19页
Visual C++窗体设计技巧集Word文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Visual C++窗体设计技巧集Word文档格式.docx

《Visual C++窗体设计技巧集Word文档格式.docx》由会员分享,可在线阅读,更多相关《Visual C++窗体设计技巧集Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

Visual C++窗体设计技巧集Word文档格式.docx

  LWA_ALPHA被设置的话,通过bAlpha决定透明度.

  LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.

  要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧的sdk没有定义这个属性,所以可以直接指定为0x80000).

  例子代码:

  在OnInitDialog()加入:

//加入WS_EX_LAYERED扩展属性

SetWindowLong(this->

GetSafeHwnd(),GWL_EXSTYLE,

GetWindowLong(this->

GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

HINSTANCEhInst=LoadLibrary("

User32.DLL"

if(hInst)

{

 typedefBOOL(WINAPI*MYFUNC)(HWND,COLORREF,BYTE,DWORD);

 MYFUNCfun=NULL;

 //取得SetLayeredWindowAttributes函数指针

 fun=(MYFUNC)GetProcAddress(hInst,"

SetLayeredWindowAttributes"

 if(fun)fun(this->

GetSafeHwnd(),0,128,2);

 FreeLibrary(hInst);

}

  稍加修改还可以作出淡出淡入的效果.注意第三个参数(128)不要取得太小了,为0的话就完全透明,看不到了。

  如何使框架窗口的图标为动画显示

  可以用TIMER,但是TIMER不能有效的定时。

因为TIMER发送的是窗口消息,当窗口忙于处理键盘、鼠标等消息时就不能及时处理TIMER,会使间隔时间变得很长。

  可以考虑用一个单独得TIMER线程,用Sleep()定时来解决此问题。

UINTTimer(LPVOIDparam)

 HWNDhWnd=(HWND)param;

 while

(1)

 {

  Sleep(ms);

  PostMessage(hWnd,CH_PICTURE,NULL,NULL)

 }

  Sleep(ms)后发送自定义消息。

消息处理函数就选择某一个ICON或BITMAP来显示。

如:

MyBotton.SetBitmap((HBITMAP)Bitmap[i]);

  Bitmap是一个位图数组,存放有j个位图。

消息处理函数运行一次,i就累加一次,当i==j时,i就回到0;

  防止窗口闪烁的方法

  1、将Invalidate()替换为InvalidateRect()。

  Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些。

虫虫以前很懒,经常为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,但是事实是,如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。

  2、禁止系统搽除你的窗口。

  系统在需要重画窗口的时候会帮你用指定的背景色来搽除窗口。

可是,也许需要重画的区域也许非常小。

或者,在你重画这些东西之间还要经过大量的计算才能开始。

这个时候你可以禁止系统搽掉原来的图象。

直到你已经计算好了所有的数据,自己把那些需要搽掉的部分用背景色覆盖掉(如:

dc.FillRect(rect,&

brush);

rect是需要搽除的区域,brush是带背景色的刷子),再画上新的图形。

要禁止系统搽除你的窗口,可以重载OnEraseBkgnd()函数,让其直接返回TRUE就可以了。

BOOLCMyWin:

:

OnEraseBkgnd(CDC*pDC)

returnTRUE;

//returnCWnd:

OnEraseBkgnd(pDC);

//把系统原来的这条语句注释掉。

  3、有效的进行搽除。

  搽除背景的时候,不要该搽不该搽的地方都搽。

比如,你在一个窗口上放了一个很大的Edit框,几乎占了整个窗口,那么你频繁的搽除整个窗口背景将导致Edit不停重画形成剧烈的闪烁。

事实上你可以CRgn创建一个需要搽除的区域,只搽除这一部分。

GetClientRect(rectClient);

rgn1.CreateRectRgnIndirect(rectClient);

rgn2.CreateRectRgnIndirect(m_rectEdit);

if(rgn1.CombineRgn(&

rgn1,&

rgn2,RGN_XOR)==ERROR)//处理后的rgn1只包括了Edit框之外的客户区域,这样,Edit将不会被我的背景覆盖而导致重画。

ASSERT(FALSE);

return;

brush.CreateSolidBrush(m_clrBackgnd);

pDC->

FillRgn(&

brush.DeleteObject();

  注意:

在使用这个方法的时候要同时使用方法二。

别忘了,到时候又说虫虫的办法不灵。

  4、使用MemoryDC先在内存里把图画好,再复制到屏幕上。

  这对于一次画图过程很长的情况比较管用。

毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。

voidCMyWin:

OnPaint()

CPaintDCdc1(this);

//devicecontextforpainting

dcMemory.CreateCompatibleDC(&

dc1);

CBitmapbmp;

//这里的Bitmap是必须的,否则当心弄出一个大黑块哦。

bmp.CreateCompatibleBitmap(&

dc1,rectClient.Width(),rectClient.Height());

dcMemory.SelectObject(&

bmp);

//接下来你想怎么画就怎么画吧。

//dcMemory.FillRect(rectClient,&

dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&

dcMemory,0,0,SRCCOPY);

dcMemory.DeleteDC();

//DonotcallCWnd:

OnPaint()forpaintingmessages

如何实现全屏显示

  全屏显示是一些应用软件程序必不可少的功能。

比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“ViewFullScreen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态。

  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。

下面将先讨论点击菜单项“ViewFullScreen”实现全屏显示的方法,再讲述按“Esc”键后如何退出全屏显示状态。

  1)在CMainFrame类中,增加如下三个成员变量。

  private:

   WINDOWPLACEMENTm_OldWndPlacement;

//用来保存原窗口位置

   BOOLm_bFullScreen;

//全屏显示标志

   CRectm_FullScreenRect;

//表示全屏显示时的窗口位置

  2)在资源编辑器中编辑菜单IDR_MAINFRAME。

在“View”菜单栏下添加菜单项“FullScreen”。

在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“FullScreen”。

还可以在工具栏中添加新的工具图标,并使之与菜单项“FullScreen”相关联,即将其ID值也设置为ID_FULL_SCREEN。

  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的响应函数。

响应函数如下:

  voidCMainFrame:

OnFullScreen()

  {

GetWindowPlacement(&m_OldWndPlacement);

  CRectWindowRect;

  GetWindowRect(&WindowRect);

  CRectClientRect;

  RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);

  ClientToScreen(&ClientRect);

  //获取屏幕的分辨率

  intnFullWidth=GetSystemMetrics(SM_CXSCREEN);

  intnFullHeight=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.right=WindowRect.right-ClientRect.right+nFullWidth;

  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;

  m_bFullScreen=TRUE;

//设置全屏显示标志为TRUE

  //进入全屏显示状态

  WINDOWPLACEMENTwndpl;

  wndpl.length=sizeof(WINDOWPLACEMENT);

  wndpl.flags=0;

  wndpl.showCmd=SW_SHOWNORMAL;

  wndpl.rcNormalPosition=m_FullScreenRect;

  SetWindowPlacement(&wndpl);

  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置信息。

OnGetMinMaxInfo(MINMAXINFOFAR*lpMMI)

if(m_bFullScreen)

  {

lpMMI->

ptMaxSize.x=m_FullScreenRect.Width();

  lpMMI->

ptMaxSize.y=m_FullScreenRect.Height();

ptMaxPosition.x=m_FullScreenRect.Width();

ptMaxPosition.y=m_FullScreenRect.Height();

  //最大的Track尺寸也要改变

ptMaxTrackSize.x=m_FullScreenRect.Width();

ptMaxTrackSize.y=m_FullScreenRect.Height();

  }

CFrameWnd:

OnGetMinMaxInfo(lpMMI);

  完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“ViewFullScreen”或点击与之关联的工具栏按钮即可进入全屏显示状态。

但现在还需要增加用户退出全屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。

  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“AddMemberFunction...”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。

EndFullScreen()

  {//退出全屏显示,恢复原窗口显示

  ShowWindow(SW_HIDE);

  SetWindowPlacement(&m_OldWndPlacement);

  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后调用执行此函数。

由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响应函数OnKeyDown。

判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullScreen,便可退出全屏显示状态。

  voidCFullScreenView:

OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)

if(nChar==VK_ESCAPE)//如果按的键为Esc键

  {//获取主框架窗口的指针

  CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->

m_pMainWnd;

  //调用主窗口类的自定义函数EndFullScreen,便可退出全屏显示状态

  pFrame->

EndFullScreen();

  CView:

OnKeyDown(nChar,nRepCnt,nFlags);

  更改窗口图标并将其显示在任务栏

  以下两个函数可以为应用程序中的各子窗口显示一个任务条到任务栏并更改它们的图标。

对那些象QQ一样隐藏主窗口的应用程序特别有用。

//函数用途:

更改一个窗口的图标并将其显示在任务栏、任务切换条、任务管理器里

//参数说明:

//hWnd要改变图标的窗口句柄

//hLargeIcon显示到任务切换条上的图标32*32

//hSmallIcon显示到除任务切换条之外的图标16*16

//hIcon显示的图标,32*32,在显示到任务切换条之外的其余地方时会被自动压缩成16*16的。

//注释:

//此函数对于模式对话框无能为力。

//如果HICON为NULL,函数不改变窗口图标,但是将原有图标显示到任务栏、

//任务切换条、任务管理器里。

//此函数是通过将窗口的父窗口指针置空来实现将图标显示到任务栏、任务切换条、

//任务管理器里的,所以调用完成后,其父窗口指针不再可用。

BOOLSendWndIconToTaskbar(HWNDhWnd,HICONhLargeIcon,HICONhSmallIcon);

BOOLSendWndIconToTaskbar(HWNDhWnd,HICONhIcon);

BOOLCUIApp:

SendWndIconToTaskbar(HWNDhWnd,HICONhLargeIcon,HICONhSmallIcon)

 BOOLret=TRUE;

 ASSERT(hWnd);

 if(!

IsWindow(hWnd))

  returnFALSE;

 //获取窗口指针

 CWnd*pWnd;

 pWnd=pWnd->

FromHandle(hWnd);

 ASSERT(pWnd);

pWnd)

 //将父窗口设为NULL

 if(pWnd->

GetParent())

  if(:

SetWindowLong(hWnd,GWL_HWNDPARENT,NULL)==0)

   returnFALSE;

  if(!

(pWnd->

ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))

   ret=FALSE;

  //设置窗口图标

  if(hLargeIcon&

&

hSmallIcon)

   pWnd->

SetIcon(hSmallIcon,FALSE);

SetIcon(hLargeIcon,TRUE);

  returnret;

SendWndIconToTaskbar(HWNDhWnd,HICONhIcon)

  //获取窗口指针

  ret=FALSE;

 //设置窗口图标

 pWnd->

SetIcon(hIcon,TRUE);

SetIcon(hIcon,FALSE);

 returnret;

  如何隐藏应用程序在任务栏上的显示

  对于CFrameWnd可以在PreCreateWindow()函数中修改窗口的风格。

BOOLCMainFrame:

PreCreateWindow(CREATESTRUCT&

cs)

cs.style|=WS_POPUP;

//使主窗口不可见

cs.dwExStyle|=WS_EX_TOOLWINDOW;

//不显示任务按钮

returnCFrameWnd:

PreCreateWindow(cs);

  对于其他窗口,可以在窗口被Create出来之后ShowWindow之前使用ModifyStyle()和ModifyStyleEx()来修改它的风格。

  如何控制窗口框架的最大最小尺寸?

  要控制一个框架的的最大最小尺寸,你需要做两件事情。

  第一步:

在CFrameWnd的继承类中处理消息WM_GETMINMAXINFO,结构MINMAXINFO设置了整个窗口类的限制,因此记住要考虑工具条,滚动条等等的大小。

//最大最小尺寸的象素点-示例

#defineMINX200

#defineMINY300

#defineMAXX300

#defineMAXY400

voidCMyFrameWnd:

OnGetMinMaxInfo(MINMAXINFOFAR*lpMMI)

 CRectrectWindow;

 GetWindowRect(&

rectWindow);

 CRectrectClient;

 GetClientRect(&

rectClient);

 //getoffsetoftoolbars,scrollbars,etc.

 intnWidthOffset=rectWindow.Width()-rectClient.Width();

 intnHeightOffset=rectWindow.Height()-rectClient.Height();

 lpMMI->

ptMinTrackSize.x=MINX+nWidthOffset;

ptMinTrackSize.y=MINY+nHeightOffset;

ptMaxTrac

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1