VC编程一些技巧.docx





《VC编程一些技巧.docx》由会员分享,可在线阅读,更多相关《VC编程一些技巧.docx(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、VC编程一些技巧我将一幅图片作为对话框的背景,对话框的大小可以改变,并且可以最大化。这是在下面的代码中实现的:绘制背景图片BOOL CMyDlg:OnEraseBkgnd( CDC* pDC )CDialog:OnEraseBkgnd(pDC);CRect rcClient;GetClientRect(&rcClient);CBitmap mybitmap;mybitmap.LoadBitmap(IDB_BITMAP1);/我的图片BITMAP bmpInfo;mybitmap.GetBitmap(&bmpInfo);CDC dcMem;dcMem.CreateCompatibleDC(pDC
2、);CBitmap *pOldBitmap=dcMem.SelectObject(&mybitmap);pDC-StretchBlt(0, 0,rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCAND );dcMem.SelectObject(pOldBitmap);dcMem.DeleteDC(); 我在对话框上加了两个EDIT BOX控件。我希望改变对话框大小时,控件的大小也改变所以我响应了ON_SIZE消息void CMyDlg:OnSize(UINT nTyp
3、e, int cx, int cy) CDialog:OnSize(nType, cx, cy); / TODO: Add your message handler code hereif(m_myedit1) CRect rc,rc1; RECT re; GetClientRect(&rc); re=rc; m_myedit2.GetRect(&rc1); m_myedit1.MoveWindow(re.left+10,re.top+10, rc.Width()-20,rc.Height()-15-50); m_myedit2.MoveWindow(re.left+10,rc.bottom-
4、40, rc.Width()-20,20); m_edit1=m_edit1+OnSize is executed; UpdateData(FALSE); VC让对话框显示就最大化Mfc 2008-07-17 14:10:04 阅读459 评论0 字号:大中小 订阅 .方法一:在OnInitDialog()函数中 ShowWindow(SW_SHOWMAXIMIZED); 初始化的时候方法二:当然,你可以获取屏幕大小,然后设置窗口位置/大小 /ShowWindow(SW_MAXIMIZE); / 获得屏幕分辨率 HDC hDesktopDC = CreateDC(_T(DISPLAY), NU
5、LL, NULL, NULL); int xScrn = GetDeviceCaps(hDesktopDC, HORZRES); int yScrn = GetDeviceCaps(hDesktopDC, VERTRES); MoveWindow(0, 0, xScrn, yScrn);写OnShowWindows消息响应,调showwindow(SW_SHOWMAXIMIZED)方法三:在DIALOG的OnInitDialog过程中加入 CDialog:OnInitDialog(); SetWindowPos(NULL,0,0,GetSystemMetrics(SM_CXSCREEN),Ge
6、tSystemMetrics(SM_CYSCREEN),0);禁止用鼠标移动窗口的方法(转载) 分类: VC编程技术 2008-04-14 16:25 在CMainFrame中添加消息相应void CMainFrame:OnNcLButtonDown(UINT nHitTest, CPoint point) / TODO: Add your message handler code here and/or call default if (nHitTest = HTCAPTION ) return; CFrameWnd:OnNcLButtonDown(nHitTest, point); BOO
7、L SetWindowPos(HWND hWnd, /窗口句柄HWND hWndInsertAfter, /排列顺序的句柄int X, /水平坐标int Y, /垂直坐标int cx, /宽int cy, /高UINT uFlags /窗口定位标识); 说明:这个函数能改变窗口的大小、位置和设置子窗口、弹出窗口或顶层窗口的排列顺序。 返回值:BOOL,如果返回值非零表示成功,返回零表示失败。错误信息请参看GetLastError函数。参数表:hWnd:欲定位的窗口句柄 hWndInsertAfter:置于hWnd前面的窗口句柄。这个参数必须是窗口的句柄或是下面的值之一: HWND_BOTTOM
8、 将窗口置于其它所有窗口的底部 HWND_NOTOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的后面。如果这个窗口非顶部窗口,这个标记对该窗口并不产生影响 HWND_TOP 将窗口置于它所有窗口的顶部 HWND_TOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的前面。即使这个窗口不是活动窗口,也维持最顶部状态 x:指定窗口新的X坐标Y:指定窗口新的Y坐标 cx:指定窗口新的宽度 cy:指定窗口新的高度 wFlags:UINT,指定窗口状态和位置的标记。这个参数使用下面值的组合: SWP_DRAWFRAME 围绕窗口画一个框 SWP_FRAMECHANGED
9、发送一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有发生改变。如果不指定这个参数,消息WM_NCCALCSIZE只有在窗口大小发生改变时才发送 SWP_HIDEWINDOW 隐藏窗口 SWP_NOACTIVATE 不激活窗口 SWP_NOCOPYBITS 屏蔽客户区域 SWP_NOMOVE 保持当前位置(X和Y参数将被忽略) SWP_NOOWNERZORDER 不改变所有窗口的位置和排列顺序 SWP_NOREDRAW 窗口不自动重画 SWP_NOREPOSITION 与SWP_NOOWNERZORDER标记相同 SWP_NOSENDCHANGING 防止这个窗口接受WM_WIND
10、OWPOSCHANGING消息 SWP_NOSIZE 保持当前大小(cx和cy会被忽略) SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略) SWP_SHOWWINDOW 显示窗口 备注:如果设置了SWP_SHOWWINDOW或SWP_HIDEWINDOW标记,这个窗口不发生移动或改变大小。窗口成为最顶级窗口后,它的所有子窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有子窗口也会转为非最顶级设置对话框背景方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 - 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。
11、 下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: - 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。 - 在CExampleDlgApp :InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( ) CExampleDlgDlg dlg; m_pMainWnd = &dlg; /先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0); int nResponse = dlg.DoMod
12、al(); - 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的 是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变 应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg:OnPaint() if (IsIconic() else CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,255,0);
13、/设置为绿色背景 CDialog:OnPaint(); 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor), 即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): - 在CExampleDlgDlg的头文件中,添加一CBrush的成员变量: class CExampleDlgDlg : public CDialog . protected: CBrush m_brush; . ; - 在OnInitDialog()函数中添加如下代码: BOOL CExampleDlgDlg:OnInitDialog() . / TODO:
14、Add extra initialization here m_brush.CreateSolidBrush(RGB(0, 255, 0); / 生成一绿色刷子 . - 利用ClassWizard重载OnCtlColor(),即WM_CTLCOLOR消息: HBRUSH CExampleDlgDlg:OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) /* * 这里不必编写任何代码! *下行代码要注释掉 * HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); */ return m_bru
15、sh; /返加绿色刷子 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor), 即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): - 步骤、同上方法三中的步骤、。 - 步骤利用ClassWizard重载OnCtlColor()(即WM_CTLCOLOR消息)时则有 些不同: HBRUSH CExampleDlgDlg:OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor
16、); /在这加一条是否为对话框的判断语句 if(nCtlColor =CTLCOLOR_DLG) return m_brush; /返加绿色刷子 return hbr; 1:如何修改单文档应用程序的窗口标题,查阅MSDC文章:Changing the styles of a window created by MFC. 要在CMainFrame的PrecreatWindow()中加入如下代码: cs.style&=FWS_ADDTOTITLE; cs.lpszName=This is a test!; 可以先不要上一句试一试!另一种方法是 : cs.style=WS_OVERLAPPEDWIN
17、DOW;再进行修改,也可以不修改,那么是去掉默认文档标题,而只显示原程序标题! 另一类方法是在窗口创建后再修改,因为在OnCreate中,开始的这些代码: if (CFrameWnd:OnCreate(lpCreateStruct) = -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_wndToolBar.LoadT
18、oolBar (IDR_MAINFRAME) TRACE0(Failed to create toolbarn); return -1; / fail to create if (!m_wndStatusBar.Create(this) | ! m_wndStatusBar.SetIndicators(indicators, sizeof (indicators)/sizeof(UINT) TRACE0(Failed to create status barn); return -1; / fail to create / TODO: Delete these three lines if y
19、ou dont want the toolbar to / be dockable m_wndToolBar.EnableDocking (CBRS_ALIGN_ANY); EnableDocking (CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);完成了窗口创建,工具栏,状态栏的创建等工作,可以在后面利用一个系统全局函数SetWindowLong()函数进行修改:加入代码为:SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);与此相对,还有一个GetWindowLong()函数可供使用!如下面
20、代码去掉了窗口上的最大化按钮:SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & MAXIMIZEBOX);当然SetWindowLon()还可以做别的修改.与SetWindowLong()相类似的另一个系统全局函数为 SetClassLong();2:如何完成一个动画图标其实就是准备好几个图标,在定时器消息 响应中更改图标即可完成.第一步是准备好几个(如三个)图标.第二步是在CMainFrame类中做三个图标类的相关对象的成员变量,或者是一个大小为3的HICON数组.第三步是在CMainFrame类的OnCreat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 编程 一些 技巧

限制150内